现在越来越多手机支持OTG功能,通过OTG可以实现与外接入的U盘等USB设备实现数据传输。关于OTG,可以参考:
http://blog.csdn.net/srw11/article/details/39154053。
最近项目上用到了该功能,项目上用的是安卓7.1的盒子,要实现与插入的U盘进行数据操作。通过大量的找资料,终于实现了项目上需要的功能。找资料主要是解决两个问题:
  1. U盘权限问题
  2. U盘文件路径及文件操作

    废话不多说,感觉还是喜欢直接上代码才爽快。项目中用到了一个开源框架,开源地址是:
    https://github.com/magnusja/libaums。


代码部分:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {//输入的内容private EditText u_disk_edt;//写入到U盘private Button u_disk_write;//从U盘读取private Button u_disk_read;//显示读取的内容private TextView u_disk_show;//自定义U盘读写权限private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";//当前处接U盘列表private UsbMassStorageDevice[] storageDevices;//当前U盘所在文件目录private UsbFile cFolder;private final static String U_DISK_FILE_NAME = "u_disk.txt";private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 100:showToastMsg("保存成功");break;case 101:String txt = msg.obj.toString();if (!TextUtils.isEmpty(txt))u_disk_show.setText("读取到的数据是:" + txt);break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();}private void initViews() {u_disk_edt = (EditText) findViewById(R.id.u_disk_edt);u_disk_write = (Button) findViewById(R.id.u_disk_write);u_disk_read = (Button) findViewById(R.id.u_disk_read);u_disk_show = (TextView) findViewById(R.id.u_disk_show);u_disk_write.setOnClickListener(this);u_disk_read.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.u_disk_write:final String content = u_disk_edt.getText().toString().trim();mHandler.post(new Runnable() {@Overridepublic void run() {saveText2UDisk(content);}});break;case R.id.u_disk_read:mHandler.post(new Runnable() {@Overridepublic void run() {readFromUDisk();}});break;}}private void readFromUDisk() {UsbFile[] usbFiles = new UsbFile[0];try {usbFiles = cFolder.listFiles();} catch (IOException e) {e.printStackTrace();}if (null != usbFiles && usbFiles.length > 0) {for (UsbFile usbFile : usbFiles) {if (usbFile.getName().equals(U_DISK_FILE_NAME)) {readTxtFromUDisk(usbFile);}}}}/*** @description 保存数据到U盘,目前是保存到根目录的* @author ldm* @time 2017/9/1 17:17*/private void saveText2UDisk(String content) {//项目中也把文件保存在了SD卡,其实可以直接把文本读取到U盘指定文件File file = FileUtil.getSaveFile(getPackageName()+ File.separator + FileUtil.DEFAULT_BIN_DIR,U_DISK_FILE_NAME);try {FileWriter fw = new FileWriter(file);fw.write(content);fw.close();} catch (IOException e) {e.printStackTrace();}if (null != cFolder) {FileUtil.saveSDFile2OTG(file, cFolder);mHandler.sendEmptyMessage(100);}}/*** @description OTG广播注册* @author ldm* @time 2017/9/1 17:19*/private void registerUDiskReceiver() {//监听otg插入 拔出IntentFilter usbDeviceStateFilter = new IntentFilter();usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);registerReceiver(mOtgReceiver, usbDeviceStateFilter);//注册监听自定义广播IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);registerReceiver(mOtgReceiver, filter);}/*** @description OTG广播,监听U盘的插入及拔出* @author ldm* @time 2017/9/1 17:20* @param*/private BroadcastReceiver mOtgReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();switch (action) {case ACTION_USB_PERMISSION://接受到自定义广播UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);//允许权限申请if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {if (usbDevice != null) {//用户已授权,可以进行读取操作readDevice(getUsbMass(usbDevice));} else {showToastMsg("没有插入U盘");}} else {showToastMsg("未获取到U盘权限");}break;case UsbManager.ACTION_USB_DEVICE_ATTACHED://接收到U盘设备插入广播UsbDevice device_add = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device_add != null) {//接收到U盘插入广播,尝试读取U盘设备数据redUDiskDevsList();}break;case UsbManager.ACTION_USB_DEVICE_DETACHED://接收到U盘设设备拔出广播showToastMsg("U盘已拔出");break;}}};/*** @description U盘设备读取* @author ldm* @time 2017/9/1 17:20*/private void redUDiskDevsList() {//设备管理器UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);//获取U盘存储设备storageDevices = UsbMassStorageDevice.getMassStorageDevices(this);PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);//一般手机只有1个OTG插口for (UsbMassStorageDevice device : storageDevices) {//读取设备是否有权限if (usbManager.hasPermission(device.getUsbDevice())) {readDevice(device);} else {//没有权限,进行申请usbManager.requestPermission(device.getUsbDevice(), pendingIntent);}}if (storageDevices.length == 0) {showToastMsg("请插入可用的U盘");}}private UsbMassStorageDevice getUsbMass(UsbDevice usbDevice) {for (UsbMassStorageDevice device : storageDevices) {if (usbDevice.equals(device.getUsbDevice())) {return device;}}return null;}private void readDevice(UsbMassStorageDevice device) {try {device.init();//初始化//设备分区Partition partition = device.getPartitions().get(0);//文件系统FileSystem currentFs = partition.getFileSystem();currentFs.getVolumeLabel();//可以获取到设备的标识//通过FileSystem可以获取当前U盘的一些存储信息,包括剩余空间大小,容量等等Log.e("Capacity: ", currentFs.getCapacity() + "");Log.e("Occupied Space: ", currentFs.getOccupiedSpace() + "");Log.e("Free Space: ", currentFs.getFreeSpace() + "");Log.e("Chunk size: ", currentFs.getChunkSize() + "");cFolder = currentFs.getRootDirectory();//设置当前文件对象为根目录} catch (Exception e) {e.printStackTrace();}}private void showToastMsg(String msg) {Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();}private void readTxtFromUDisk(UsbFile usbFile) {UsbFile descFile = usbFile;//读取文件内容InputStream is = new UsbFileInputStream(descFile);//读取秘钥中的数据进行匹配StringBuilder sb = new StringBuilder();BufferedReader bufferedReader = null;try {bufferedReader = new BufferedReader(new InputStreamReader(is));String read;while ((read = bufferedReader.readLine()) != null) {sb.append(read);}Message msg = mHandler.obtainMessage();msg.what = 101;msg.obj = read;mHandler.sendMessage(msg);} catch (Exception e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}} catch (IOException e) {e.printStackTrace();}}}
}

对应布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.ldm.androidudisk.MainActivity"android:orientation="vertical"><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Android盒子外接U盘文件读写测试DEMO"android:layout_gravity="center"android:layout_margin="10dp"/><EditText
            android:id="@+id/u_disk_edt"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:hint="输入要保存到U盘中的文字内容"/><Button
            android:id="@+id/u_disk_write"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:text="往U盘中写入数据"/><Button
            android:id="@+id/u_disk_read"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:text="从U盘中读取数据"/><TextView
            android:id="@+id/u_disk_show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="10dp"/>
</LinearLayout>

文件操作工具类:

package com.ldm.androidudisk.utils;import android.os.Environment;import com.github.mjdev.libaums.fs.UsbFile;
import com.github.mjdev.libaums.fs.UsbFileOutputStream;import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import static android.os.Environment.getExternalStorageDirectory;/*** 文件操作工具类** @author ldm* @description:* @date 2016-4-28 下午3:17:10*/
public final class FileUtil {public static final String DEFAULT_BIN_DIR = "usb";/*** 检测SD卡是否存在*/public static boolean checkSDcard() {return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());}/*** 从指定文件夹获取文件** @return 如果文件不存在则创建, 如果如果无法创建文件或文件名为空则返回null*/public static File getSaveFile(String folderPath, String fileNmae) {File file = new File(getSavePath(folderPath) + File.separator+ fileNmae);try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}return file;}/*** 获取SD卡下指定文件夹的绝对路径** @return 返回SD卡下的指定文件夹的绝对路径*/public static String getSavePath(String folderName) {return getSaveFolder(folderName).getAbsolutePath();}/*** 获取文件夹对象** @return 返回SD卡下的指定文件夹对象,若文件夹不存在则创建*/public static File getSaveFolder(String folderName) {File file = new File(getExternalStorageDirectory().getAbsoluteFile()+ File.separator+ folderName+ File.separator);file.mkdirs();return file;}/*** 关闭流*/public static void closeIO(Closeable... closeables) {if (null == closeables || closeables.length <= 0) {return;}for (Closeable cb : closeables) {try {if (null == cb) {continue;}cb.close();} catch (IOException e) {e.printStackTrace();}}}private static void redFileStream(OutputStream os, InputStream is) throws IOException {int bytesRead = 0;byte[] buffer = new byte[1024 * 8];while ((bytesRead = is.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}os.flush();os.close();is.close();}/*** @description 把本地文件写入到U盘中* @author ldm* @time 2017/8/22 10:22*/public static void saveSDFile2OTG(final File f, final UsbFile usbFile) {UsbFile uFile = null;FileInputStream fis = null;try {//开始写入fis = new FileInputStream(f);//读取选择的文件的if (usbFile.isDirectory()) {//如果选择是个文件夹UsbFile[] usbFiles = usbFile.listFiles();if (usbFiles != null && usbFiles.length > 0) {for (UsbFile file : usbFiles) {if (file.getName().equals(f.getName())) {file.delete();}}}uFile = usbFile.createFile(f.getName());UsbFileOutputStream uos = new UsbFileOutputStream(uFile);try {redFileStream(uos, fis);} catch (IOException e) {e.printStackTrace();}}} catch (final Exception e) {e.printStackTrace();}}
}

不要忘记在app/build.grade下添加:

compile 'com.github.mjdev:libaums:0.5.5'

及AndroidManifest.xml中添加权限:

  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

时间关系,就不贴图了,欢迎指导交流。

Android设备与外接U盘实现数据读取操作相关推荐

  1. android手机icoude邮件,如何在Android设备上访问Apple应用和数据?教程来了!

    原标题:如何在Android设备上访问Apple应用和数据?教程来了! 对于一些出于工作原因,拥有ios和Android不同系统手机的人来说,有时候会觉得在共享资料或数据上会比较麻烦.但是,其实并非如 ...

  2. Android文件存储编程实验,Android编程中File文件常见存储与读取操作demo示例

    本文实例讲述了Android编程中File文件常见存储与读取操作.分享给大家供大家参考,具体如下: MainActivity文件代码如下: package example.com.myapplicat ...

  3. android spp服务,使用Android设备通过SPP通过蓝牙发送数据

    我正在尝试将数据从 Android设备发送到支持串行端口配置文件(SPP)的远程蓝牙设备.我注意到每按一次按钮后打开和关闭一个插座,它就太慢了.应该在Run()和Onclick()函数中执行哪些套接字 ...

  4. 安卓变身linux,能让 Android 设备变身Linux启动盘DriveDroid

    作为一个经常接触电脑的人,不知道你有没有遇到过去朋友家玩,突然他的系统有问题,虽然你会解决这些问题,但是无奈手头上木有一个U盘或其他维护用的光盘!没办法重装系统?不管你之前有多牛X,遇到这样的问题也只 ...

  5. android设备连接蓝牙扫描枪获取数据

    第一步,开启连接 首先要开启蓝牙并且找到蓝牙扫描枪连接,在自己的应用中添加权限 <uses-permission android:name="android.permission.BL ...

  6. 芯片读取设备详解+U盘芯片flash读取分析实录_一篇看够

    当我们在分析 IOT 设备,如智能摄像头.智能门锁.智能路由器等等产品时,采用传统的安全检测手段,如对 APP 的逆向.云端服务器的渗透测试.产品通信的抓包等方式可以获得部分的信息,但如果需要深入分析 ...

  7. arcgis for Android 100.3.0 加载shp数据以及操作

    ArcGIS Runtime 100.2.0的正式发布带来个更多移动端的处理地图的能力,例如支持WMS图层.支持海图(ENC)图层,再如基于场景相机(Camera)的视域分析.同时还提供了新的统计查询 ...

  8. u盘内容无故消失了怎么恢复 u盘恢复数据怎么操作

    u盘内容无故消失了怎么恢复?为什么u盘里面的内容会无缘无故消失掉,总是有原因的,下面就给大家分享具体原因和数据恢复方法,希望能够帮到您! u盘数据无故丢失常见原因: 情况一.文件被隐藏了:在电脑中查看 ...

  9. MySQL Explain命令详解--表的读取顺序,数据读取操作的类型等

    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的) 不损失精确 ...

最新文章

  1. Redhat 5 配置DHCP服务器
  2. mysql按升序创建索引_Mysql中的降序索引底层实现
  3. 安装Putty远程终端连接工具
  4. python 【第一篇】基础数据类型
  5. Activiti中的关于子流程中的并发节点标记处理
  6. php @touch,touch - [ php中文手册 ] - 在线原生手册 - php中文网
  7. 记录TCP协议使用Socket连接,客户端请求服务器read()阻塞问题
  8. zeromq php server,zeromq   php 轻量级队列
  9. 《WebGL编程指南》学习笔记——3.在Canvas中使用WebGL
  10. 数据库系统概论知识点
  11. Spring源码下载及构建技巧
  12. 了解计算机技术的课件,了解计算机课件.ppt
  13. ORA-01427:单行子查询返回多个行
  14. 百度×TCL丨鸿鹄语音芯片首次在家电行业量产!
  15. 宝塔面板的数据库地址配置
  16. Begging_Rust(译):做算术(第二章)
  17. MAC 常用终端命令
  18. [HDU]1205 吃糖果 [抽屉原理]
  19. ffmpeg源码分析 (二)
  20. opensuse13.1安装金山快盘

热门文章

  1. 掌握盲打?写个脚本陪自己练,每天练一遍,基本上一个星期就成了!
  2. 虚拟机linux修复grub,日常系统维护之修复linux的grub引导
  3. SQL Server2012 提示不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
  4. 华为智慧屏SE55通过FTP远程文件管理-实简FTP v1.6.30
  5. 多个微信服务号对接一个微信商户号流程
  6. 网站制作教程是什么?这些步骤要知道
  7. 瞬时测频接收机matlab_瞬时测频接收机
  8. CentOS 8 清除 DNS 缓存的方法
  9. windows中定时操作(SetTimer函数用法)
  10. MATLAB——patch绘制多边形