Android 获取 usb 权限的两种方法

前言:

最近工作上遇到几个USB模块在android平台上适配使用的情况,所以要用到USB权限获取问题

##USB权限获取有以下2种方式:

一、直接在AndroidManifest.xml文件中进行如下配置:

 <activity
   android:name=".DemoCustomAndroidUSBActivity"
   android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
   <!-- USB -->
   <intent-filter>
     <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
   </intent-filter>
   <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
    <!-- USB END -->
  </activity>

需要注意的是:

其中 device_filter.xml 中列出了可用 usb 设备,当usb 设备连接手机之后,app 会自动询问是否允许获取该 usb 的权限。

device_filter.xml 放置位置如下图所示 :

device_filter.xml中的内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <usb-device vendor-id="1027" product-id="24577" />
 <usb-device vendor-id="3405" product-id="567" />
</resources>

usb设备通过 vendor-id(厂商 id) 和 product-id (产品 id)一起来定义的,这里有一个 linux 的 usb设备厂商 id 和产品 id 的汇总,可以作为 Android usb 设备的参考。

二、动态代码获取

2.1 代码中获取(前提是已经定位到要申请USB权限的usbdevice)

//获取USB设备ACTION
private static final String ACTION_USB_PERMISSION = "com.android.usb.USB_PERMISSION";
//   获取USB设备列表及定位到要申请权限的USB设备
//   mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
//   HashMap<String, UsbDevice> devices = mUsbManager.getDeviceList();
//   List<UsbDevice> deviceList = new ArrayList<UsbDevice>();
//   for (UsbDevice device : devices.values()) {
//    if (3540==device.getVendorId() && 567==device.getProductId()) {//获取打印机设备 vid和pid
//     currentDevice=device;
//    }
//   }
//开始申请USB权限
private void getUsbPermission(UsbDevice mUSBDevice) {
  UltraLog.d("开始申请USB权限");
  PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
  IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
  filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
  filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
  mContext.registerReceiver(mUsbReceiver, filter);
  mUsbManager.requestPermission(mUSBDevice, pendingIntent); // 该代码执行后,系统弹出一个对话框/等待权限
//以下代码是因为在系统层将弹出框直接修改掉了,可以不用
//  long start = System.currentTimeMillis();
//  while (!mUsbManager.hasPermission(mUSBDevice)) {
//   long current = System.currentTimeMillis();
//   if ((current - start) > 3500) {
//    break;
//   }
//   try {
//    Thread.sleep(50);
//   } catch (InterruptedException e) {
//    e.printStackTrace();
//   }
//  }
// }

2.2 注册广播接受者

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
  @SuppressLint("NewApi")
  public void onReceive(Context context, Intent intent) {
   String action = intent.getAction();

   if (ACTION_USB_PERMISSION.equals(action)) {
    synchronized (this) {
     mContext.unregisterReceiver(mUsbReceiver);
     UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
     if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)
       && currentDevice.equals(device)) {
      //TODO 授权成功,操作USB设备
     }else{
      //用户点击拒绝了
     }
    }
   }
  }
 };

总结

以上所述是小编给大家介绍的Android 获取 usb 权限的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Android 利用广播监听usb连接状态(变化情况)

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.lgs.test.testcode.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.widget.Toast; /** * Create

  • 详解Android USB转串口通信开发基本流程

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERV

  • Android串口通信封装之OkUSB的示例代码

    本文介绍了Android串口通信封装之OkUSB的示例代码,分享给大家.具体如下: Github传送门:OkUSB OkUSB 一个简洁的Android串口通信框架. 功能简介 支持设置波特率 支持设置数据位 支持设置停止位 支持设置校验位 支持DTS和RTS 支持串口连接状态监听 用法简介 Gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile '

  • android USB如何修改VID具体实现

    1.Android 手机driver端: [GB Version] File to modify: alps\mediatek\custom\[Chip]\kernel\usb\src\mtk_usb_custom.h Modification: VENDOR_ID [ICS and JB Version] File to modify: alps\mediatek\config\[Chip]\init.usb.rc Modification: sys.usb.vid 2:电脑端 PC端请修改

  • Android中查看USB连接的外接设备信息的代码实例

    1,USB存储设备(如:U盘,移动硬盘): //USB存储设备 插拔监听与 SD卡插拔监听一致. 复制代码 代码如下: private USBBroadCastReceiver mBroadcastReceiver; IntentFilter iFilter = new IntentFilter();       iFilter.addAction(Intent.ACTION_MEDIA_EJECT);       iFilter.addAction(Intent.ACTION_MEDIA_MO

  • Android实现状态栏(statusbar)渐变效果的示例

    前言 qq最近更新搞了渐变式状态栏.然后...新需求就是要加这个.唉 先来张效果图: 常见的方式: 设置Theme,状态栏透明. <item name="android:windowTranslucentStatus">true</item> 实现起来比较简单. 比如:SystemBarTint 几行代码搞定了. 但是.我要泼冷水,这种方式会引起这些问题: 1.软键盘弹起bug 2.fragment不适应 这种方式的优点: 兼容到4.4 我的看法: 1.用全屏模

  • Android 相机相册权限设置方法

    在AndroidManifest.xml中设置相机和相册的权限, <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 以上这篇Android 相机相册权限设置方法就是小编分享给大家的全部内容了,

  • Android 获取 usb 权限的两种方法

    前言: 最近工作上遇到几个USB模块在android平台上适配使用的情况,所以要用到USB权限获取问题 ##USB权限获取有以下2种方式: 一.直接在AndroidManifest.xml文件中进行如下配置: <activity android:name=".DemoCustomAndroidUSBActivity" android:label="@string/app_name"> <intent-filter> <action an

  • android获取图片尺寸的两种方式及bitmap的缩放操作

    我就废话不多说了,大家还是直接看代码吧~ //Uri.parse("file://"+result.getImage().getCompressPath())) String path=uri.getPath(); Log.e("图片路径",path+""); SpannableString spannableString=new SpannableString(path); //方法一:通过uri把图片转化为bitmap的方法 Bitmap b

  • Android清除应用缓存的两种方法

    第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); am.clearApplicationUserData(); 这种方式的问题就是不知清除cache,连带应用的data也删除了.如下图所示: 第二种 使用PackageManager中的deleteApplicationC

  • Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Canvas constructor错误 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.apple).copy(Bi

  • JS获取地址栏参数的两种方法(简单实用)

    js获取地址栏参数的方法有两种:第一种,采用正则表达式获取地址栏参数,第二种,是比较传统的方法,在这小编给大家强烈推荐使用第一种方法,既方便有实用,具体实现过程请看下文详述. 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window

  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法.分享给大家供大家参考,具体如下: 在Android中,音频.视频等多媒体元素的加入,使得应用程序的用户体验更好.可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐.办公的必备产品. Android提供了简单的音频API.一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具.这种工具在互联网上有大量的实例,因此在此只做简单的介绍. 对播放行为的控制是三个大家非常熟悉的方法:start().stop()和paus

  • Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

  • java 获取mac地址的两种方法(推荐)

    我在网上找了一下获取mac地址的方法,找了两种比较不太一样的方法. 第一种 public static void main(String[] args) throws Exception { InetAddress ia = InetAddress.getLocalHost(); System.out.println(getMACAddress(ia)); } private static String getMACAddress(InetAddress ia) throws Exception

  • 使用android studio导入模块的两种方法(超详细)

    第一种方法 1,首先自己创建一个新的android项目,选择Empty Activity,一直选择默认项 2,file->new->import module 3.选择模块文件,点击finish 4.点击file->project Structure, 5,选中Modules下的app,注意这个app就是你自己new project的module,下面这个huyubao就是我之前添加的,再选择Dependencies 6.点击+号,选中Module dependency 7,选中之前导入

  • Android引用arr包的两种方法

    android中引用的包一般分为两种: 1.jar包 2.arr包 arr包其实带有res的jar包,而普通的jar包是不带资源文件的.那么如何在项目中引用呢? 1.将arr包复制到libs目录下 2.在build.gradle文件中添加一个本地仓库,并把libs目录作为仓库的地址. repositories {flatDir {dirs 'libs'}} android{ . . . repositories { flatDir { dirs 'libs' } } . . . } 3.在bui

随机推荐