栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

android.os.FileUriExposedException:exposed beyond app through ClipData.Item.getUri()

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

android.os.FileUriExposedException:exposed beyond app through ClipData.Item.getUri()

最近调用系统相机拍摄图片的功能,一开始是直接调用相机拍摄但是图片返回的是缩略图,所以非常模糊,于是就传入图片保存路径进行高清图保存,拍摄成功之后就直接加载保存的地址就可以拿到高清图片,先看看代码

        //存储路径
        val fileName =
            File(getOutDirectory(this@RecordActivity), "${System.currentTimeMillis()}.jpg")
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        //调用系统拍照,传入照片输出路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(fileName))
        val startActivity =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                if (it.resultCode == Activity.RESULT_OK) {
                    //结果成功回调
                }
            }
        startActivity.launch(intent)

一运行然后就直接挂了,出现了异常:

 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.*****/files/Pictures/pic/1644281998867.jpg exposed beyond app through ClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:2089)
        at android.net.Uri.checkFileUriExposed(Uri.java:2388)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:977)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10792)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10777)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1712)
        at android.app.Activity.startActivityForResult(Activity.java:5258)
        at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:568)
        at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:237)
        at androidx.activity.ComponentActivity$2.onLaunch(ComponentActivity.java:215)
        at androidx.activity.result.ActivityResultRegistry$3.launch(ActivityResultRegistry.java:147)
        at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:42)

出现异常的主要原因:对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常,谷歌提供了FileProvider,使用它可以生成content://来替代file://URI

在首先AndroidManifest.xml中添加提provider

        
            
        

 然后在res目录下新建xml包新增文件provider_paths.xml(res/xml/provider_paths.xml)



    

 然后修改传入照片保存路径方式:

        //存储路径
        val fileName =
            File(getOutDirectory(this@RecordActivity), "${System.currentTimeMillis()}.jpg")
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        //调用系统拍照,传入照片输出路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
            FileProvider.getUriForFile(this@RecordActivity, "$packageName.fileprovider", fileName))
        val startActivity =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                if (it.resultCode == Activity.RESULT_OK) {
                    //结果成功回调
                }
            }
        startActivity.launch(intent)

然后重新运行就ok了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731893.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号