日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/9 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 申请usb权限,USB 权限申请流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 权限申请流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。