如何打开android 打开蓝牙代码蓝牙打印信息

Android蓝牙打印机,带你真正了解各种打印格式 - 简书
Android蓝牙打印机,带你真正了解各种打印格式
注意:本文原创,转载请注明出处。欢迎关注我的
本文主要讲解蓝牙打印机在打印小票的过程中,如何打印各种常见格式。由于之前需要调试打印格式,但是苦于网上没有详细的讲解教程,无奈只能自给自足,自己封装了一个。如果各位盆友正在或者曾经苦恼蓝牙打印机的打印格式,那么恭喜你,本篇博文就是你要寻找的。
什么是蓝牙打印机
是的,你没看错。一开始兔子哥先来介绍一下什么是蓝牙打印机。。。好吧,这个就交给百度了:
蓝牙打印机(Bluetooth printer)就是将蓝牙技术应用在打印机上,摆脱连线所带来的不便,实现无线打印,可以减少桌面上令人不快的电缆,并且可以将打印机远离主机任意搬动,摆放在房间中适合的位置。
常见小票样式
Paste_Image.png
这个小票格式基本就是最常见的了。这里面的各种格式,都可以从蓝牙打印机的API里面找到。蓝牙打印机有好多API,我把常用的给封装了一下:PrintUtils.java
* 复位打印机
public static final byte[] RESET = {0x1b, 0x40};
public static final byte[] ALIGN_LEFT = {0x1b, 0x61, 0x00};
* 中间对齐
public static final byte[] ALIGN_CENTER = {0x1b, 0x61, 0x01};
public static final byte[] ALIGN_RIGHT = {0x1b, 0x61, 0x02};
* 选择加粗模式
public static final byte[] BOLD = {0x1b, 0x45, 0x01};
* 取消加粗模式
public static final byte[] BOLD_CANCEL = {0x1b, 0x45, 0x00};
* 宽高加倍
public static final byte[] DOUBLE_HEIGHT_WIDTH = {0x1d, 0x21, 0x11};
public static final byte[] DOUBLE_WIDTH = {0x1d, 0x21, 0x10};
public static final byte[] DOUBLE_HEIGHT = {0x1d, 0x21, 0x01};
* 字体不放大
public static final byte[] NORMAL = {0x1d, 0x21, 0x00};
* 设置默认行间距
public static final byte[] LINE_SPACING_DEFAULT = {0x1b, 0x32};
打印小票,当然首先需要连接蓝牙打印机。至于如何扫描打印机,如何连接,这个都是标准的蓝牙方式,网上资料也很多。因为本博文主要关注打印格式,所以这个就不再赘述了。连接打印机后,需要从BluetoothSocket中获取OutputStream。然后接下来都是通过OutputStream来给打印机发送打印指令。
设置打印格式设置打印格式,就要用到上面封装的那些指令了。
* 设置打印格式
* @param command 格式指令
public static void selectCommand(byte[] command) {
outputStream.write(command);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
用法如下:
PrintUtils.selectCommand(PrintUtils.RESET);
PrintUtils.selectCommand(PrintUtils.LINE_SPACING_DEFAULT);
PrintUtils.selectCommand(PrintUtils.ALIGN_CENTER);
PrintUtils.selectCommand(PrintUtils.NORMAL);
* 打印文字
* @param text 要打印的文字
public static void printText(String text) {
byte[] data = text.getBytes("gbk");
outputStream.write(data, 0, data.length);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
用法如下:
PrintUtils.printText("好吃的牛肉面" + "\n");
打印文字的时候,最后都要手动拼接一个 "\n" 用来换行。
根据上面封装的代码,“貌似”是可以实现所有的打印样式了。是的,没毛病。因为上面既有打印格式的设置,又有打印文字的用法。打印小票是没问题了。but……
这种格式如何实现?
Paste_Image.png
这种格式呢?
Paste_Image.png
有的盆友可能会说,这有啥问题的??? 并且给出了他们认为完美的解释:
PrintUtils.printText("合计
53.50" + "\n");
PrintUtils.printText("抹零
3.50" + "\n");
PrintUtils.printText("项目
金额" + "\n");
可是,完美吗?你可能觉得人工加空格是可以“实现”需求。but……中间的空格,你知道应该添加多少吗?添加多了或者少了,打印出来的结果都会一塌糊涂!并且注意小票上都是要求对齐的!合计、抹零左侧对齐。金额右侧对齐。项目、数量、金额这三列都要中心对齐。。看到这里,这个人工加空格的做法,还完美吗?
给我一个完美的解释!
“海参炒面,海参呢?给我一个完美的解释!”“我叫海参,面是我炒的。完美不?”
是的,我们需要一个完美的解释。到底如何实现上面说的打印两列、打印三列的情况。首先,讲解之前,先设置几个默认值:
* 打印纸一行最大的字节
private static final int LINE_BYTE_SIZE = 32;
* 打印三列时,中间一列的中心线距离打印纸左侧的距离
private static final int LEFT_LENGTH = 16;
* 打印三列时,中间一列的中心线距离打印纸右侧的距离
private static final int RIGHT_LENGTH = 16;
* 打印三列时,第一列汉字最多显示几个文字
private static final int LEFT_TEXT_MAX_LENGTH = 5;
我们知道,通用的打印纸都是有固定宽度的。经过大量测试,得出打印纸一行的最大字节数是32个字节。那么根据上面的注释,我们可以得到以下结论:
LEFT_LENGTH + RIGHT_LENGTH = LINE_BYTE_SIZE
这是毋庸置疑的。左侧宽度 + 右侧宽度 必须要等于打印纸总宽度。而且因为打印三列的时候,中间一列是要居中显示的,所以LEFT_LENGTH和RIGHT_LENGTH都必须是总宽度32的一半,也就是必须是16.
那么如何计算某个文字所占的字节数呢?
* 获取数据长度
* @param msg
@SuppressLint("NewApi")
private static int getBytesLength(String msg) {
return msg.getBytes(Charset.forName("GB2312")).
OK,准备了这么多,海参终于准备好了。接下来就可以准备炒面了~
* 打印两列
* @param leftText
* @param rightText 右侧文字
@SuppressLint("NewApi")
public static String printTwoData(String leftText, String rightText) {
StringBuilder sb = new StringBuilder();
int leftTextLength = getBytesLength(leftText);
int rightTextLength = getBytesLength(rightText);
sb.append(leftText);
// 计算两侧文字中间的空格
int marginBetweenMiddleAndRight = LINE_BYTE_SIZE - leftTextLength - rightTextL
for (int i = 0; i & marginBetweenMiddleAndR i++) {
sb.append(" ");
sb.append(rightText);
return sb.toString();
那位说话了:“你这代码明明也是手动拼的空格啊,完美个毛啊!”。大兄弟你消消气,这里是通过逻辑进行拼接的空格,不是无脑的拼接。打印两列的步骤如下:
拼接左侧一列的文字
拼接两侧文字中间的空格
拼接右侧一列的文字
关键步骤是计算两侧文字中间的空格。怎么计算呢?很简单,总宽度 - 左侧文字长度 - 右侧文字长度
就是空格的长度。
* 打印三列
* @param leftText
* @param middleText 中间文字
* @param rightText
@SuppressLint("NewApi")
public static String printThreeData(String leftText, String middleText, String rightText) {
StringBuilder sb = new StringBuilder();
// 左边最多显示 LEFT_TEXT_MAX_LENGTH 个汉字 + 两个点
if (leftText.length() & LEFT_TEXT_MAX_LENGTH) {
leftText = leftText.substring(0, LEFT_TEXT_MAX_LENGTH) + "..";
int leftTextLength = getBytesLength(leftText);
int middleTextLength = getBytesLength(middleText);
int rightTextLength = getBytesLength(rightText);
sb.append(leftText);
// 计算左侧文字和中间文字的空格长度
int marginBetweenLeftAndMiddle = LEFT_LENGTH - leftTextLength - middleTextLength / 2;
for (int i = 0; i & marginBetweenLeftAndM i++) {
sb.append(" ");
sb.append(middleText);
// 计算右侧文字和中间文字的空格长度
int marginBetweenMiddleAndRight = RIGHT_LENGTH - middleTextLength / 2 - rightTextL
for (int i = 0; i & marginBetweenMiddleAndR i++) {
sb.append(" ");
// 打印的时候发现,最右边的文字总是偏右一个字符,所以需要删除一个空格
sb.delete(sb.length() - 1, sb.length()).append(rightText);
return sb.toString();
打印三列的步骤如下:
拼接左侧一列的文字
拼接左侧文字和中间文字中间的空格
拼接中间的文字
拼接右侧文字和中间文字中间的空格
拼接右侧一列的文字
在计算空格的时候,为了保证中间一列始终保持中心线对齐,所以在计算中间文字长度时候,都除以2。
完整打印代码
PrintUtils.selectCommand(PrintUtils.RESET);
PrintUtils.selectCommand(PrintUtils.LINE_SPACING_DEFAULT);
PrintUtils.selectCommand(PrintUtils.ALIGN_CENTER);
PrintUtils.printText("美食餐厅\n\n");
PrintUtils.selectCommand(PrintUtils.DOUBLE_HIGHT_WIDTH);
PrintUtils.printText("桌号:1号桌\n\n");
PrintUtils.selectCommand(PrintUtils.NORMAL);
PrintUtils.selectCommand(PrintUtils.ALIGN_LEFT);
PrintUtils.printText(PrintUtils.printTwoData("订单编号", "\n"));
PrintUtils.printText(PrintUtils.printTwoData("点菜时间", " 10:46\n"));
PrintUtils.printText(PrintUtils.printTwoData("上菜时间", " 11:46\n"));
PrintUtils.printText(PrintUtils.printTwoData("人数:2人", "收银员:张三\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.selectCommand(PrintUtils.BOLD);
PrintUtils.printText(PrintUtils.printThreeData("项目", "数量", "金额\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.selectCommand(PrintUtils.BOLD_CANCEL);
PrintUtils.printText(PrintUtils.printThreeData("面", "1", "0.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("米饭", "1", "6.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("铁板烧", "1", "26.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("一个测试", "1", "226.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("牛肉面啊啊", "1", "2226.00\n"));
PrintUtils.printText(PrintUtils.printThreeData("牛肉面啊啊啊牛肉面啊啊啊", "888", "98886.00\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.printText(PrintUtils.printTwoData("合计", "53.50\n"));
PrintUtils.printText(PrintUtils.printTwoData("抹零", "3.50\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.printText(PrintUtils.printTwoData("应收", "50.00\n"));
PrintUtils.printText("--------------------------------\n");
PrintUtils.selectCommand(PrintUtils.ALIGN_LEFT);
PrintUtils.printText("备注:不要辣、不要香菜");
PrintUtils.printText("\n\n\n\n\n");
Paste_Image.png
学习了上面的打印格式,那么这个小票怎么打印? 区别就是打印三列的时候,中间一列是偏右了。相信大家应该知道答案了。如果有疑问,可以给我留言。
鉴于好多读者给我留言,要PrintUtils工具类代码,所以我把代码发布到github上了,大家可以自行下载。地址是:
如果有帮助到你,可以顺手来个star 。万分感谢!
追求超越,成功会不期而至。享受过程,结果将水到渠成。蓝牙打印机如何打二维码
共找到 <font color="#FF 条 android
蓝牙打印机如何打二维码
Android,Android开发,宁波Android架构应用开发实战培训,北京,北京,丰台
安卓 RFID,Android,rfid平板,android平板,Android安卓RFID平板 条码扫描,广东,深圳,龙岗
Android,平板电脑,供应Android 操作系统ARM架构平板电脑,广东,深圳,福田
高清,Android,智能,供应PADMID i5 7寸高清Android智能,广东,深圳,福田
Android平板电,Android平板电脑,EPAI平板电脑,广东,深圳,福田
安卓打印机,android蓝牙打印机,android,广东,深圳,宝安
云浮Android开,云浮Android开发培训,真心推荐华中,广东,东莞
揭阳Android开,揭阳Android开发培训,真心推荐华中,广东,东莞
潮州Android开,潮州Android开发培训,真心推荐华中,广东,东莞
中山Android开,中山Android开发培训,真心推荐华中,广东,东莞
东莞Android开,东莞Android开发培训,真心推荐华中,广东,东莞
清远Android开,清远Android开发培训,真心推荐华中,广东,东莞
阳江Android开,阳江Android开发培训,真心推荐华中,广东,东莞
河源Android开,河源Android开发培训,真心推荐华中,广东,东莞
汕尾Android开,汕尾Android开发培训,真心推荐华中,广东,东莞
梅州Android开,梅州Android开发培训,真心推荐华中,广东,东莞
惠州Android开,惠州Android开发培训,真心推荐华中,广东,东莞
肇庆Android开,肇庆Android开发培训,真心推荐华中,广东,东莞
蓝牙打印机如何打二维码供应分类导航
运动护具相关类别
相关分类导航:扫码关注博主微信
Android:Bluetooth 的打开和关闭
18,793 次 /
摘要:Android 中打开和关闭 Bluetooth 的代码虽然并不困难,但是我们还是需要注意一些细节和异常情况,这样我们才能更好的优化我们的与 Bluetooth 相关的应用。
Runtime Environment
OS: Windows 8.1
IDE: ADT Bundle v22.6.2
Nexus 5 / Android 4.4.4
MI 2SC / MIUI-4.7.11 (Android 4.1.1 JRO03L)
Android 中打开和关闭 Bluetooth 的代码虽然并不困难,但是我们还是需要注意一些细节和异常情况,这样我们才能更好的优化我们的与 Bluetooth 相关的应用。
在研究打开和关闭 Bluetooth 之前,我们应该了解 Android 版本和 Bluetooth 版本之间的关系,请参考本博客文章 。
Android 在 Android 2.0 Eclair / API Level 5 中就已经有开放的操作 Bluetooth 的 API 了,在此版本已经有以下公开类:
* 本地 Bluetooth 适配器,执行基本的 Bluetooth 任务,例如:初始设备扫描、查询已经绑定
* (或已经配对)的设备、通过已知的 MAC 地址来实例化 BluetoothDevice 对象、创建
* BluetoothServerSocket 来监听其它设备的连接请求等。
BluetoothAdapter.java
* 描述设备的一般特性和能力。例如,它会指定一般设备类型,例如:手机、电脑、耳机等,还
* 有是否支持音频或电话等服务。但是不能可靠的描述诸如设备支持哪些 Profile 或者 Service。
BluetoothClass.java
* 表示一个远程的 Bluetooth 设备。它能让你与各个设备创建连接或者查询信息。
* 例如:名字、地址、类和绑定状态等。
BluetoothDevice.java
* Bluetooth socket 和 TCP socket 有些类似。最普通的 Bluetooth socket 类型是 RFCOMM,
* 这是 Android API 支持的类型。RFCOMM 是一个方向性的连接。通过 Bluetooth 传输流。
* 同样也称作 SPP (Serial Port Profile)。
BluetoothServerSocket.java
BluetoothSocket.java
Android 中打开 Bluetooth:有以下三种方法:
1.强制打开
2.调用系统弹出框提示用户打开
3.跳转到系统设置中让用户自己打开
1.强制打开 Bluetooth 的代码:
BluetoothAdapter.getDefaultAdapter() 需要注册权限:
&uses-permission android:name=&android.permission.BLUETOOTH& /&
BluetoothAdapter.enable() 需要注册权限:
&uses-permission android:name=&android.permission.BLUETOOTH_ADMIN& /&
* Bluetooth 管理类
* @author ifeegoo
public class BluetoothManager
* 当前 Android 设备是否支持 Bluetooth
* @return true:支持 Bluetooth false:不支持 Bluetooth
public static boolean isBluetoothSupported()
return BluetoothAdapter.getDefaultAdapter() != null ? true :
* 当前 Android 设备的 bluetooth 是否已经开启
* @return true:Bluetooth 已经开启 false:Bluetooth 未开启
public static boolean isBluetoothEnabled()
BluetoothAdapter bluetoothAdapter = BluetoothAdapter
.getDefaultAdapter();
if (bluetoothAdapter != null)
return bluetoothAdapter.isEnabled();
* 强制开启当前 Android 设备的 Bluetooth
* @return true:强制打开 Bluetooth 成功 false:强制打开 Bluetooth 失败
public static boolean turnOnBluetooth()
BluetoothAdapter bluetoothAdapter = BluetoothAdapter
.getDefaultAdapter();
if (bluetoothAdapter != null)
return bluetoothAdapter.enable();
以上强制打开 Bluetooth 是调用了 BluetoothAdapter.enable() 方法。首先需要获取 BluetoothAdapter 对象,如果这个对象为 null 的话,说明当前设备不支持 Bluetooth 功能。还有以下几点需要注意:
1° 在 Nexus 5 Android 4.4.4 原生系统中,在没有任何其它管理 Bluetooth 权限的应用情况下,调用强制打开 Bluetooth 的方法,没有任何提示就直接打开 Bluetooth 了。
2° 在小米手机 MI 2SC / MIUI-4.7.11 (Android 4.1.1 JRO03L) 上系统自带的 “安全中心” &#8211; “应用权限管理” &#8211; “开启蓝牙” 中,有三种设置:
允许:调用强制打开 Bluetooth 代码,没有任何提示,Bluetooth 被成功打开。
提示:会弹出提示框,提示安全警告 “ ***应用尝试开启蓝牙”,可以选择“拒绝”或“允许”,还有记住此次选择(备注:如果不记住的话,下次还会弹出同样的提示框,除非你自己去修改了应用开启蓝牙的权限)。
拒绝:调用强制打开 Bluetooth 代码,没有任何提示,Bluetooth 强制打开失败。
备注:各种手机自带的权限管理功能或者第三方权限管理应用略有不同。
3° 对于 BluetoothAdapter.enable() 这个方法,API 中有以下说明 (备注:初始 API 中,如 Android 2.0 Eclair / API Level 5 中并没有这段提示)
Bluetooth should never be enabled without direct user consent. If you want to turn on Bluetooth in order to create a wireless connection, you should use the ACTION_REQUEST_ENABLE Intent, which will raise a dialog that requests user permission to turn on Bluetooth. The enable() method is provided only for applications that include a user interface for changing system settings, such as a &#8220;power manager&#8221; app.
没有直接的用户的允许绝不要开启 Bluetooth。如果你想要打开 Bluetooth 创建一个无线连接,你应当使用 ACTION_REQUEST_ENABLE
Intent,这样会弹出一个提示框提示用户是否开启 Bluetooth,enable() 方法仅提供给有 UI 、更改系统设置的应用来使用,例如“电源管理”应用。
从以上官方 API 提示可以看出:不建议你调用此方法来打开 Bluetooth,至少是在没有任何用户提醒的前提下!
2.调用系统弹出框提示用户打开:
this.startActivityForResult(requestBluetoothOn, REQUEST_CODE_BLUETOOTH_ON) 需要注册权限:
&uses-permission android:name=&android.permission.BLUETOOTH& /&
public class MainActivity extends Activity
* 自定义的打开 Bluetooth 的请求码,与 onActivityResult 中返回的 requestCode 匹配。
private static final int REQUEST_CODE_BLUETOOTH_ON = 1313;
* Bluetooth 设备可见时间,单位:秒。
private static final int BLUETOOTH_DISCOVERABLE_DURATION = 250;
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
if ((BluetoothManager.isBluetoothSupported())
&& (!BluetoothManager.isBluetoothEnabled()))
this.turnOnBluetooth();
* 弹出系统弹框提示用户打开 Bluetooth
private void turnOnBluetooth()
// 请求打开 Bluetooth
Intent requestBluetoothOn = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
// 设置 Bluetooth 设备可以被其它 Bluetooth 设备扫描到
requestBluetoothOn
.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
// 设置 Bluetooth 设备可见时间
requestBluetoothOn.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
BLUETOOTH_DISCOVERABLE_DURATION);
// 请求开启 Bluetooth
this.startActivityForResult(requestBluetoothOn,
REQUEST_CODE_BLUETOOTH_ON);
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// requestCode 与请求开启 Bluetooth 传入的 requestCode 相对应
if (requestCode == REQUEST_CODE_BLUETOOTH_ON)
switch (resultCode)
// 点击确认按钮
case Activity.RESULT_OK:
// TODO 用户选择开启 Bluetooth,Bluetooth 会被开启
// 点击取消按钮或点击返回键
case Activity.RESULT_CANCELED:
// TODO 用户拒绝打开 Bluetooth, Bluetooth 不会被开启
对于以上弹出系统弹框提示用户打开 Bluetooth 的代码,有以下几点需要注意:
1° 这种调用系统的弹出框提示用户打开 Bluetooth 的方式,一般不会受到系统或者第三方权限管理应用的阻止。只有当你不提示用户的情况下,可以理解为“偷偷摸摸”的打开 Bluetooth ,这个是被认为侵犯用户的知情权,系统或者第三方权限管理应用可能加以阻止:直接禁止不提示用户的情况下打开 Bluetooth,或者提示用户,又或者是让用户自己选择哪些应用可以强制开启 Bluetooth。而在 Nexus 5 / Android 4.4.4 原生系统强制打开 Bluetooth 是没有任何提示,并且可以成功打开。
2° 弹出系统的提示框提醒用户打开 Bluetooth 的主要代码:
this.startActivityForResult(requestBluetoothOn,REQUEST_CODE_BLUETOOTH_ON);
注意:这个方法是需要 Activity 的对象来调用的!并且需要在 Activity 中重写 onActivityResult 方法来获取用户操作弹出提示框的结果!
3° 这种弹出的系统弹框,根据系统的不同,UI 会有所不同,下图左边是 Nexus 5 Android 4.4.4 系统手机显示效果,右边是小米手机 MI 2SC / MIUI-4.7.11 (Android 4.1.1 JRO03L) 系统显示的效果:
4° 如果你只设置了 Bluetooth 设备的可见时间,而不去调用 setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE) 方法的话,Bluetooth 依然是不可见的。你设置的 Bluetooth 的可见时间是不生效的,当前 Android 系统的 Bluetooth 不可见!
5° 设置 Bluetooth 设备的可见时间的时候,在 Android 4.4.2 官方 API 中的说明如下:
The current default is 120 seconds, and requests over 300 seconds will be capped. These values could change.
当前默认值是 120s ,300s 是上限。这些值可能会变。
目前测试出来的有以下结论:
&#8212; 可设置的可见时间为 [1,3600] s ,也就是最小1秒钟,最大1个小时。
&#8212; 设置的可见时间为 0 时,表示打开 Bluetooth 之后一直可见,设置小于0或者大于3600 时,系统会默认为 120s。
6° 如果你设备的 Bluetooth 已经打开,而且你不设置设备的可见时间的话,调用以上开启 Bluetooth 的方法,是不会有任何提示的。当然,如果 Bluetooth 已经开启,也可以通过这个方法来修改 Bluetooth 的可见性。
3.跳转到系统设置中让用户自己打开:
// 跳转到系统 Bluetooth 设置
this.startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
考虑到涉及用户隐私和用户体验,推荐以下方式开启 Bluetooth :
1° 采用强制开启 Bluetooth 的方式打开 Bluetooth ,但是调用强制开启 Bluetooth 代码之前,我们自己在应用中提示用户,我们的应用需要开启 Bluetooth ,让用户自己选择是否开启 Bluetooth 。自己在应用中提示用户我们需要开启 Bluetooth 相对于弹出系统的提示框提示用户当前应用需要开启 Bluetooth 的优势在于我们可以控制提示的内容和提示的方式以及 UI。
2° 假若用户选择了开启 Bluetooth,但是强制开启 Bluetooth 失败,比如系统自带的权限管理禁止你的应用开启 Bluetooth ,我们不去提示用户说当前系统禁止了应用开启 Bluetooth,让用户自己去解除禁止。这样显然用户体验很差。这种情况下,我们再去调用弹出系统提示框提醒用户打开 Bluetooth 即可。这种方式一般系统或者第三方应用不会禁止。
3° 如果弹出系统提示框提醒用户打开 Bluetooth 有问题的话,最后采用提示用户自己去系统 Bluetooth 设置中打开 Bluetooth,跳转到系统的 Bluetooth 设置界面。
Android 中关闭 Bluetooth:有以下俩种方法:
1.强制关闭
2.跳转到系统设置中让用户自己关闭
1.强制关闭:
BluetoothAdapter.getDefaultAdapter() 需要注册权限:
&uses-permission android:name=&android.permission.BLUETOOTH& /&
BluetoothAdapter.disable() 需要注册权限:
&uses-permission android:name=&android.permission.BLUETOOTH_ADMIN& /&
* Bluetooth 管理类
* @author ifeegoo
public class BluetoothManager
* 当前 Android 设备是否支持 Bluetooth
* @return true:支持 Bluetooth false:不支持 Bluetooth
public static boolean isBluetoothSupported()
return BluetoothAdapter.getDefaultAdapter() != null ? true :
* 当前 Android 设备的 bluetooth 是否已经开启
* @return true:Bluetooth 已经开启 false:Bluetooth 未开启
public static boolean isBluetoothEnabled()
BluetoothAdapter bluetoothAdapter = BluetoothAdapter
.getDefaultAdapter();
if (bluetoothAdapter != null)
return bluetoothAdapter.isEnabled();
* 强制开启当前 Android 设备的 Bluetooth
* @return true:强制打开 Bluetooth 成功 false:强制打开 Bluetooth 失败
public static boolean turnOnBluetooth()
BluetoothAdapter bluetoothAdapter = BluetoothAdapter
.getDefaultAdapter();
if (bluetoothAdapter != null)
return bluetoothAdapter.enable();
* 强制关闭当前 Android 设备的 Bluetooth
true:强制关闭 Bluetooth 成功 false:强制关闭 Bluetooth 失败
public static boolean turnOffBluetooth()
BluetoothAdapter bluetoothAdapter = BluetoothAdapter
.getDefaultAdapter();
if (bluetoothAdapter != null)
return bluetoothAdapter.disable();
以上强制关闭 Bluetooth 是调用了 BluetoothAdapter.disable() 方法。首先需要获取 BluetoothAdapter 对象,如果这个对象为 null 的话,说明当前设备不支持 Bluetooth 功能。还有以下几点需要注意:
1° 目前发现常见的系统或者第三方权限管理应用好像对关闭 Bluetooth 并不做限制。
2° 如果系统或者第三方权限管理应用限制你的应用关闭 Bluetooth 的话,请参考强制开启 Bluetooth 要注意的点 1° 和 2°。
3° 对于 BluetoothAdapter.disable() 这个方法,API 中有以下说明 (备注:初始 API 中,如 Android 2.0 Eclair / API Level 5 中并没有这段提示)
Bluetooth should never be disabled without direct user consent. The disable() method is provided only for applications that include a user interface for changing system settings, such as a &#8220;power manager&#8221; app.
没有直接的用户的允许绝不要关闭 Bluetooth。disable() 方法仅提供给有 UI 、更改系统设置的应用来使用,例如“电源管理”应用。
从以上官方 API 提示可以看出:不建议你调用此方法来关闭 Bluetooth,至少是在没有任何用户提醒的前提下!
2.跳转到系统设置中让用户自己关闭:
// 跳转到系统 Bluetooth 设置
this.startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
考虑到涉及用户隐私和用户体验,推荐以下方式关闭 Bluetooth :
1° 采用强制关闭 Bluetooth 的方式关闭 Bluetooth ,但是调用强制关闭 Bluetooth 代码之前,我们自己在应用中提示用户,我们的应用需要关闭 Bluetooth ,让用户自己选择是否关闭 Bluetooth 。自己在应用中提示用户我们需要关闭 Bluetooth ,暂时没有发现 Android 有提供了弹出系统提示框提示用户关闭 Bluetooth 的 API。
2° 假若用户选择了关闭 Bluetooth,但是强制关闭 Bluetooth 失败,比如系统自带的权限管理禁止你的应用关闭 Bluetooth ,我们不去提示用户说当前系统禁止了应用关闭 Bluetooth,让用户自己去解除禁止。这样显然用户体验很差。这种情况下,我们提示用户“由于某些原因导致应用关闭 Bluetooth 失败,请到系统设置中自己关闭 Bluetooth”,然后跳转到系统 Bluetooth 设置中。
好久没有更新这篇文章了,在网站统计后台这篇文章的流量一直都是在我博客中算比较大的,被搜索引擎索引的比较靠前。目前在 Android 6.0 之后,我们需要注意的就是蓝牙权限的处理,这个细节需要注意下。最近一直很忙,没有时间更新,但是希望追加一些提醒,给看到我这篇文章的人更多的帮助!
微信扫一扫,打赏作者吧~
本博客所有文章如无特别注明均为原创。复制或转载请以超链接形式注明转自,原文地址《》
上一篇: &
摘要:Android 版本与 Bluetooth 版本之间是否存在必然关系?答案是否定的。不同版本的 Android 系统是否有针对不同版本的 Bluetooth 模块提供官方的 API 供开发者调用,这个才是关键。
8,217 次 /
& 添加新评论
Copyright &

我要回帖

更多关于 android 蓝牙打印小票 的文章

 

随机推荐