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

}

});

}

}

}

未经测试,请勿直接使用,仅供参考!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在飞音G801上运行OpenWRT+Asterisk

上篇文章介绍了如何在华硕RT-N11建立小型的SIP Server&#xff0c;本篇文章介绍将Asterisk移植到更为强大的VOIP网关G801上。G801是北京飞音时代的无线VoIP网关产品&#xff0c;在韩国SKT等运营商中广泛采用。G801支持802.11n 2T2R的无线路由&#xff0c;1WAN 4LAN的以太网&am…

自定义系统菜单

procedure SysMenuCommand(var Msg:TWMMENUSELECT);message WM_SYSCOMMAND;procedure TFormMain.SysMenuCommand(var Msg: TWMMenuSelect); begincase Msg.IDItem of0:beginMessageBox(0,PChar(茶杯),操作提示,MB_OKMB_ICONINFORMATION);end;1:beginMessageBox(0,PChar(书本),操…

android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。

Encrypt(加密工具)字符串&#xff0c;byte[]&#xff0c;文件等对象的加密和解密工具集合&#xff0c;包含了多种加密方案。加密类型摘要相关方法简单加密换一种编码格式Base64Util单向加密只能加密&#xff0c;不能解密MD5Util、SHAUtil对称加密使用相同的秘钥加密和解密AESUt…

开源应用架构之asterisk

作者&#xff1a;Russell Bryant 翻译&#xff1a;jiazhengfeng Asterisk[1]是一款GPLv2协议下的开源电话应用平台。简单来说&#xff0c;Asterisk是一个服务器应用&#xff0c;能够完成发起电话呼叫、接受电话呼叫、对电话呼叫进行定制处理。 Asterisk这个项目是由Mark Spen…

垃圾回收

大部分内容来自于&#xff1a; http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) 垃圾回收&#xff08;garbage collection&#xff09;机制的基本原则是&#xff1a; 1. 找出程序中不会再被访问到的对象。 2. 回收这部分对象占用的资源&#xff08;内存&a…

android 5.1 壁纸路径,RTFSC – Android5.1 壁纸设置流程简析 – RustFisher

Android5.1 壁纸设置流程浅析Ubuntu14.04 Android5.1 Source Insight3这里只是简单分析一下5.1里是如何设置壁纸的&#xff1b;这个流程和4.4有一些不同。但基本都是找个地方存放壁纸文件&#xff0c;需要的时候读取&#xff0c;设置的时候更新这里只看设置的过程。权当参考。…

如何在asterisk中限制呼叫路数?

在asterisk中&#xff0c;对于呼叫个数是可以通过call-limit进行限制的。限制办法是通过修改asterisk.conf中maxcalls参数&#xff0c;设置允许的最大呼叫数。这里的最大呼叫数是包括所有的呼叫数&#xff0c;出境、入境、分机间等呼叫。 为了分别限制出境/入境/分机间呼叫&…

总结DevExpress10个使用技巧

DevExpress是非常主流的.NET控件&#xff0c;目前全世界和中国都用很多用户使用&#xff0c;不过由于是英文版&#xff0c;初次接触的同学可能会觉得困难&#xff0c;这里就总结DevExpress常见的10个使用技巧。1.TextEditor(barEditItem)取文本 string editValue barEditItem1…

linux组成,Linux学习笔记之Linux组成及初识

1、常见的CPU架构&#xff1a;X86X64M68000ARMUltrasparcPower2、CPU的指令集精简指令集----Power复杂指令集----Intel3、使用汇编语言编写的Operation System 是很难移植在其他系统上系统是支持交叉编译的&#xff0c;但是需告知编译器编译的目标硬件规格是什么编译完成后的系…

WCF系列(1)—— CustomBehavior 入门

由于最近工作一直在做wcf平台上的开发&#xff0c;所以决定先结合自己平时工作中的经验实践写一个WCF的系列&#xff0c;希望能对大家有所帮助。 首先&#xff0c;说到WCF&#xff0c;就不得不提Endpoint这个概念&#xff0c;而Endpoint则由ABC组成&#xff0c;Adress,Binding和…

Asterisk 可加载模块

app_adsiprog.so > (Asterisk ADSI Programming Application) ——用于支持模拟显示服务接口的终端设备&#xff0c;在终端屏幕上操作菜单等。 app_amd.so > (Answering Machine Detection Application) ——用于外呼时终端应答状态检测 app_authenticate.so > (Aut…

android电梯程序设计,课内资源 - 基于Android实现的电梯调度模拟

一、使用说明1.1 项目简介某一楼有20层&#xff0c;操作者可以通过使用5部电梯从起始楼层来到达指定的楼层。本项目通过实现电梯调度&#xff0c;来模拟实现操作系统的调度过程&#xff0c;并且学习Android环境下使用Java的多线程编程方法以及调度算法。1.2 项目要求操作者可以…

默认构造函数的作用(“A”方法没有采用“0”个参数的重载

构造函数主要用来初始化对象。它又分为静态(static)和实例(instance)构造函数两种类别。大家应该都了解如何来写类的构造函数&#xff0c;这里只说下默认构造函数的作用&#xff0c;以及在类中保留默认构造函数的重要性。实际上&#xff0c;我说错了。正确的说法是&#xff1a;…

SourceInsight 设置点滴

SourceInsight是个强大的代码阅读工具&#xff0c; 价格不菲&#xff0c; 目前除了SlickEdit几乎没有可以与之抗衡的&#xff0c; 可能感觉没什么竞争对手的缘故&#xff0c;SI很少更新。SI的设置选项比较多&#xff0c; 这里说几个比较隐蔽的设置&#xff1a; 1. 改变SI的一些…

asp.net 根据当前时间计算是否股票、期货、黄金交易日期

很简单的一个方法&#xff1a; 股票&#xff1a;每周1到周五&#xff0c;上午9:30到11:30 下午13:00 到15&#xff1a;00 期货&#xff1a;每周1到周五&#xff0c;上午9:00到11:30 下午13:30到15:00 黄金&#xff1a;每周1到周五&#xff0c;上午9:00到11:30 下午13:30到15:…

android mac 照片恢复,如何找回Android手机删除的照片?这方法你肯定不知道

安卓手机怎么恢复误删的照片?如何找回Android手机照片?现在大多数人都喜欢用手机拍照存照片&#xff0c;慢慢的&#xff0c;手机中的照片自然而然就会变多&#xff0c;而照片是最占内存的。当你照片达到一定数量&#xff0c;内存快满的时候&#xff0c;连照片都拍不了。所以就…

Asterisk配置文件说明

Asterisk配置文件说明列表 名称 描述 asterisk.conf 主配置文件&#xff0c;通知Asterisk环境目录位置&#xff0c;包含其他所有配置文件所包含的目录&#xff0c;缺省Asterisk会在/etc/asterisk/目录下找到&#xff0c;也可以通过命令参数使用不同的asterisk.conf zaptel.…

apple watch3连android,Apple watch 可以连android手机吗?

在iOS 8.2正式版更新以后&#xff0c;在手机界面上就多出了一个“Apple Watch”的新图标&#xff0c;这是专门针对苹果新产品Apple Watch的应用&#xff0c;主要作用就是连接iPhone和Apple Watch&#xff0c;并未Apple Watch下载应用。打开“Apple Watch”首先进入的是“我的手…

关闭弹出窗体,刷新父页面

parent.location.reload(); window.opener.location.hrefwindow.opener.location.href; 转载于:https://www.cnblogs.com/xbding/archive/2012/07/03/2574660.html

nubia android root权限,获取中兴NX403a (Nubia Z5S Mini Android 4.2)ROOT权限教程,新手必看...

中兴NX403a (Nubia Z5S Mini Android 4.2)如何获取ROOT权限?用什么ROOT工具最简单?请跟着小编一起来看看如何用奇兔刷机对中兴NX403a (Nubia Z5S Mini Android 4.2)进行一键ROOT&#xff0c;小编特别亲手制作了详细的中兴NX403a (Nubia Z5S Mini Android 4.2) ROOT教程图解&a…