android 申请usb权限,USB 权限申请流程

本文详细介绍了Android系统中USB权限的三种申请方式:系统检测触发、APP主动申请和打开设备时申请。涉及到的关键类包括UsbHostManager、UsbManager和UsbSettingsManager。对于不想显示权限确认对话框的情况,可以通过修改系统源码实现。同时,文章提供了针对特定设备过滤和处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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, 下面是静态注册:

2faf007bd262

图片.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);

+ }

}

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

详细流程:

2faf007bd262

图片.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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值