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, 下面是靜態注冊:

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);

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ai人工智能程序_簡單解釋:一個AI程序如何掌握Go的古老游戲

ai人工智能程序by Aman Agarwal通過阿曼阿加瓦爾(Aman Agarwal) 簡單解釋:一個AI程序如何掌握Go的古老游戲 (Explained Simply: How an AI program mastered the ancient game of Go) This is about AlphaGo, Google DeepMind’s Go playing AI that shook the tec…

python提取hbase數據_詳解python操作hbase數據的方法介紹

配置 thrift python使用的包 thrift 個人使用的python 編譯器是pycharm community edition. 在工程中設置中,找到project interpreter, 在相應的工程下,找到package,然后選擇 “” 添加, 搜索 hbase-thrift (Python cl…

工作隨記

td自動換行:設置table 的 style"table-layout:fixed;" 然后設置td的 style"word-wrap:break-word;" white-space: nowrap 文本不換行 Intelidea創建好項目之后,右鍵新建Java class的時候發現沒有改選項,在Project Structure設置源碼目錄 DOM4j中…

qt for android 圖片可拉伸,qt實現九宮格布局,圖片拉伸

在實現qt播放時,調用的mplayer,由于采用的是自定義繪圖,用的是setAttribute(Qt::WA_TranslucentBackground);結果不能正常在上面顯示播放畫面,在默認皮膚下是沒有問題的,決定用九宮格圖片拉伸方式(效果如圖)附件圖片:文…

第一次作業-李純銳201731084433

作業屬于課程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作業要求位置 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/2706 我在這個課程的目標是: 認真學習好軟件工程原理以及科學的軟件項目開發與管理方法&…

定點化_mif文件生成

clc; %全屏清零 clear all; %變量清零 N2^8; %設置ROM深度(字變量)的變量參數, s_p0:255; …

zeppelin連接數據源_使用開放源代碼合同(open-zeppelin)創建以太坊令牌

zeppelin連接數據源by Danny通過丹尼 使用開放源代碼合同(open-zeppelin)創建以太坊令牌 (Create an Ethereum token using open source contracts (open-zeppelin)) I want to show you that creating a best practice token is a simple process. To be honest, we are goin…

python不是內部文件_已安裝python,但是出現‘python’不是內部或外部命令,也不是可運行的程序或批處理文件。...

解決方法: 1.打開python shell查看你的python安裝路徑(黃色標注) >>> import sys >>> sys.path [, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\idlelib, C:\\Users\\Administrator\\App…

使用canvas繪制時鐘

使用canvas繪制時鐘 什么使canvas呢&#xff1f;HTML5 <canvas> 元素用于圖形的繪制&#xff0c;通過腳本 (通常是JavaScript)來完成。<canvas> 標簽只是圖形容器&#xff0c;所以我們必須使用腳本來繪制圖形。通過它可以繪制路徑,盒、圓、字符以及添加圖像等等。 …

Visual Studio 2017創建XAML文件

Visual Studio 2017創建XAML文件在Visual Stuido 2015中&#xff0c;在已經創建好的項目中添加XAML文件&#xff0c;只要右擊項目&#xff0c;單擊“添加”|“新建項”命令&#xff0c;然后從“添加新項”對話框中&#xff0c;選擇“Cross-Platform”|“Forms Xaml Page”選項即…

android 安裝assets中的apk,如何安裝assets下apk,附源碼(原創)

publicstaticvoidInstall(Context ctx, String strLocalFile) {Intent intentInstallnewIntent();String apkPath"/data/data/"ctx.getPackageName()"/files";String apkName"yuan.apk";File filenewFile(apkPath, apkName);try{//assets下對于超…

FtpWebRequest.UsePassive屬性:設置FTP工作模式

默認值&#xff1a;true&#xff0c;被動模式 PASV&#xff08;被動&#xff09;方式的連接過程是&#xff1a;客戶端向服務器的FTP端口&#xff08;默認是21&#xff09;發送連接請求&#xff0c;服務器接受連接&#xff0c;建立一條命令鏈路。 當需要傳送數據時&#xff0c; …

angular面試題及答案_關于最流行的Angular問題的StackOverflow上的48個答案

angular面試題及答案by Shlomi Levi通過Shlomi Levi 關于最流行的Angular問題的StackOverflow上的48個答案 (48 answers on StackOverflow to the most popular Angular questions) I gathered the most common questions and answers from Stackoverflow. These questions we…

c++分治法求最大最小值實現_最優化計算與matlab實現(12)——非線性最小二乘優化問題——G-N法...

參考資料《精通MATLAB最優化計算&#xff08;第二版&#xff09;》編程工具Matlab 2019a目錄石中居士&#xff1a;最優化計算與Matlab實現——目錄?zhuanlan.zhihu.com非線性最小二乘優化問題非線性最小二乘優化也叫無約束極小平方和函數問題&#xff0c;它是如下無約束極小問…

win7 IIS7環境下部署PHP 7.0

最近在本機電腦win7 II7環境下部署PHP 7.0遇到一些問題&#xff0c;將之記錄下來 簡要步驟如下&#xff1a; 1、到php官網下載php&#xff0c;由于是IIS環境要下載非線程安全的版本&#xff0c;我下載的是7.0.13 2、解壓到本地文件目錄下 3、通過控制臺進入到php文件目錄&#…

《Oracle高性能自動化運維》一一3.3 Redo產生場景

3.3 Redo產生場景我們知道&#xff0c;Oracle Redo是以條目&#xff08;Redo Entries/Records&#xff09;的形式記錄數據庫的所有更改操作&#xff08;OP&#xff09;。更改操作主要包括&#xff1a;數據庫物理文件更改&#xff1a;主要指的是數據庫物理文件的增減等操作&…

智能算法(GA、DBO等)求解零空閑流水車間調度問題(NIFSP)

先做一個聲明&#xff1a;文章是由我的個人公眾號中的推送直接復制粘貼而來&#xff0c;因此對智能優化算法感興趣的朋友&#xff0c;可關注我的個人公眾號&#xff1a;啟發式算法討論。我會不定期在公眾號里分享不同的智能優化算法&#xff0c;經典的&#xff0c;或者是近幾年…

《構建之法》讀后感 二

個人感受部分&#xff1a; 01. 過去的我對自己的職業沒有一個規劃&#xff0c;認為讀大學就是拿畢業證&#xff0c;至于以后找到什么樣的工作從來沒有考慮過。在拿到一個軟件作業時&#xff0c;總是在設計階段就把它想得特別完美&#xff0c;想讓他沒有任何出錯的做出來&#x…

android 簡單實現圓角,Android 實現圓角圖片的簡單實例

Android 實現圓角圖片的簡單實例實現效果圖&#xff1a;本來想在網上找個圓角的例子看一看&#xff0c;不盡人意啊&#xff0c;基本都是官方的Demo的那張原理圖&#xff0c;稍后會貼出。于是自己自定義了個View&#xff0c;實現圖片的圓角以及圓形效果。效果圖&#xff1a;Andr…

zookeeper介紹及集群的搭建(利用虛擬機)

ZooKeeper ?   ZooKeeper是一個分布式的&#xff0c;開放源碼&#xff08;apache&#xff09;的分布式應用程序協調服務&#xff0c;是Google的Chubby一個開源的實現&#xff0c;是Hadoop和Hbase、dubbox、kafka的重要組件。它主要用來解決分布式集群中應用系統的一致性問題…