一种笨拙的方法读取U盘中的媒体文件并播放
2019-12-30 本文已影响0人
Dale_Dawson
有这么一个需求:机顶盒读取U盘中的媒体文件展示并播放
U盘中的文件已这种方式存在,所以只能通过后缀名来区分文件类型
.jpg是媒体文件的一张海报
.lyric是歌曲的歌词
.message是歌曲的名字及歌手名字
.ts文件就是媒体文件
一、机顶盒获取U盘的目录
public class USBDiskReceiver extends BroadcastReceiver {
private static final String TAG = "USBDiskReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String path = intent.getData().getPath();
if (!TextUtils.isEmpty(path)) {
if ("android.intent.action.MEDIA_REMOVED".equals(action)) {
Log.e(TAG, "onReceive2: ---------------usb拨出-------------");
}
if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {
Log.e(TAG, "onReceive3: --------usb路径-------" + path);
if (!TextUtils.isEmpty(path)) {
CheckSongActivity.usbPath = path;
TaskDataHelper.handleWthxResponseMessage(new BaseResponse(), TaskEvent.TRIGGER_SONG_UPDATE, 111);
}
}
}
}
}
<receiver android:name=".USBDiskReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
上面这种只能在U盘插入的时候触发。
public static List getUSBPaths(Context con) {//反射获取路径
String[] paths = null;
List data = new ArrayList(); // include sd and usb devices
StorageManager storageManager = (StorageManager) con.getSystemService(Context.STORAGE_SERVICE);
try {
paths = (String[]) StorageManager.class.getMethod("getVolumePaths", null).invoke(storageManager, null);
for (String path : paths) {
String state = (String) StorageManager.class.getMethod("getVolumeState", String.class).invoke(storageManager, path);
if (state.equals(Environment.MEDIA_MOUNTED) && !path.contains("emulated")) {
data.add(path);
Logger.d("f", "usbPath=" + path);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
这种方法通过反射可以读出路径,但是还包含有sd卡的路径
List<String> list = usbDiskState.getUSBPaths(this);
if (list != null && !list.isEmpty()) {
if (list.size() == 1) {
usbPath = list.get(0);
} else {
for (String str : list) {
if (str != null && !str.contains("sdcard")) {
usbPath = str;
break;
}
}
}
}
所以使用以上方法获取到USB的路径
二、遍历分类文件
File path = new File(usbPath + "/wthx");
File[] files = path.listFiles();
parse(files);
for (File file : files) {
if (file.isDirectory()) {
parse(file.listFiles());
} else {
String fileName = file.getName();
if (fileName.endsWith(".ts")) {
} else if (fileName.endsWith(".jpg") || fileName.endsWith(".png")
|| fileName.endsWith(".bmp") || fileName.endsWith(".gif")) {
} else if (fileName.endsWith(".message")) {
} else if (fileName.endsWith(".lyric")) {
}
}
}
用以上方式可以找到对应的后缀名的文件,然后可以通过file.getAbsolutePath()获取文件所在的路径,当然现实图片或者是播放媒体文件,知道文件所在路径也就可以了。
别忘了权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
tools:ignore="ProtectedPermissions" />