如何访问连接到设备的USB记忆棒上的媒体文件(例如图像/视频)?

时间:2018-08-20 11:53:16

标签: android mediastore android-external-storage usb-drive

我正在为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设备(如果已连接)的媒体文件。谢谢。

2 个答案:

答案 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