AndroidUSB热敏打印机使用动态申请权限绕过系统权限对话框

最近在做超市收银系统,需要使用热敏打印机打印小票,记录一下踩过的坑。公司使用的是佳维视智能收银机与芯烨XP-D610L热敏打印机。

在Android中打印机属于外设,在使用时需要申请权限。在网上找了资料,大多使用静态申请权限,在清单文件中与对应的activity中直接绑定。但是使用静态注册会导致收银机开机便弹出对话框询问用户是否同意打印权限,如果用户选中默认使用该权限又会开机自启动APP(不知道是不是只有这个机型会,网上没有这方面的记录,本人又只有这个机型测试)。这就很影响用户体验了,自启动还会与双屏异显的功能冲突。想了下使用动态申请权限是不是就不会了呢,查阅了多方资料,使用动态申请权限加自定义广播接收权限申请并处理,解决问题。

一、静态申请权限

也做个记录吧。

1.清单文件

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-feature android:name="android.hardware.usb.host" android:required="true"/>。。。。。。<activityandroid:name=".SplashActivity"><intent-filter><action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /></intent-filter><meta-dataandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/print_device_filter" />
</activity>

2.print_device_filter.xml

清单文件中print_device_filter.xml记录打印机VendorID与ProductId,在res中新建xml文件夹再新建一个xml文件。

<resources><usb-device vendor-id="8137" product-id="8214" />
</resources>

关于静态申请权限记录到这里,下面进入正题。

二、动态申请权限

直接记录整个实现方案吧。

1.取连接到设备上的USB设备集合

// 取连接到设备上的USB设备集合
usbManager = (UsbManager) activity.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> map = usbManager.getDeviceList();
// 没有连接设备
if (map.isEmpty()){return;
}

2.遍历集合取指定的USB设备

根据WendorId与ProductID过滤设备得到我们的热敏打印机(型号不一样id也不一样)

// 遍历集合取指定的USB设备
UsbDevice usbDevice = null;
for(UsbDevice device : map.values()){// 芯烨  XP-D610L 的 VendorID = 8137 , ProductID = 8214int VendorID = device.getVendorId();int ProductID = device.getProductId();if(VendorID == 8137 && ProductID == 8214){usbDevice = device;break;}}// 没有找到设备if(usbDevice == null){//ToastUtil.showToast(activity, activity.getString(R.string.no_connect_usb));return;
}

3.判断是否有权限操作打印机

这里便是使用了动态申请权限,如果使用静态注册只要把里面的权限申请语句去掉就行

if(!usbManager.hasPermission(usbDevice)){usbManager.requestPermission(usbDevice, mPermissionIntent);return;
}

4.建立连接通道

// 设备接口, 注意设备不同接口不同, 这里取第一个
UsbInterface usbInterface = usbDevice.getInterface(0);
// 分配端点, 注意设备不同端点不同, 这里取第一个
outEndpoint = usbInterface.getEndpoint(0);
// 打开设备建立连接
connection = usbManager.openDevice(usbDevice);
connection.claimInterface(usbInterface, true);

5.自定义广播

如果使用静态注册,也不需要这个

private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_USB_PERMISSION.equals(action)) {synchronized (this) {UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {if(device != null){//call method to set up device communication// 设备接口, 注意设备不同接口不同, 这里取第一个UsbInterface usbInterface = device.getInterface(0);// 分配端点, 注意设备不同端点不同, 这里取第一个outEndpoint = usbInterface.getEndpoint(0);// 打开设备建立连接connection = usbManager.openDevice(device);connection.claimInterface(usbInterface, true);}}}}//当打印机连接上时自动申请权限else if (ACTION_USB_DEVICE_ATTACHED.equals(action)) {UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {Toast.makeText(activity, "连接USB", Toast.LENGTH_LONG).show();getUsbPrinterUtils(activity);}}else if (ACTION_USB_DEVICE_DETACHED.equals(action)) {UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {Toast.makeText(activity, "断开USB", Toast.LENGTH_LONG).show();colose();}}}};

6.不要打印时关闭连接

if(connection != null){connection.close();
}

OK,打印机设置完成了,接下去就只要根据打印机指令进行打印即可。

这里有完整demo

AndroidUSB热敏打印机使用动态申请权限绕过系统权限对话框相关推荐

  1. Oracle 用户、对象权限、系统权限

    一.用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联的所有对象SYSTEM用户,缺省始终创建,且未 ...

  2. Oracle的对象权限、角色权限、系统权限

    Oracle的对象权限.角色权限.系统权限 一.用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作 SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联 ...

  3. android位置权限动态申请,DELPHI安卓定位权限申请

    DELPHI安卓定位权限申请 安卓8及以后版本的权限分为静态和动态申请2部分,而之前的安卓版本只需要静态申请权限. 1)静态申请定位权限: 2)动态申请定位权限: uses System.Permis ...

  4. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )

    文章目录 一.Linux 权限简介 二.系统权限 / 用户权限 / 匿名用户权限 1.系统权限 2.用户权限 3.匿名用户权限 一.Linux 权限简介 Linux 是基于文件的系统 , 内存 , 设 ...

  5. Oracle中对象权限与系统权限revoke

    实验: 1.以sys登陆,创建用户test1, test2: 2.授予test1系统权限(带admin option)-connect,授予test1对象权限(带grant option)-selec ...

  6. Unity2019中的android动态申请权限(Permissions)

    请使用最新文章: Unity2022中的android权限处理(Permissions) 动态权限,权限弹窗 注意事项: 1.因为新规等因素需要提前弹出游戏自己的权限描述界面 2.玩家连续多次拒绝权限 ...

  7. AndroidStudio_安卓原生开发_蓝牙连接设备需要动态申请位置权限---Android原生开发工作笔记137

    android 6.0 以后,搜索蓝牙设备,打开蓝牙,除了需要蓝牙权限以外, <!--蓝牙权限--> <uses-permission android:name="andr ...

  8. flutter ios permission_handle权限动态申请

    文章目录 配置 permission_handle Android项目 IOS项目 代码 网上都是针对安卓的教程,以下是作者使用Flutter打包在iphone上运行动态申请权限的实战记录. 项目在: ...

  9. Android6.0------权限申请管理(单个权限和多个权限申请)

    2019独角兽企业重金招聘Python工程师标准>>> Android开发时,到6.0系统上之后,有的权限就得申请才能用了. Android将权限分为正常权限 和 危险权限 Andr ...

最新文章

  1. 判断一个IP区间(或IP)是否被另一个IP区间所包含
  2. 采用矩阵+深度优先算法解决迷宫问题
  3. UML类关系(依赖,关联,聚合,组合,泛化,实现)
  4. python中异常的处理及断言,包括异常类型、异常捕获、主动跑出异常和断言
  5. renameto 阻塞_打造简化版文件下载器
  6. UI debug mode
  7. USACO 6.1.3 Cow XOR
  8. ubuntu中将git 提交编译器nano 修改为vim
  9. 02: DOM 实例
  10. 数据库,规则库和知识库的比较
  11. 天翼网关-无线光纤猫的设置和有WIFI信号无网络问题排查与解决
  12. 【项目篇- 项目团队部分怎么写、如何作图?(两千字图文总结建议)】创新创业竞赛项目计划书、新苗国创(大创)申报书、挑战杯创业计划竞赛
  13. 银行业保险业数字化转型指导意见下发,IT 基础架构团队如何应对挑战?
  14. webqq协议分析之~~~~登陆
  15. html QQ空间留言版,qq空间留言
  16. pythonpdf识别文字_python – 从PDF中读取字体颜色信息
  17. 极米H5搭载全新CCB流明,树电影色彩亮度新标杆
  18. itext文本域自动换行_iText+Flying Saucer生成pdf文档,中文不显示和不自动换行问题...
  19. 贝叶斯网络(BN)的理解
  20. android系统应用的平台化开发

热门文章

  1. android日历提醒之简单实用
  2. python实现:提取文件夹中子文件夹的图片
  3. 计算机计划300字作文,计划作文300字四篇
  4. 使用python写一个可以控制GTA5游戏角色移动
  5. 【112】生活新体验
  6. java arraycopy()方法_Java学习之System.arraycopy()方法
  7. C语言_算法_输入两个正整数m和n,求其最大公约数与最小公倍数
  8. Linux下访问小米路由器文件
  9. 苹果怎么换字体_换手机了,怎么把安卓手机便签内容快速移到苹果手机里 - 学显...
  10. 1 RSA host key for xxx has changed and you have requested strict checking