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

  

现在越来越多手机支持OTG功能,通过OTG可以实现与外接入的U盘等USB设备实现数据传输。

  

, USB OTG(去)作为0的补充协议,于2001年由USB提出。它提出的背景是移动消费类电子产品的迅猛增加,而之前USB协议的主从协议标准让这些电子产品在离开电脑电脑时的数据传输变得艰难,OTG技术正是为了解决这一问题的标准。

  

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

  

通过OTG技术实现设备间端到端互联
  

  

OTG协议规定连接时默认情况作为主机的设备为一个设备,一个设备负责为总线供电;默认作为设备的设备为B设备(USB OTG标准在完全兼容USB2.0标准的基础上,增加了一个ID销;ID拉低为默认一个设备);而有些设备由于集成了主机控制器和设备控制器,既可以作一个设备又可以做B设备,称为dura-role设备。
  

  

最近项目上用到了该功能,项目上用的是安卓7.1的盒子,要实现与插入的U盘进行数据操作。通过大量的找资料,终于实现了项目上需要的功能。找资料主要是解决两个问题:

  
      <李> U盘权限问题   <李> U盘文件路径及文件操作李   
  

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

  

代码部分:

        公共类MainActivity AppCompatActivity延伸实现视图。OnClickListener {//输入的内容   私人EditText u_disk_edt;//写入到U盘   私人按钮u_disk_write;//从U盘读取   私人按钮u_disk_read;//显示读取的内容   私人TextView u_disk_show;//自定义U盘读写权限   私有静态最终字符串ACTION_USB_PERMISSION=癱om.android.example.USB_PERMISSION”;//当前处接U盘列表   私人UsbMassStorageDevice [] storageDevices;//当前U盘所在文件目录   私人UsbFile cFolder;   私人最终的静态字符串U_DISK_FILE_NAME=" u_disk.txt”;   私人处理程序mHandler=new处理程序(){   @Override   公共空间handleMessage(消息味精){   开关(msg.what) {   100年情况:   showToastMsg(“保存成功”);   打破;   101年情况:   字符串txt=msg.obj.toString ();   如果(! TextUtils.isEmpty (txt))   u_disk_show。setText(“读取到的数据是:”+ txt);   打破;   }   }   };      @Override   保护空白>   & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   LinearLayout & lt;   xmlns: android=" http://schemas.android.com/apk/res/android "   xmlns:工具=" http://schemas.android.com/tools "   android: layout_width=" match_parent "   android: layout_height=" match_parent "   工具:上下文=" com.ldm.androidudisk.MainActivity "   面向android:=按怪薄北?      & lt; TextView   android: layout_width=" wrap_content "   android: layout_height=" wrap_content "   android:文本=" android盒子外接U盘文件读写测试演示”   android: layout_gravity="中心"   android: layout_margin=" 10 dp”/比;      EditText & lt;   android: id=癅 + id/u_disk_edt”   android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android: layout_margin=" 10 dp”   android:提示="输入要保存到U盘中的文字内容”/比;         & lt;按钮   android: id=癅 + id/u_disk_write”   android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android: layout_margin=" 10 dp”   android:重力="中心"   android:文本="往U盘中写入数据”/比;      & lt;按钮   android: id=癅 + id/u_disk_read”   android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android: layout_margin=" 10 dp”   android:重力="中心"   android:文本="从U盘中读取数据”/比;      & lt; TextView   android: id=癅 + id/u_disk_show”   android: layout_width=" wrap_content "   android: layout_height=" wrap_content "   android: layout_gravity="中心"   android: layout_marginLeft=" 10 dp”/比;   & lt;/LinearLayout>      之前      

文件操作工具类:

        包com.ldm.androidudisk.utils;      进口android.os.Environment;      进口com.github.mjdev.libaums.fs.UsbFile;   进口com.github.mjdev.libaums.fs.UsbFileOutputStream;      进口java.io.Closeable;   进口java.io.File;   进口java.io.FileInputStream;   进口java.io.IOException;   进口java.io.InputStream;   进口java.io.OutputStream;      进口静态android.os.Environment.getExternalStorageDirectory;/* *   *文件操作工具类   *   * @author ldm   * @description:   * @date 2016-4-28下午3:17:10   */最后公共类FileUtil {   公共静态最终字符串DEFAULT_BIN_DIR=皍sb”;/* *   *检测SD卡是否存在   */公共静态布尔checkSDcard () {   返回Environment.MEDIA_MOUNTED.equals(环境   .getExternalStorageState ());   }/* *   *从指定文件夹获取文件   *   * @return如果文件不存在则创建,如果如果无法创建文件或文件名为空则返回零   */folderPath公共静态文件getSaveFile(字符串,字符串fileNmae) {   文件文件=新文件(getSavePath (folderPath) + File.separator   + fileNmae);   尝试{   file.createNewFile ();   }捕捉(IOException e) {   e.printStackTrace ();   }   返回文件;   }/* *   *获取SD卡下指定文件夹的绝对路径   *   * @return返回SD卡下的指定文件夹的绝对路径   */folderName getSavePath公共静态字符串(字符串){   返回getSaveFolder (folderName) .getAbsolutePath ();   }/* *   *获取文件夹对象   *   * @return返回SD卡下的指定文件夹对象,若文件夹不存在则创建   */公共静态文件getSaveFolder(字符串folderName) {   文件文件=新文件(getExternalStorageDirectory ()   .getAbsoluteFile ()   + File.separator   + folderName   + File.separator);   file.mkdirs ();   返回文件;   }/* *   *关闭流   */公共静态孔隙closeIO (Closeable…closeables) {   如果(null==closeables | | closeables。长度& lt;=0) {   返回;   }   (Closeable cb: closeables) {   尝试{   如果零==(cb) {   继续;   }   cb.close ();   }捕捉(IOException e) {   e.printStackTrace ();   }   }   }      私有静态孔隙redFileStream (OutputStream os, InputStream)抛出IOException {   int bytesRead=0;   缓冲区byte[]=新的字节(1024 * 8);   在((bytesRead=is.read(缓冲)!=1){   操作系统。写(缓冲区,0,bytesRead);   }   os.flush ();   os.close ();   is.close ();   }/* *   * @description把本地文件写入到U盘中   * @author ldm   * @time 2017/8/22十   */公共静态孔隙saveSDFile2OTG(最终文件f,最后UsbFile UsbFile) {   UsbFile uFile=零;   FileInputStream fis=零;   {//试开始写入   fis=new FileInputStream (f);//读取选择的文件的   如果(usbFile.isDirectory()){//如果选择是个文件夹   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

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