Android中使用外置存储设备(U盘/移动硬盘等)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/true100/article/details/79239513
本来是计划每个月至少写2篇博客的,可是2018年的第一个月就失言了。上个月实在是太忙了,从元旦收假上班开始,就开启了天天加班的新年征程,周六一样不放过。
谁让我是IT人呢?不过偶尔加班也没什么不好,对工作负责,做出让客户满意的产品是我们职场人必须具备的东西。
好了,费话不多说,今天记录的是安卓项目中如何使用外置的存储设备(U盘/移动硬盘等)。
项目中需要把大量数据(如视频文件等)保存备份起来,仅仅依靠我们手机或安卓盒子这点存储容量,远远不能实现我们的要求。
所以项目上要求通过USB接入个置的移动硬盘(1T)来存储我们的数据。目前做的盒子项目,但是手机项目盒子项目开发起来没有啥区别,那就直接开始上代码。
public class MainActivity extends Activity {

    //定义监听存储设备的插入及拔出广播
    private MonitorUsbReceiver usbReceiver;
    //定义外置存储设备的文件(对应根目录文件)
    private File mExternalFile = null;
   //查询到所有存储设备列表(盒子有自带存储卡,还有外接入的U盘或移动硬盘)
    private List<StorageInfo> storageInfos = new ArrayList<>();
    /**
     * 注册广播
     */
    private void registerReceiver() {
        usbReceiver = new MonitorUsbReceiver();
        IntentFilter intentFilter = new       IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
        //添加广播对应ACTION
        intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);
        intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        intentFilter.addDataScheme("file");
        registerReceiver(usbReceiver, intentFilter);
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        registerReceiver();

    }


    /**
     * 获取U盘中指定的文件
     *
     * @param fileName
     * @return
     */
    private File getBackupsDbFile(String fileName) {
        List<File> files = new ArrayList<>();
        if (null != mExternalFile && mExternalFile.listFiles() != null) {
            for (File usbFile : mExternalFile.listFiles()) {
                if (usbFile.getName().equals(fileName)) {
                    files.add(usbFile);
                }
            }
        }
        if (files.size() > 0) {
            return files.get(0);
        } else {
            return null;
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //不要忘记在这里解注册广播
        unregisterReceiver(usbReceiver);
    }

    public class MonitorUsbReceiver extends BroadcastReceiver {
        private final String ROOT_PATH = "/storage";
        private final String SD_PATH = "/storage/external_storage/sdcard1";
        private final String SD_PATH_EQUAL = "/storage/sdcard1";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Uri uri = intent.getData();
            String path = uri.getPath();
            if (action == null || path == null)
                return;
            if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
                Toast.makeText(context, "外置存储设备已插入", Toast.LENGTH_SHORT).show();
              //监听到存储设备插入后,开始进行文件相关操作
              getBackupsDbFile("test.apk");//比如获取其中的文件,对文件进行操作(我在项目中有一个功能就是获取指定的apk文件,然后安装apk)
            } else if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
                Toast.makeText(context, "外置存储设备已拔出", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
代码基本上就是这样,主要是介绍获取外置存储设备方法,具体的文件操作没有啥好说的,java原生api就可以了。不过要注意的是:
  1. 要操作外置存储设备,除了要求支持诸如OTG功能外,还要添加存储卡读写权限,其中读取外接入硬盘要求系统 权限,我们项目中是通过修改硬件来实现这个功能的。
  2. 网上有个 比较好用的框架:https://github.com/magnusja/libaums,用来操作外置U盘等,之前项目中也在用,但是这个项目目前 似乎只支持FAT32格式 的,不支持NTFS格式的,但FAT32最大支持32G的存储,所以我们要使用NTFS格式的存储设备,这个框架暂时用不上,或许我还没有发现对应的使用的方法。

猜你喜欢

转载自blog.csdn.net/true100/article/details/79239513