自android3.1以后Android增加了操作USB设备的API。 官网地址:http://developer.android.com/guide/topics/connectivity/usb/host.html
网上也有很多这方面的文章,不过大多是都很复杂,和我们所熟悉的文件的读写操作不同,
最近公司要写一个多媒体播放软件,可以播放usb里面的视频,查了很多资料都没有发现怎么做,最后自己想了一个折中的方法,和大家分享一下,希望能帮到大家,当然要是知道正确的做法的还请告知。
为了有更好的体验我们需要监听usb的连接和断开,这里我们可以监听usb连接状态的广播,代码如下:
//注册广播的方法
private void registerUsbBroadcast() {
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(Intent.ACTION_MEDIA_EJECT);
iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
iFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
iFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
iFilter.addDataScheme("file");
registerReceiver(mBroadcastReceiver, iFilter);
}
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
//USB设备移除,更新UI
} else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
//USB设备挂载,更新UI
// String usbPath = intent.getDataString();(usb在手机上的路径)
}
}
};
相信大家也看到了,其实在广播接受者中我们可以通过intent.getDataString()
来获取usb在手机中的路径,但是要是用户在打开软件前已经插入了u盘,那么我们就接收不到这个广播,也就无法获取到u盘在手机上的路径了,可能大家已经想到了用静态注册广播,但是我试了在软件杀死的情况下我们是接收不到这个广播的(6.0系统)。
以下是我自己通过观察发现的一个折中的获取u盘在手机上的路径的方法:
通过多次的实验我发现了u盘的路径在/storage/u盘路径”
,于是我看了一下/storage
下的文件,发现u盘没有插入的时候就三个文件夹,其中一个就是我们的sd卡路径,剩下的两个都无法读取,于是我的思路就是:遍历/storage
目录下的文件夹,判断文件夹是否可读,在可读的文件夹中我们排除sd卡目录,那么剩下我都认为是u盘的路径,具体代码如下:
File storage = new File("/storage");
File[] files = storage.listFiles();
for (final File file : files) {if (file.canRead()) {
if (!file.getName().equals(Environment.getExternalStorageDirectory().getName())) {
//满足该条件的文件夹就是u盘在手机上的目录
}
}