【问题标题】:Accessing media files using Scoped Storage on Android 10 or higher在 Android 10 或更高版本上使用 Scoped Storage 访问媒体文件
【发布时间】:2021-12-28 04:18:43
【问题描述】:

我想在 Android >=10 上使用 Media Store 访问共享存储中的媒体文件/视频。 我阅读了谷歌开发者文档但没有得到答案(https://developer.android.com/training/data-storage/shared/media)。 我想使用 MediaStore.Video 从共享存储访问视频。

我尝试了以下代码,但它没有工作,甚至没有打开选择菜单的菜单:

public class MainActivity extends AppCompatActivity {
 
    List<Video> videoList = new ArrayList<Video>(); //Video is a class.
    Uri collection;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //Media Store
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
        } else {
            collection = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
 
        }
        String[] projection = new String[] {
                MediaStore.Video.Media._ID,
                MediaStore.Video.Media.DISPLAY_NAME,
                MediaStore.Video.Media.DURATION,
                MediaStore.Video.Media.SIZE
        };
        String selection = MediaStore.Video.Media.DURATION +
                " >= ?";
        String[] selectionArgs = new String[] {
                String.valueOf(TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES))
        };

        String sortOrder = MediaStore.Video.Media.DISPLAY_NAME + " ASC";
        try (Cursor cursor = getApplicationContext().getContentResolver().query(
                collection,
                projection,
                selection,
                selectionArgs,
                sortOrder)) {
            // Cache column indices.
            int idColumn = ((Cursor) cursor).getColumnIndexOrThrow(MediaStore.Video.Media._ID);
            int nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
            int durationColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
            int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);
 
            while (cursor.moveToNext()) {
                // Get values of columns for a given video.
                long id = cursor.getLong(idColumn);
                String name = cursor.getString(nameColumn);
                int duration = cursor.getInt(durationColumn);
                int size = cursor.getInt(sizeColumn);
 
                Uri contentUri = ContentUris.withAppendedId(
                        MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);
 
                // Stores column values and the contentUri in a local object
                // that represents the media file.
                videoList.add(new Video(contentUri, name, duration, size));
            }
        }
    }
}
 
 
//Video Class
public class Video {
    private final Uri uri;
    private final String name;
    private final int duration;
    private final int size;
 
    public Uri getUri() {
        return uri;
    }
 
    public String getName() {
        return name;
    }
 
    public int getDuration() {
        return duration;
    }
 
    public int getSize() {
        return size;
    }
 
    public Video(Uri uri, String name, int duration, int size) {
        this.uri = uri;
        this.name = name;
        this.duration = duration;
        this.size = size; 
    }
}

【问题讨论】:

  • want to access the media files/ videos from the shared storage using Media Store 好的。但也将其放在您帖子的主题中。
  • 检查是否返回任何视频而不添加任何过滤器,为selectionselectionArgs传递null并查看。

标签: java android scoped-storage


【解决方案1】:

您的代码没有问题,但您没有请求外部存储读取权限。

在您的AndroidManifest.xml 文件中添加以下权限

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ....
</manifest>

并在运行时请求此权限,如 Request App Permissions 所示。

【讨论】:

  • 并将其显示在某处或将其记录下来,以便您可以轻松找到它是否有效。否则你必须用断点调试你的代码才能找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2022-11-21
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多