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电梯程序设计,课内资源 -