Android 11 - 如何访问和打开媒体文件?

问题描述

我有一个视频录制应用,可以录制并将其保存在外部存储中,特别是应用特定的存储 /storage/emulated/0/Android/data/com.example.xxxx/files

我使用 context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) 将其保存到文件路径 /storage/emulated/0/Android/data/com.example.xxxx/files/Movies

读取 context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) 目录中的视频文件有效。我可以打印文件名。但是我无法访问和打开实际文件。我正在使用这个函数来检索视频文件

public static File getAppSpecificVideoFile(Context context,String fileName) {
        // external storage.
        File file = new File(context.getExternalFilesDir(
                Environment.DIRECTORY_MOVIES),fileName);
       
        return file;
    }

所以整个视频路径为 /storage/emulated/0/Android/data/com.example.xxxx/files/Movies/filename.3gp

我已经允许所需的权限。

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

并启用 android:requestLegacyExternalStorage="true"

也用这个方法请求权限

  private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            try {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.addCategory("android.intent.category.DEFAULT");
                intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
                startActivityForResult(intent,2296);
            } catch (Exception e) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivityForResult(intent,2296);
            }
        } else {
            //below android 11
            ActivityCompat.requestPermissions(this,new String[]{WRITE_EXTERNAL_STORAGE,Manifest.permission.MANAGE_EXTERNAL_STORAGE},2296);
        }
    }

private boolean checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        return Environment.isExternalStorageManager();
    } else {
        int result = ContextCompat.checkSelfPermission(this,READ_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(this,WRITE_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
    }
}

编辑 我的问题是使用 Intent Intent.ACTION_VIEW 访问文件。根据文档。

在 Android 11 上,应用无法再访问任何其他应用中的文件 外部存储中的专用应用程序特定目录。

我的解决方案是创建自己的视频播放器,如 ExoPlayer。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)