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.mzph.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的重要组件。它主要用来解决分布式集群中应用系统的一致性问题…