本来是计划每个月至少写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就可以了。不过要注意的是:
- 要操作外置存储设备,除了要求支持诸如OTG功能外,还要添加存储卡读写权限,其中读取外接入硬盘要求系统 权限,我们项目中是通过修改硬件来实现这个功能的。
- 网上有个 比较好用的框架:https://github.com/magnusja/libaums,用来操作外置U盘等,之前项目中也在用,但是这个项目目前 似乎只支持FAT32格式 的,不支持NTFS格式的,但FAT32最大支持32G的存储,所以我们要使用NTFS格式的存储设备,这个框架暂时用不上,或许我还没有发现对应的使用的方法。