解决安卓10获取外部存储权限问题,导致播放本地视频文件错误。

当项目 targetSdkVersion >28  的时候,以前的获取 /storage/emulated/0/DCIM/Camera/xxx.mp4 的路径会访问不到,因为安卓10

文件存储机制修改成了沙盒模式。

应用只能访问自己沙盒下的文件和公共媒体文件。坑的一匹,天天改。还是要多看更新文档啊。

 

解决办法:1.把自己项目的版本降低到28  

2.在项目AndroidManifest.xml 中的 application 标签中加入  

android:requestLegacyExternalStorage="true"

即可访问。

3.如果以上两种方法都不想,就头铁,要适配。那么就需要把原来的本地文件Uri复制到自己项目的沙盒文件中

/**
 *
 * @param uri 本地文件URI
 * @return  安卓10本地项目的文件的路径
 */
@RequiresApi(api = Build.VERSION_CODES.Q)
public static File uriToFileApiQ(Context context, Uri uri) {
    File file = null;
    //android10以上转换
    if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
        file = new File(uri.getPath());
    } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        //把文件复制到沙盒目录
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor.moveToFirst()) {
            String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
            try {
                InputStream is = contentResolver.openInputStream(uri);
                File cache = new File(context.getExternalCacheDir().getAbsolutePath(), Math.round((Math.random() + 1) * 1000) + displayName);
                FileOutputStream fos = new FileOutputStream(cache);
                FileUtils.copy(is, fos);
                file = cache;
                fos.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return file;
}

OK了。对于适配因素,自己去判断下版本对应下,那么对应的file.getPath就是文件私有目录了比如:

/storage/emulated/0/Android/data/自己项目的包名/cache/xxxx.mp4  

拿到这个路径就可以播放视频 图片 或者其它任何东西啦

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值