Android 7.0以上关于调用系统播放器Uri传值问题的解决

在Android 7.0以后 为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用"file:///"绝对路径来传递文件地址的方式,在接收方访问时很容易触发SecurityException的异常。

因此,为了更好的适配Android 7.0,例如相机拍照这类涉及到文件地址传递的地方就用上了FileProvider,FileProvider也更好地进入了大家的视野。

其实FileProvider是ContentProvider的一个特殊子类,本质上还是基于ContentProvider的实现,FileProvider会把"file:///"的路径转换为特定的"content://"形式的content uri,接收方通过这个uri再使用ContentResolver去媒体库查询解析。
详细解决步骤如下:

public void playVideo(String path,String type){
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File file = new File(path);//path为文件路径 type为 video/* ,audio/*,image/*
        int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
//        Uri uri = Uri.fromFile(file);
        Uri uri= FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileProvider",file);
        intent.setDataAndType(uri, type);
        intent.setFlags(flags);
        mContext.startActivity(intent);
    }
  1. 在AndroidManifest.xml 配置 provider

```bash
<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.xinrui.filemanager.fileProvider" //此次换成 包名 +.fileProvider
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
3.在 res 下 新建xml 然后取名为filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <root-path path="." name="ccb_xls" />//代表所有类型的路径
    </paths>
</resources>

4. 这样配置就 完美解决了 FileProvider(Failed to find configured root that contains)




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
调用系统相机拍摄照片后,可以通过以下步骤获取照片的Uri: 1. 在调用相机时,使用`startActivityForResult()`方法启动相机,并传递一个请求码,例如: ``` Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); ``` 2. 在`onActivityResult()`方法中获取相机返回的数据,包括照片的缩略图和Uri: ``` protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); Uri photoUri = data.getData(); // 处理照片 } } ``` 如果需要直接获取照片的Uri,可以通过以下步骤: ``` protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Uri photoUri = data.getData(); if (photoUri == null) { // 如果返回的Uri为null,则通过Intent中的extras获取照片数据,并将其保存到指定路径中 Bitmap imageBitmap = (Bitmap) data.getExtras().get("data"); photoUri = saveImage(imageBitmap); } // 处理照片 } } private Uri saveImage(Bitmap imageBitmap) { // 将照片保存到指定路径,并返回其Uri File imageFile = new File(getExternalFilesDir(null), "photo.jpg"); try (OutputStream os = new FileOutputStream(imageFile)) { imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); } catch (IOException e) { e.printStackTrace(); } return Uri.fromFile(imageFile); } ``` 在上述代码中,如果返回的Uri为null,则通过Intent中的extras获取照片数据,并将其保存到指定路径中,然后返回该路径对应的Uri。注意,这种方式获取的是照片的缩略图,如果需要获取原始照片,可以通过保存照片到指定路径的方式来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓兼职framework应用工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值