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

How to access Media files (such as images/video) present on a USB stick connected to a device?

我正在为 Android 构建一个文件浏览器类型的应用程序,它显示了内部和外部存储中存在的所有文件的分类视图。例如,要列出设备存储中存在的所有视频文件,我应用了以下代码:

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) Permissions for external storage is granted.
2) USB device is successfully mounted because it shows up in Settings as well as other apps such as MX Player shows video files from USB device.

我也对当前为 MediaStore.Video.Media.EXTERNAL_CONTENT_URI 的 Uri 有疑问。

不过听名字感觉应该是可以的,虽然明明不能外接设备?谁能指导我哪里可能出错? 目标是显示来自 Phone 的内部存储、外部存储(如 Micro SD 卡)和任何外部 USB 设备(如果已连接)的媒体文件。谢谢

UsbConstants 指出,USB_CLASS_MASS_STORAGE 将是 8 - 因此我想说,您需要在 Manifest.xml 中引用 device_filter.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 中过滤设备 class 8:

<?xml version="1.0" encoding="utf-8"?>  
<resources>
    <usb-device class="8"/>
</resources>

为了查询更新的 MediaStore,您必须确保 MediaScanner 完成扫描并收到 ACTION_MEDIA_SCANNER_FINISHED