USB android授权方式

权限的控制分三块:

1:USB host端有个线程循环检测系统是否USB设备插拔,如果有就找到申请权限的APP并调用起来

2:APP运行后主动申请权限,也就是requestPermission()接口

3:APP运行后直接打开USB设备,这时候USB host端会去检测APP是否已经有控制权限了,也就是调用的hasPermission()接口

第一种方式主要是再设计app 时候,能通过系统intent filter , 进行启动某个activity

第二种方式主要是设计app已经启动,再使用usb 的使用进行动态注册,申请权限

第三中跟第二种类似,是再open device 时候进行申请权限, 可以hasPermission 授权

第一种:

systemReady -> UsbHostManager.java

monitorUsbHostBus ->

android_server_UsbHostManager_monitorUsbHostBus -> android_server_UsbHostManager.cpp

usb_host_run -> Usbhost.c

usb_host_read_event ->

context->cb_added -> //有usb设备添加

usb_device_added ->

env->CallVoidMethod -> //对方方法method_endUsbDeviceAdded  --> endUsbDeviceAdded

endUsbDeviceAdded -> UsbHostManager.java

getCurrentSettings().deviceAttached ->

deviceAttached -> UsbSettingsManager.java

resolveActivity ->

resolveActivity ->

mUserContext.startActivityAsUser //包名是com.android.systemui.usb.UsbConfirmActivity

onCreate -> UsbConfirmActivity.java

setupAlert //弹出权限确认对话框

第二种:

requestPermission -> UsbManager.java

mService.requestDevicePermission ->

requestDevicePermission -> UsbService.java

getSettingsForUser(userId).requestPermission ->

requestPermission -> UsbSettingsManager.java

requestPermissionDialog ->

mUserContext.startActivityAsUser //包名com.android.systemui.usb.UsbPermissionActivity

onCreate -> UsbPermissionActivity.java

setupAlert //弹出权限确认对话框

第三种:

openDevice -> UsbService.java

mHostManager.openDevice ->

openDevice -> UsbHostManager.java

getCurrentSettings().checkPermission ->

hasPermission UsbSettingsManager.java

第一种方式问题及处理方法

APP : 设计插入启动activity, 下面是静态注册:

图片.png

动态注册:

@Override

public void registerReceiver() {

IntentFilter mUsbDeviceFilter = new IntentFilter();

mUsbDeviceFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);

mUsbDeviceFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);

mUsbDeviceFilter.addAction(ACTION_USB_PERMISSION);

mContext.registerReceiver(this,mUsbDeviceFilter);

}

1-声明 为android.hardware.usb.host

2-如果你的APP想要在有USB device插入时能够被调用起来,那么必须要在xml的Activity中申请权限android.hardware.usb.action.USB_DEVICE_ATTACHED

3-如果只关心某些设备,可以通过里配置一个xml文件来做过滤

如果不想弹出权限:

diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java

index 3eccccd..18130ab 100644

--- a/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java

+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java

@@ -99,6 +99,11 @@ public class UsbConfirmActivity extends AlertActivity

setupAlert();

+ if (mResolveInfo.activityInfo.packageName.equals("ai.xxxx.xxx")) {

+ Log.d(TAG, "UsbConfirmActivity enable Usb permission for ai.xxxx.xxx");

+ onClick(this, AlertDialog.BUTTON_POSITIVE);

+ }

}

第二、三种流程及问题处理方法

详细流程:

图片.png

新建activity,获取UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE)

获取所以的USB设备HashMap map = usbManager.getDeviceList()

过滤别的USB设备,拿到自己USB的USBDevice类,然后请求USB权限,usbManager.requestPermission(usbDevice, pendingIntent);并注册一个回调意图,用来判断用户是否授予权限

UsbManager类的requestPermission方法会调用mService. requestDevicePermission

在requestDevicePermission方法里面调用的getSettingsForUser(userId).requestPermission

getSettingsForUser(userId)其实是去获取UsbUserSettingsManager实例,所以是调用的UsbUserSettingsManager的requestPermission方法

在requestPermission方法里面首先会进行判断是否拥有USB权限,如果有就回调广播直接return返回的。如果没有那就判断是否有相机权限,如果没有权限回调广播直接return的。注意从始至终是没有发送用户拒绝的广播的

接着会调用自身的requestPermissionDialog方法,在requestPermissionDialog方法里面又会去调用mUsbPermissionManager.requestPermissionDialog方法

10.最终在UsbPermissionManager类的requestPermissionDialog方法中调用startActivityAsUser 启动UsbPermissionActivity权限申请对话框

11.监听弹出权限对话框的onclick方法,如果点击的授权,那就在UsbPermissionActivity的onDestory里面回调最开始的广播,通知我们的应用,用户授予的权限。

实例:

如果对usb 授权,需要知道vid pid

android/frameworks/base/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java

public boolean hasPermission(UsbDevice device) {

synchronized (mLock) {

int uid = Binder.getCallingUid();

if (uid == Process.SYSTEM_UID || mDisablePermissionDialogs) {

return true;

}

+ if( vid&& pid == true) {

+ String deviceName = device.getDeviceName();

+ Slog.d(TAG, "customer uid:"+uid+"deviceName:"+deviceName);

+ SparseBooleanArray uidList = mDevicePermissionMap.get(deviceName);

+ if (uidList == null) {

+ uidList = new SparseBooleanArray(1);

+ mDevicePermissionMap.put(deviceName, uidList);

+ }

+ uidList.put(uid, true);

+ }

SparseBooleanArray uidList = mDevicePermissionMap.get(device.getDeviceName());

if (uidList == null) {

return false;

}

return uidList.get(uid);

}

}

android 申请usb权限,USB 权限申请流程相关推荐

  1. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )

    文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...

  2. Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

    Android PermissionUtils:运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6 Permis ...

  3. android权限申请方法,安卓开发Android6+权限申请管理用户拒绝权限一键解决方案...

    问题: android 开发中,权限是一个重要的环节,不可避免的环节.尤其是刚入行的小白们,认为在配 AndroidManifest 中加入权限表就万事大吉. 没想自己测试时还是正常,打包发布别人安装 ...

  4. Android权限 权限等级 普通权限 敏感权限 申请权限

    权限等级 Android权限分为两种,normal和dangerous.normal为普通权限,不需要程序动态申请,在Manifest中声明就可以.dangerous为敏感权限,需要程序动态申请. 普 ...

  5. 【Android 应用开发】动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )

    文章目录 一.申请权限 二.判定权限申请结果 三.判定 " 不再询问 " 情况 四.完整代码示例 1.权限管理代码 2.主界面代码 3.执行结果 五.博客资源 一.申请权限 首先 ...

  6. android 6.0权限封装,Android6.0------权限申请管理(单个权限和多个权限申请)

    Android开发时,到6.0系统上之后,有的权限就得申请才能用了. Android将权限分为正常权限 和 危险权限 Android系统权限分为几个保护级别.需要了解的两个最重要保护级别是 正常权限  ...

  7. jira使用教程pdf_需要申请项目?需要开通权限?需要创建流程?刚需教程安排上了!...

    关注我,分享给你更多技能 经常有小伙伴问道,申请项目该如何申请?需要某个项目或者空间的权限怎么申请?项目的流程想要IT化自动流转找谁申请?本篇内容依然是手把手教学! 参考这个指南以后碰到这些问题也不会 ...

  8. android 6.0 数据库权限,Android超清晰6.0权限申请AndPermission

    Android超清晰6.0权限申请AndPermission的具体实现代码,供大家参考,具体内容如下 前言 这是我经常使用的框架,原因: 1.思路清晰 2.实现方便 开始 准备工作 导包 compil ...

  9. android申请蓝牙的权限,Android Studio 真机调试捕获异常申请和蓝牙权限代码

    Android Studio 真机调试捕获异常申请和蓝牙权限代码 第一步: 在Android的manifest.xml文档中加入下面的声明: android:name="android.ha ...

最新文章

  1. jquery/css需要记录的小知识(持续补充)
  2. 047_输出一下byte的所有值
  3. java常用的排序算法的思想以及实现
  4. 读Java并发编程实践记录_原子性_锁_同步容器详解_任务执行
  5. 文本框仅可接收decimal
  6. SAP B1 9.1 跟踪某个查询的执行
  7. 滴滴passport设计之道:帐号体系高可用的7条经验
  8. Microsoft Office SharePoint Server 2007 Trial Version已经可以下载了
  9. html图片滚动红点_程序员最爱的小红点更新了!史上最薄的钛制ThinkPad发布
  10. 网站SEO优化中tilte与h1的区别、b与strong的区别、i与em的区别
  11. 【电脑删不掉文件或文件夹】总结7种方法永久删除!
  12. 信息学奥林匹克竞赛——你适合么?
  13. 小白易语言post培训接码登录day03
  14. freertos---队列管理
  15. 【毕业设计】大数据电影数据分析可视化系统 - python 爬虫
  16. 离散数学 --- 图论基础 --- 无向图的连通性和有向图的连通性
  17. 基于语音识别的QT设计的csgo互动类视频游戏
  18. 下午茶界“新晋网红”:星语乐茶牛角包搭配手工茶(转载)
  19. 大疆精灵4多光谱 辐射定标 Metashape(原photoscan)
  20. docker自动领取epic免费游戏之一劳永逸

热门文章

  1. (原創) 如何使用C++/CLI读/写jpg檔? (.NET) (C++/CLI) (GDI+) (C/C++) (Image Processing)
  2. bzoj2152 聪聪可可
  3. PHP中如何解决高并发
  4. 匹配字符串-好技能-正则表达式
  5. emoji表情引发的JNI崩溃
  6. 交换机应用之端口模式(access、trunk和hybird)、是否标记(tag、untag)、端口缺省vlan(pvid、native id)...
  7. 全国80几所重点大学ftp资源库(经常逛逛可能有惊喜哦)很难收集的,知道其他的友友可以留言完善...
  8. Android.自定义控件的实现 (转载)
  9. “入洞房与度蜜月”的来历
  10. leetcode 746. 使用最小花费爬楼梯(dp)