第一:请求权限和请求权限回调(通过广播回调)

注册一个广播接收器用于接收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开发相关推荐

  1. Android usb 权限广播,android10.0 USB弹窗权限流程解析

    USB请求权限流程 1. 新建activity,获取UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE) ...

  2. android u盘广播,android通过usb读取U盘的方法

    本文实例为大家分享了android通过usb读取U盘的具体代码,供大家参考,具体内容如下 1.关联 compile 'com.github.mjdev:libaums:+' 2.权限设置 3.监听u盘 ...

  3. android常驻型广播,Android 常驻广播和非常驻广播

    一.知识准备 ①常驻广播接受者:使用AndroidManifest.xml注册,接受者不随Activity的销毁而销毁,也就是拥有独立的生命周期. ②非常驻广播接受者:使用registerReceiv ...

  4. android充电状态广播,Android 获取电池是否充电状态、充电器类型

    0. demo 下载 https://github.com/sufadi/BatteryInfo 1. 电池广播获取充电状态 // 电池状态 import static android.os.Batt ...

  5. android普通权限说明,Android权限说明.doc

    Android权限说明 Android权限说明 程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 各种权限说明如下: android.permission. ...

  6. android动态静态广播,Android BroadcastReceiver实现自定义静态广播和动态广播(黏性广播)...

    思维导图: 静态广播: 当广播发出去的时候 如果接收广播的应用程序已经退出,也能接收广播: 发送者代码: package com.example.g160628_android_21_sender; ...

  7. android 获取权限管理,Android获取超级管理员权限的实现

    Android获取超级管理员权限的实现 发布时间:2020-10-14 18:54:35 来源:脚本之家 阅读:86 作者:柚子君. 1.定义特殊的广播接收者,系统超级管理员的广播接收者 public ...

  8. android 电池电量广播,Android查看电池电量的方法(基于BroadcastReceiver)

    本文实例讲述了Android查看电池电量的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.app.Dialo ...

  9. android系统关机广播,Android开机广播和关机广播

    android开机广播:代码如下: import android.content.BroadcastReceiver; import android.content.Context; import a ...

最新文章

  1. ****CI框架源码阅读笔记7 配置管理组件 Config.php
  2. Cadence 16.6 安装记录
  3. SQL Server2005的XML数据类型之基础篇 (2)
  4. C++longest common string最长公共字符串的实现(附完整源码)
  5. TCC事务补偿机制实现分布式事务控制介绍
  6. xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence
  7. 开源 java CMS - FreeCMS2.2 系统配置
  8. UOJ#386. 【UNR #3】鸽子固定器(链表)
  9. java定义数字类型的代码_数字类型内置方法(示例代码)
  10. 中兴面试题 01背包问题
  11. winedit注册码
  12. dx12 龙书第十六章学习笔记 -- 实例化与视锥体剔除
  13. 猿编程python分为几个阶段_各个阶段的python学习路线?
  14. 电影数据分析——国产烂片深度揭秘
  15. ios开发者添加开发测试机
  16. 数字故宫(360全景+纪录片+数据库+公开课)
  17. lisp调用天正命令参数修改_在lisp中模拟运行CAD的command命令函数
  18. Android中收货地址管理Demo
  19. weblogic wls-wsat组件远程命令执行(CVE-2017-3506)
  20. 学习springcloud

热门文章

  1. 暨南大学计算机复试线2019,暨南大学2019年考研复试分数线
  2. java前言_Java Web前言
  3. Windos下navcat连接虚拟机中的mysql
  4. 数据结构:点之间的最短距离--Floyd算法
  5. Python之异常追踪模块:traceback
  6. 华为基于策略划分VLAN的配置方法及示例
  7. 基于注解风格的Spring-MVC的拦截器
  8. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]
  9. [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]
  10. java代码连接redis_java代码连接redis