当前位置: 首页 > 知识库问答 >
问题:

在Android 10或更高版本上使用作用域存储访问媒体文件

扈瑞
2023-03-14

我想访问媒体文件/视频从共享存储使用媒体存储在Android上

我尝试了以下代码,但无效,甚至“菜单到选择”菜单也没有打开:

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; 
    }
}

共有1个答案

冷宏茂
2023-03-14

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

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

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

并在运行时请求此权限,如请求应用程序权限中所示。

 类似资料:
  • 有没有办法在Android/data文件夹之外的外部存储器中创建和保存文本文件?我正在创建一个音乐应用程序,并添加了一个预设管理器,以便用户可以保存、加载和编辑预设文件(在Android 11之前工作得很好),我不希望在卸载应用程序时自动删除这些文件。这就像在卸载Photoshop时,Photoshop删除了所有Photoshop文档一样,太糟糕了!这些是用户保存的文件,如果用户愿意,可以单独删除

  • 问题内容: 我想爱Django,但是开发环境中的静态文件和媒体文件业务让我发疯。请把我从愚蠢中解救出来。 我在开发机器上。我的项目目录的根目录中有文件夹。 在settings.py我有:和。 在我有: 但是我获取媒体文件的唯一方法是通过引用/media/media/例如 。 我期望(并且想要) 谁能告诉我这里发生了什么,并给我一个设置媒体文件处理的简单方法吗? 非常感谢你。 但这留下了两个问题:

  • 我正在使用存储访问框架将图像下载到外部sd卡。问题是这些图像不会出现在图库中。我试图通过发送DocumentFile uri来通知Android媒体扫描仪使用意图,但这似乎不起作用。下面是我如何尝试通知媒体扫描器添加了新图像: 有没有其他方法来通知Android添加了新图像?(我已经尝试了这里描述的方法,但我无法使用这些方法获得真实路径)

  • 我正面临Android N布局XML预览的问题。显示以下信息: “Android N要求IDE与Java 1.8或更高版本一起运行” 另外,我在我的操作系统中安装了Java1.8。 我怎么改变它?

  • 在Android10中,需要访问存储的应用程序需要获得访问具体路径的许可。但是像file explorer这样的应用程序可以请求访问根存储的权限,并获得对所有存储的读/写权限。这就是我正在努力做的。 根据Android,我们必须为此使用。我的问题是,一切似乎是正确的,但权限没有授予应用程序。

  • 我只是上传文件到谷歌云存储使用签名网址与Ajax上传。 已经完全上传了。但尝试从Bucket下载文件时,文件会像媒体文件一样损坏,否则pdf、txt文件工作正常。有什么建议请建议我谢谢。