Android usb 权限广播,[Android]USB开发
第一:请求权限和请求权限回调(通过广播回调)
注册一个广播接收器用于接收USB权限被同意或拒绝后发出的广播
//注册USB设备权限管理广播
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); //ACTION_USB_PERMISSION为自定义的字符串
context.registerReceiver(usbReceiver, filter);
其中usbReceiver的实现是:
private BroadcastReceiver usbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action.equals(ACTION_USB_PERMISSION)){//ACTION_USB_PERMISSION是前面我们自己自定义的字符串
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
LogUtils.i("已获取USB权限");
}
} else {
LogUtils.i("USB权限被拒绝");
}
};
请求权限:
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);//关于这个mPermissionIntent ,具体的作用我还没弄明白,明白以后补充
manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
manager.requestPermission(device,mPermissionIntent);//device是具体某个usb设备
执行完这个后,界面会弹出对话框询问用户是否授予权限,然后会发送权限广播,所以上面我们注册一个广播接收器来判断权限状态
第二:注册USB设备插拔广播
USB设备被插/拔后同样会发送一个广播,因此我们需要注册一个接收器来接收这个广播
IntentFilter stateFilter = new IntentFilter();
stateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
stateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
context.registerReceiver(usbStateReceiver, stateFilter);
其中.usbStateReceiver的实现如下:
private BroadcastReceiver usbStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//USB连接上手机时会发送广播android.hardware.usb.action.USB_STATE"及UsbManager.ACTION_USB_DEVICE_ATTACHED
if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
LogUtils.i("有USB设备连接");
} else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {//USB被拔出
LogUtils.i("USB连接断开,程序退出!");
}
}
};
详细介绍以上两种,另附一个自己写的USBUtil,里面的思路是,初始化话时传入要连接设备的VendorId和ProductId,然后自动进行搜索,连接,授权等。只暴露读/写,开/关给外界,其他的全部自己处理
未经测试,请勿直接使用,仅供参考!!!!
package com.police.policefaceproject.utils;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import java.util.Iterator;
import java.util.Map;
/**
* Created by Administrator on 2018/4/18.
*/
public class USBUtils {
private Activity activity;
private final String ACTION_USB_PERMISSION = "com.gudi.usb.permission";
private UsbManager manager;
private PendingIntent mPermissionIntent;
private BroadcastReceiver usbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action.equals(ACTION_USB_PERMISSION)){
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
USBCtrl(context);
}
} else {
LogUtils.i("USB权限被拒绝");
if(activity!=null && !activity.isDestroyed()){
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
UiUtils.Alert(activity, "权限错误", "请重新插拔设备后,授予应用访问USB权限","确定", new UiUtils.AlertCallBackOne() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
;
}
});
}
}
}
}
};
private UsbDeviceConnection usbConnection;
private UsbEndpoint uepIn;
private UsbEndpoint uepOut;
private int mProductId,mVendorId;
private BroadcastReceiver usbStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//USB连接上手机时会发送广播android.hardware.usb.action.USB_STATE"及UsbManager.ACTION_USB_DEVICE_ATTACHED
if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {//判断其中一个就可以了
LogUtils.i("有USB设备连接");
showMsg("有USB设备连接");
USBCtrl(context);
} else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {//USB被拔出
LogUtils.i("USB连接断开,程序退出!");
showMsg("USB连接断开,请重试");
closeConn();
}
}
};
public void init(Activity context,int productId,int vendorId){
activity = context;
mProductId = productId;
mVendorId = vendorId;
manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
//注册USB设备权限管理广播
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
context.registerReceiver(usbReceiver, filter);
//注册USB设备插拔广播
IntentFilter stateFilter = new IntentFilter();
stateFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
stateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
stateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
context.registerReceiver(usbStateReceiver, stateFilter);
}
private Map getDevices(){
if(manager != null){
Map deviceMap = manager.getDeviceList();
return deviceMap;
}
return null;
}
private UsbDeviceConnection openDevice(Context context,UsbDevice device){
if(manager.hasPermission(device)){
UsbDeviceConnection DeviceConnection = manager.openDevice(device);
return DeviceConnection;
}else{
LogUtils.i("请求USB权限");
manager.requestPermission(device,mPermissionIntent);
return null;
}
}
private void USBCtrl(Context context){
//获取设备列表
Map devicesList= getDevices();
if(devicesList == null || devicesList.size() <=0){
LogUtils.e("未查找到USB设备");
showMsg("未查找到设备,请重新插拔设备");
}else{
//遍历寻找指定设备
Iterator deviceIterator = devicesList.values().iterator();
while(deviceIterator.hasNext()){
UsbDevice usb= deviceIterator.next();
if(usb.getVendorId() == mVendorId && usb.getProductId() == mProductId){
//查找到指定设备
connDevice(context,usb);
break;
}
}
}
}
private void connDevice(Context context,UsbDevice device){
UsbEndpoint uep;
//获得设备接口
UsbInterface usbInterface = device.getInterface(0);
//查找输入,输出端
for(int i =0;i
uep=usbInterface.getEndpoint(i);
if(uep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK){
if(uep.getDirection() == UsbConstants.USB_DIR_IN){
uepIn = uep;
}else if(uep.getDirection() == UsbConstants.USB_DIR_OUT){
uepOut = uep;
}
}
}
usbConnection = openDevice(context,device);
if(usbConnection == null){
LogUtils.e("连接设备失败");
showMsg("连接设备失败,请赋予权限");
return ;
}
if(usbConnection.claimInterface(usbInterface,true)){//声明独占此接口,在发送或接收数据前完成
//锁定成功
}else{
//锁定失败
usbConnection.close();
usbConnection = null;
LogUtils.e("锁定接口失败");
showMsg("锁定接口失败,请插拔设备重试");
}
}
public int write(byte[] data){
if(usbConnection != null){
int len= usbConnection.bulkTransfer(uepOut, data, data.length, 3000);
LogUtils.i("通过USB接口发送"+data.length+"数据");
return len;
}else{
LogUtils.i("usbConnection为null");
return -1;
}
}
public byte[] read(byte[] data){
if(usbConnection != null){
int len= usbConnection.bulkTransfer(uepOut, data, data.length, 3000);
LogUtils.i("通过USB接口接收"+data.length+"数据");
return data;
}else{
LogUtils.i("接收数据,usbConnection为null");
return null;
}
}
public void closeConn(){
if(usbConnection != null){
usbConnection.close();
usbConnection=null;
}
}
private void showMsg(final String msg){
if(activity!=null ){
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
UiUtils.toast(activity.getApplicationContext(),msg);
}
});
}
}
}
未经测试,请勿直接使用,仅供参考!!!!
Android usb 权限广播,[Android]USB开发相关推荐
- Android usb 权限广播,android10.0 USB弹窗权限流程解析
USB请求权限流程 1. 新建activity,获取UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE) ...
- android u盘广播,android通过usb读取U盘的方法
本文实例为大家分享了android通过usb读取U盘的具体代码,供大家参考,具体内容如下 1.关联 compile 'com.github.mjdev:libaums:+' 2.权限设置 3.监听u盘 ...
- android常驻型广播,Android 常驻广播和非常驻广播
一.知识准备 ①常驻广播接受者:使用AndroidManifest.xml注册,接受者不随Activity的销毁而销毁,也就是拥有独立的生命周期. ②非常驻广播接受者:使用registerReceiv ...
- android充电状态广播,Android 获取电池是否充电状态、充电器类型
0. demo 下载 https://github.com/sufadi/BatteryInfo 1. 电池广播获取充电状态 // 电池状态 import static android.os.Batt ...
- android普通权限说明,Android权限说明.doc
Android权限说明 Android权限说明 程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 各种权限说明如下: android.permission. ...
- android动态静态广播,Android BroadcastReceiver实现自定义静态广播和动态广播(黏性广播)...
思维导图: 静态广播: 当广播发出去的时候 如果接收广播的应用程序已经退出,也能接收广播: 发送者代码: package com.example.g160628_android_21_sender; ...
- android 获取权限管理,Android获取超级管理员权限的实现
Android获取超级管理员权限的实现 发布时间:2020-10-14 18:54:35 来源:脚本之家 阅读:86 作者:柚子君. 1.定义特殊的广播接收者,系统超级管理员的广播接收者 public ...
- android 电池电量广播,Android查看电池电量的方法(基于BroadcastReceiver)
本文实例讲述了Android查看电池电量的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.app.Dialo ...
- android系统关机广播,Android开机广播和关机广播
android开机广播:代码如下: import android.content.BroadcastReceiver; import android.content.Context; import a ...
最新文章
- ****CI框架源码阅读笔记7 配置管理组件 Config.php
- Cadence 16.6 安装记录
- SQL Server2005的XML数据类型之基础篇 (2)
- C++longest common string最长公共字符串的实现(附完整源码)
- TCC事务补偿机制实现分布式事务控制介绍
- xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence
- 开源 java CMS - FreeCMS2.2 系统配置
- UOJ#386. 【UNR #3】鸽子固定器(链表)
- java定义数字类型的代码_数字类型内置方法(示例代码)
- 中兴面试题 01背包问题
- winedit注册码
- dx12 龙书第十六章学习笔记 -- 实例化与视锥体剔除
- 猿编程python分为几个阶段_各个阶段的python学习路线?
- 电影数据分析——国产烂片深度揭秘
- ios开发者添加开发测试机
- 数字故宫(360全景+纪录片+数据库+公开课)
- lisp调用天正命令参数修改_在lisp中模拟运行CAD的command命令函数
- Android中收货地址管理Demo
- weblogic wls-wsat组件远程命令执行(CVE-2017-3506)
- 学习springcloud
热门文章
- 暨南大学计算机复试线2019,暨南大学2019年考研复试分数线
- java前言_Java Web前言
- Windos下navcat连接虚拟机中的mysql
- 数据结构:点之间的最短距离--Floyd算法
- Python之异常追踪模块:traceback
- 华为基于策略划分VLAN的配置方法及示例
- 基于注解风格的Spring-MVC的拦截器
- [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]
- [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]
- java代码连接redis_java代码连接redis