android通过usb读取U盘的方法

本文实例为大家分享了android通过usb读取U盘的具体代码,供大家参考,具体内容如下

1.关联 compile ‘com.github.mjdev:libaums:+'

2.权限设置

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.hardware.usb.host" android:required="false" />
<uses-feature android:name="android.hardware.usb.host" android:required="true" />

3.监听u盘 插入拔出的广播

 //监听otg插入 拔出
 IntentFilter usbDeviceStateFilter = new IntentFilter();
 usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
 usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
 mContext.registerReceiver(UDiskMountedReceiver, usbDeviceStateFilter);
 //注册监听自定义广播
 IntentFilter filter = new IntentFilter(Constant.ACTION_USB_PERMISSION);
 mContext.registerReceiver(UDiskMountedReceiver, filter);

4.代码

package com.zb.usbtest;

/**
 * @项目名: UsbTest
 * @包名: com.zb.usbtest
 * @文件名: ReadUDisk
 * @创建者: 25934
 * @创建时间: 2018-07-24 13:50
 * @描述: TODO
 */

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbManager;
import android.util.Log;
import com.github.mjdev.libaums.UsbMassStorageDevice;
import com.github.mjdev.libaums.fs.FileSystem;
import com.github.mjdev.libaums.fs.UsbFile;
import com.github.mjdev.libaums.partition.Partition;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static com.zb.usbtest.Constant.ACTION_USB_PERMISSION;

public class ReadUDisk {
 private UDiskCallBack.OnUDiskCallBack mOnUDiskCallBack = null;
 private Context    mContext;
 private UsbMassStorageDevice[] storageDevices;
 private List<UsbFile> usbFiles = new ArrayList<>();
 private final UsbManager mUsbManager;

 public ReadUDisk(Context context) {
  mContext = context;
  mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
 }

 /**
  * 接受U盘插入和拔出事件
  * @param onUDiskCallBack
  */
 public void setOnUDiskCallBack(UDiskCallBack.OnUDiskCallBack onUDiskCallBack) {
  if (mOnUDiskCallBack == null) {
   registerReceiver();
   mOnUDiskCallBack = onUDiskCallBack;
  }
 }

 /**
  * 注册广播接收者
  */
 public void registerReceiver() {
  //监听otg插入 拔出
  IntentFilter usbDeviceStateFilter = new IntentFilter();
  usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
  usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
  mContext.registerReceiver(UDiskMountedReceiver, usbDeviceStateFilter);
  //注册监听自定义广播
  IntentFilter filter = new IntentFilter(Constant.ACTION_USB_PERMISSION);
  mContext.registerReceiver(UDiskMountedReceiver, filter);
  Log.e("ReadUDisk", "registerReceiver: ");
 }

 /**
  * 注销广播接收者
  */
 public void unReisterReceiver() {
  if (UDiskMountedReceiver != null) {
   mContext.unregisterReceiver(UDiskMountedReceiver);
  }
 }

 /**
  * 检查usb设备的权限
  * @param device
  * @return
  */
 public boolean checkPerssion(UsbMassStorageDevice device) {
  if (mUsbManager==null){
   return false;
  }
  if (mUsbManager.hasPermission(device.getUsbDevice())) {//有就直接读取设备是否有权限
   return true;
  } else {
   return false;
  }
 }

 /**
  * 读取当前usb设备的数量
  * @return
  */
 public int getDeviceCount() {
  //获取存储设备
  UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
  return storageDevices.length;
 }

 /**
  * 根据position获取usb设备
  * @param position
  * @return
  */
 public UsbMassStorageDevice getUsbMassDevice(int position) {
  //获取存储设备
  UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
  if (position > storageDevices.length) {
   return null;
  } else {
   return storageDevices[position];
  }
 }

 /**
  * 获取usb上所有的存储设备
  * @return
  */
 public UsbMassStorageDevice[] getUsbMassAllDevice() {
  //获取存储设备
  UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
  return storageDevices;
 }

 /**
  * 根据设备获取路径
  * @param device
  * @return
  */
 public FileSystem readDevice(UsbMassStorageDevice device) {
  try {
   if (!checkPerssion(device)){ //检查是否有权限
    return null;
   }

   device.init();//使用设备之前需要进行 初始化
   Partition partition = device.getPartitions().get(0); //仅使用设备的第一个分区
   FileSystem currentFs = partition.getFileSystem();
   // currentFs.getCapacity(); //容量大小
   // currentFs.getOccupiedSpace(); //已使用大小
   // currentFs.getFreeSpace(); //未使用的大小
   UsbFile root  = currentFs.getRootDirectory();//获取根目录
   String deviceName = currentFs.getVolumeLabel();//获取设备标签
   return currentFs;
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }

 /**
  * 获取U盘的文件和文件夹路径
  * @param fileSystem
  * @return
  */
 public List<UsbFile> getUsbFiles(FileSystem fileSystem) {
  usbFiles.clear();
  try {
   for (UsbFile file : fileSystem.getRootDirectory()
           .listFiles()) { //将所以文件和文件夹路径添加到usbFiles数组中
    usbFiles.add(file);
   }
   Collections.sort(usbFiles, new Comparator<UsbFile>() {//简单排序 文件夹在前 文件在后
    @Override
    public int compare(UsbFile oFile1, UsbFile oFile2) {
     return oFile1.isDirectory()
       ? -1
       : 1;
    }
   });
  } catch (IOException e) {
   e.printStackTrace();
  }
  return usbFiles;
 }

 private BroadcastReceiver UDiskMountedReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
   String action = intent.getAction();
   switch (action) {
    case ACTION_USB_PERMISSION: //自定义权限广播
     if (mOnUDiskCallBack != null) {
      mOnUDiskCallBack.onPermissionCallBack();
     }
     break;
    case UsbManager.ACTION_USB_DEVICE_ATTACHED: //usb设备插入广播
     if (mOnUDiskCallBack != null) {
      mOnUDiskCallBack.onAttachDeviceCallBack();
     }
     break;

    case UsbManager.ACTION_USB_DEVICE_DETACHED: //usb设备拔出广播
     if (mOnUDiskCallBack != null) {
      mOnUDiskCallBack.onDetachDeviceCallBack();
     }
     break;
   }
  }
 };
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • 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

  • C语言实现模拟USB对8bit数据的NRZI编码输出

    USB的NRZI编码方式,将原数据进行处理,原数据为0时,编码成电平翻转,原数据为1时,编码成电平不翻转,USB要发送数据的时候,硬件把数据流转化成为NRZI编码,然后经过USB的差分线D+和D-将数据发送出去,接收方在接收数据的后做逆处理,要注意的是,在没有数据传输的时候,也就是空闲的时候,数据线是保持高电平的,这点一定要注意,很多书上就是一笔代过,根本不知道为什么! 在USB的头部有一个同步域,由7个0组成,当编码成NRZI的时候,就是一串0101010的方波了,而方波的频率就是发送的波特率

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

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

  • Android StatusBar 透明化方法(不同的版本适配)

    透明状态栏(StatusBar)的全适配 状态栏指定android手机上顶部显示手机状态信息的位置. 透明状态栏是android 自4.4开始新加入的功能,他可以是状态栏根据我们自己想要的颜色进行定义,使titleBar能够和状态栏融为一体,增加沉浸感. 咱们需要对不同的版本适配StatusBar,下面咱们一个一个看 values/styles.xml <resources> <style name="Theme.AppTheme.TranslucentStatusBar&qu

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

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

  • C# WPF使用AForge类库操作USB摄像头拍照并保存

    项目中用到 USB 摄像头,需要根据情况进行图像抓拍,查了半天资料,比较多的是使用 WPFMediaKit 和 AForge . 但是由于项目要求不显示 USB 摄像头拍摄的画面,最终确定使用 AForge 解决. 下面用一个测试程序记录一下. 一.无预览拍照 首先建立一个 WPF 项目,我的就叫 AForgeTest,你们随意就好: 然后在 NuGet 包管理器中安装 AForge 库: 我只安装了图中打勾的几个库,这个根据自己项目需要安装就好. 不过用 USB 摄像头拍照必须安装: AFor

  • Android Studio使用USB真机调试详解

    本文为大家分享了Android Studio使用USB真机调试的具体方法,供大家参考,具体内容如下 以小米4为例,先将手机通过USB连接电脑,在设备管理器中确保驱动安装正确. 对手机的设置 1.设置手机为开发者模式(设置->关于手机->连续点击MIUI版本--开启成功) 2.在更多设置中找到系统安全设置--允许安装未知来源的应用 3.在更多设置中选择开发者选项,在开发者选项中同时勾选USB调试和USB安装的开关 对Android Studio 的设置: 1.在工具栏中找到app,点开后选择&q

  • Android Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STATE监听自己的Usb连接的设备,只针对Usb设备.而想要监听外部设备的时候却需要另外的两个广播进行监听"android.hardware.usb.action.USB_DEVICE_ATTACHED"和"android.hardware.usb.action.USB_DEVICE

  • android通过usb读取U盘的方法

    本文实例为大家分享了android通过usb读取U盘的具体代码,供大家参考,具体内容如下 1.关联 compile 'com.github.mjdev:libaums:+' 2.权限设置 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTER

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

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

  • Android接入USB扫码模块的方法

    前言 USB扫码模块可以是扫描盒子或者扫码枪之类的,一根USB线作为供电和数据通信使用,有些扫码模块支持虚拟串口模式,虚拟串口模式读取数据会比较简单一点,和普通的串口一样操作即可,就是通过虚拟串口口+波特率即可获取到数据,这里主要讲读取USB模式下的数据. 1.读取USB模式下的数据 USB模式下的扫码模块相当于一个外接键盘,也就是它必须在有光标的地方才能进行扫码,且是直接把扫到的内容自动输入到输入框中,并不受我们的控制,所以我们必须另外想办法,安卓系统中有这么个方dispatchKeyEven

  • Android编程实现识别与挂载U盘的方法

    本文实例讲述了Android编程实现识别与挂载U盘的方法.分享给大家供大家参考,具体如下: 关于U盘的挂载可以先看一下这篇文章<Android2.3实现SD卡与U盘自动挂载的方法>,作者是将U盘直接挂载在SD卡下.我的机器是MTK6575的平台,支持sdcard和sdcard2,亲测将U盘挂载到sdcard2下可以实现U盘识别,但这只是一个临时解决办法,因为在同时插sdcard2和usb的情况下可能会有冲突,比如两个设备相同目录下存在同名文件的情况下只能识别一个. 要实现真正的U盘挂载需要修改

  • Android设备与外接U盘实现数据读取操作的示例

    现在越来越多手机支持OTG功能,通过OTG可以实现与外接入的U盘等USB设备实现数据传输. USB OTG(On The Go)作为USB2.0的补充协议,于2001年由USB-IF提出.它提出的背景是移动消费类电子产品的迅猛增加,而之前USB协议的主从协议标准让这些电子产品在离开PC电脑时的数据传输变得艰难,OTG技术正是为了解决这一问题的标准. 通过OTG技术实现设备间端到端互联 OTG协议规定连接时默认情况作为Host的设备为A设备,A设备负责为总线供电:默认作为Device的设备为B设备

  • Android开发实现读取excel数据并保存为xml的方法

    本文实例讲述了Android开发实现读取excel数据并保存为xml的方法.分享给大家供大家参考,具体如下: 前阵子,公司请外面人翻译了一些android中values中的一些strings,然而保存的都是excel格式,如果单纯的将excel中的数据粘贴到指定的xml中的话,工作量非常的大,于是,自己写了个简单的demo,将excel中的数据读取并保存为xml对应的数据,下面的demo和图片展示: 1.数据保存在BeanValue中,包括key和value,方便后续数据读取 package c

  • Android中Json数据读取与创建的方法

    首先介绍下JSON的定义,JSON是JavaScript Object Notation的缩写. 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON的结构: (1) Name/Value Pairs(无序的):类似所熟知的Keyed list. Hash table.Disctiona

  • C#实现读取指定盘符硬盘序列号的方法

    本文实例讲述了C#实现读取指定盘符硬盘序列号的方法.分享给大家供大家参考,具体如下: using System; using System.IO; using System.Runtime.InteropServices; using System.Text; using Microsoft.Win32; namespace Wjb.ReadOrWriteIniAndReg { /**/////// 读取指定盘符的硬盘序列号 /// public class HardDiskVal { [Dll

  • Android应用读取Excel文件的方法

    本文实例讲述了Android应用读取Excel文件的方法.分享给大家供大家参考,具体如下: ReadExcel.java文件: public class ReadExcel extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

  • Android 读取文件内容实现方法总结

    Android 读取文件内容实现方法,这里整理了几种方法,大家需要可以看下. 如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法. FileInputStream inStream = this.getContext().openFileInput("itcast.txt"); Log.i("FileTest", readInStream(inS

随机推荐