我正在为Android开发一种File Explorer类型的应用程序,其中显示了内部和外部存储中所有文件的分类视图。例如,为了列出设备存储中存在的所有视频文件,我应用了以下代码:
private void loadVideos()
{
Cursor cursor;
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Video.Media.BUCKET_DISPLAY_NAME,MediaStore.Video.Media._ID,MediaStore.Video.Thumbnails.DATA,MediaStore.Video.Media.TITLE, MediaStore.Video.Media.DURATION};
final String orderBy = MediaStore.Video.Media.TITLE;
int data,folder,id,thumb,title,duration;
cursor = getApplicationContext().getContentResolver().query(uri, projection,null,null, orderBy);
id = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
thumb = cursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA);
title = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE);
duration= cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
while(cursor.moveToNext()) {
long length = Long.parseLong(cursor.getString(duration)) / 1000;
long minutes = length / 60;
long seconds = length % 60;
items.add(new VideoItem(cursor.getString(title),cursor.getString(thumb),cursor.getString(id),properFormat(minutes)+":"+properFormat(seconds)));
}
adapter.notifyDataSetChanged();
cursor.close();
}
一切正常,除了我连接USB设备时。在这种情况下,它仅显示设备上存在的那些视频,而不显示USB设备中的视频文件。
我已经检查过的东西:
1)授予外部存储权限。
2)USB设备已成功安装,因为它会显示在“设置”中,而其他应用程序(例如MX Player)也会显示USB设备中的视频文件。
我也对目前是 MediaStore.Video.Media.EXTERNAL_CONTENT_URI 的Uri表示怀疑。
但是根据它的名字,它应该可以解决问题,尽管它显然不适用于外部设备?谁能指导我哪里可能出问题了? 目的是显示来自Phone的内部存储,外部存储(如Micro SD卡)和任何外部USB设备(如果已连接)的媒体文件。谢谢。
答案 0 :(得分:1)
UsbConstants指出,USB_CLASS_MASS_STORAGE
将是8
-因此我想说,您需要在device_filter.xml
中引用Manifest.xml
,其中注册Activity
是处理媒体的方法。
<activity
...
>
...
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"/>
</activity>
,然后在引用的device_filter.xml
中过滤设备类8
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device class="8"/>
</resources>
答案 1 :(得分:0)
为了查询更新的MediaStore,必须确保MediaScanner完成扫描并收到ACTION_MEDIA_SCANNER_FINISHED
。