Android 7.0 系统相机崩溃解决android.os.FileUriExposedException

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF) 米哈游是全球知名游戏开发商,以《原神》《崩坏》系列著称,专注二次元文化与AI技术创新。本文整理了10道AI产品经理面试题,涵盖Transformer架构、智能NPC设计、机器学习应用、AIGC产品规划等核心领域。题目既考察技术理解(如RAG原理、多模态模型),又关注产品落地(游戏平衡性优化、伦理安全),同时强调跨团队协作能力。参考答案均结合米哈游业务场景,体现技术驱动与玩家体验并重的产品思维,展现AI在游戏行业的创新应用前景。 阅读详情

最近市场开始强行要求适配7.0,无奈之下发现不少好文章,特此收藏记录。


一、写在前面
最近由于廖子尧忙于自己公司的事情和OkGo(一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护ImagePicker(一款支持单、多选、旋转和裁剪的图片选择器),也是处理了诸多bug,最近总算趋于稳定了,这里就把Android N (API 24) 以上的相机适配方案分享给大家。

  Android Nougat 也是被更新很久了,作为一名 Andorid 开发者,我们有义务时刻准备自己调整 targetSdkVersion 为最近的一个,于是从之前的 23 直接提高到了 25 。

  和往常一样,每当我们调整targetSdkVersion,我们需要检查我们的代码的每一部分工作的非常好。如果你只是简单地更改代码,我可以说,你的应用程序正在崩溃或故障的高风险。在这种情况下,当你改变你的应用程序的targetSdkVersion 24,我们需要检查每一个功能完美的作品在Android的牛轧糖(24)以上。
拿到 7.0 的小米5测试机后,迫不及待对自己维护的ImagePicker测试了一个遍,然而的确和大家所提的issuse一样,在调用系统相机的时候直接崩溃了。

二、到底是什么引发了 7.0 相机崩溃

跟进错误日志到源码发现,在我们调用相机获取 Uri 的时候发生了崩溃。

这里写图片描述

原因很明显,file:// 不被允许作为一个附加的 Uri 的意图,否则会抛出 FileUriExposedException 。

三、为什么在 Android Nougat 下 file:// 不被允许?

你可能会很好奇为什么 Android 团队决定改变这种行为。
其实背后有一个很好的理由,如果文件路径被发送到目标应用程序(相机应用程序在这种情况下),文件将完全访问通过相机应用程序的过程,而不仅仅只有发起者能收到。


这里写图片描述

但让我们考虑一下,实际上是由我们的应用程序去启动摄像头拍照,并保存作为我们的应用程序的代表文件。因此,该文件的访问权限应该是我们的应用程序而不是摄像头应用程序本身。这就是为什么现在 file:// 在 targetSdkVersion 24 中要求每一位开发者都去完成这个任务。

四、那到底怎么解决?

既然 file:// 不再被允许,那我们应该怎么处理呢?答案是通过 FileProvider 去解决它。


这里写图片描述

我们应该怎么让 FileProvider 解决好它。

1、首先是在 AndroidManifest.xml 中申明

        <provider
            android:authorities="${applicationId}.provider"
            android:name=".ImagePickerProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

2、创建一个provider_paths.xml 文件在 res文件夹下的 xml 文件夹下。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

3、在适当的地方去替换它

                Uri uri;
                if (VERSION.SDK_INT <= VERSION_CODES.M){
                    uri = Uri.fromFile(takeImageFile);
                }else{
                    /**
                     * 7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider
                     * 并且这样可以解决MIUI系统上拍照返回size为0的情况
                     */
                    uri = FileProvider.getUriForFile(activity, ProviderUtil.getFileProviderName(activity), takeImageFile);
                }

                Log.e("nanchen",ProviderUtil.getFileProviderName(activity));
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,uri);

五、几点说明

对于上面的三步操作,做几点说明:
1、在 AndroidManifest.xml 文件中对 provider 的 name 属性申明为什么是 .magePickerProvider (实际上这是一个继承自 FileProvider 但什么也没实现的类) 而不直接把name赋为android.support.v4.content.FileProvider ?
这是因为 ImagePicker 作为一个图片选择框架,而你的 App 中同样可能会有申明,为了避免 Android Studio 在编译的时候 merge 各个 Module 导致冲突,这里保险起见的申明了一个不一样的名字。

2、为什么在 AndroidManifest.xml 文件中申明的 authority 属性为 ${applicationId}.provider , 而不是固定的名字。

这是因为在 Android 中,要求 authority 必须是唯一的,如果你在定义一个 provider 的时候为它指定一个唯一的 authority,这里且拿 ImagePicker 做比方,假如你在一个 App 上使用了 ImagePicker 作为图片选择框架,而你在另外一个应用中再次使用 ImagePicker 的时候,系统会检查当然已安装应用的 authority 是否和你要安装应用的 authority 相同,如果相同则会弹出下面的警告,并安装失败。


这里写图片描述

所以我们在定义 authorities 的时候采用 applicationId + provider 的形式,在获取 authorities 的时候,我们可以通过包名 + provider 的方式获取。代码如下:

package com.lzy.imagepicker.util;

import android.content.Context;

/**
 * 用于解决provider冲突的util
 *
 * Author: nanchen
 * Email: liushilin520@foxmail.com
 * Date: 2017-03-22  18:55
 */

public class ProviderUtil {

    public static String getFileProviderName(Context context){
        return context.getPackageName()+".provider";
    }
}

六、写在最后

以上便解决了 Android N 的相机崩溃问题,如有写的不对的地方,欢迎大家在评论区留言。


转载至:Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException

android 数据库锁的问题 最近在项目中遇到一个错误: 12-26 17:29:10.501 32592 32644 W SQLiteConnectionPool: The connection pool for database '***.db' has been unable to grant a connection to thread 1378 (thread-pool-0) with flags 0x2 for... 阅读详情

相关推荐

对工时评估的思考:当AI颠覆了coding效率

在AI时代,“人日”作为软件工时度量衡已然失效。开发的价值核心正从“编码实现”转向“深度思考”与“精准沟通”——即如何将人类的模糊需求精确地传达给AI。当最有价值的“思想工作”变得最难量化时,传统的项目管理范式随之动摇。我们必须超越对过程的算计,开始探索衡量思想、沟通与业务价值的新标尺。

架构师刘7的博客 1017

android-Camera 崩溃分析

本文是对android摄像头进行一些分析。在编译的时候发现了错误,报出了w/CameraBase:An error occurred while connecting to camera:0 以及 W/System.error:java.lang.RuntimeException:Fail to connect to camera service; (1)在java端掉用的代码如下: priv

一只狍子的博客 1万+

解密m3u8视频合并:从猫抓插件到本地文件修改全流程

本文详细解析了m3u8视频合并的全流程,特别针对加密视频片段提供了解决方案。从使用猫抓插件捕获m3u8文件地址,到利用N_m3u8DL-CLI工具自动下载、解密并合并ts片段,手把手教你处理AES-128加密等常见问题,最终生成完整的本地MP4文件,适合需要备份或处理流媒体资源的用户。

weixin_29290947的博客 1358

Android galaxy s4调用系统相机杀死进程

在三星galaxy s4手机上面使用下面代码:                                         intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);             intent.putExtra(MediaStore.EXTRA_OUTPUT,                     Uri.fr

u013842074的专栏 1596

手把手教你学Simulink--FIR滤波器的设计与优化仿真

FIR滤波器的设计目标通常包括指定的频率响应特性(如低通、高通、带通或带阻),以及特定的应用需求(如线性相位、最小化误差等)。Simulink提供了一个直观且强大的平台来模拟这些设计,并允许用户通过调整参数实时观察其对系统性能的影响。明确你的系统需求,比如输入信号类型(如正弦波组合)、采样率、FIR滤波器的设计参数(如滤波器类型、阶数、截止频率等)。假设我们需要设计一个低通FIR滤波器,用来去除高于1kHz的所有频率成分,保留低于1kHz的信号成分。采样率为8kHz。

MHD0815的博客 345

C++程序发生内存越界,一定会导致程序崩溃吗?详解内存越界

内存越界是否一定会导致程序崩溃吗?详解内存越界

dvlinker的技术专栏 1万+

Android7.0调用系统相机奔溃问题

Android7.0对系统权限进一步的进行了限制,以往的相机调用方式无法满足7.0以上的使用,会造成系统奔溃,在网上一翻搜索直接看到了各种方式来解决,包括FilePrvider和Content Uri的使用。 在这里推荐一种解决方法,该方法不需要修改原有代码,只需要在Application中点击两行代码即可解决。 //解决Android7.0 调用相机奔溃问题 if (B

就酱的博客 399

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

解决 Android N 上报错:android.os.FileUriExposedException: file:///storage/emulated/0/

解决android N文件访问crash android.os.FileUriExposedException file:///storage/emulated/0/xxx原因:Android N对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。 而进行此授权的最简单方式是使用 FileProvider

猫的阁楼 9万+

2.3 MMU Notifier(上):KVM 催生的页表变化通知

探讨了MMU Notifier机制的作用及其在虚拟化等场景中的应用。当CPU页表发生变更(如munmap、页面迁移等操作)时,需要通知拥有"第二套页表"的子系统(如KVM的EPT/NPT、IOMMU、GPU等)失效其映射。MMU Notifier通过订阅-通知机制实现这一功能,核心数据结构包括mmu_notifier订阅对象和回调接口mmu_notifier_ops。当CPU页表修改时,通过mmu_notifier_range描述变更范围,调用订阅者的回调函数进行同步,确保外部MMU与CPU页表一致性。

图形/计算GPU的驱动与虚拟化技术分享园地 1025

提示词编写:从新手到专家的进阶之路

本文旨在为提示词编写者提供一条从新手到专家的进阶之路。我们将详细探讨提示词编写的背景与意义、基础与进阶技巧、实战应用以及最佳实践。通过逐步深入的分析与实操,读者将掌握提示词编写的核心要点,提高编写效率和作品质量。提示词是用于引导人工智能生成文本的关键词或短语,它包含了作者想要传达的主题、情感和细节。随着人工智能技术的普及,自动化写作工具逐渐应用于各行各业。为了提高写作效率,项目团队决定开发一款基于人工智能的自动化写作工具。成功开发了一款自动化写作工具,生成文本质量较高。

AI天才研究院 1085

android拍照程序崩溃,Android7.0调用相机崩溃

1、崩溃场景**当用户使用android7.0系统的手机调用相机或者打开相册、读取写入文件时崩溃2、崩溃的描述android.os.FileUriExposedException这个错误提示针对于权限部分,Android7.0是google推出的对权限做了一个更新即不允许出现以file://的形式调用隐式APP系统,也就是说以前呢,Uri的获取方式是以file://xxx的样式来,那么我们也就是通...

weixin_35628611的博客 898

对雷达中相位补偿概念的一些理解

基于多普勒相位补偿的速度扩展方法和DBF测角,两者本质上都是对相位进行补偿。

qq_42235129的博客 4030

Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException

该文章同步发表到博客园:http://www.cnblogs.com/liushilin/p/6602364.html 一、写在前面      最近由于廖子尧忙于自己公司的事情和OkGo(一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护ImagePicker(一款支持单、多选、旋转和裁剪的图片选择器),也是处理了诸多bug,最近总算趋于稳定了,这里就把Android N (

刘世麟的博客 747

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【适配整理】Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException

目录 一、写在前面二、到底是什么引发了 7.0 相机崩溃三、为什么在 Android Nougat 下 file:// 不被允许?四、那到底怎么解决?五、几点说明六、写在最后   正文 回到顶部 一、写在前面      最近由于廖子尧忙于自己公司的事情和 OkGo (一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护 ImagePicker(一款支

AIFBD 789

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android拍照程序崩溃,Android 7.0拍照崩溃问题

问题:android 7.0手机打开相机出现崩溃?android.os.FileUriExposedException:file:///storage/emulated/0/Pictures/IMG_20170315065632.jpg expos解决方案:使用ContentProvider方式具体解决代码如下:Intent intent = new Intent(MediaStore.ACTIO...

weixin_35976717的博客 353

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 7.0 按钮崩溃,Android 7.0调用相机崩溃详解及解决办法

Android 7.0调用相机崩溃解决办法错误提示:android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_1041503431.jpg exposed beyond app through ClipData.Item.getUri()处理方式/*** Open camera*/private void sho...

weixin_31874577的博客 176

android 7.0 手机调用手机相机、相册常见的两个崩溃:FileUriExposedException、SecurityException

今天在写项目的时候,遇到两个与手机相机、相册相关的崩溃crash,现总结如下,以后少跳坑。 android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData() java.lang.SecurityException: Perm...

ZhangRui的博客 2459

Android 7.0拍照出现android.os.FileUriExposedException异常

兼容Android 7.0系统的手机拍照;调用Android 7.0及以上版本拍照; android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.test.android.debug/files/Pictures/b

There is nothing 3882

【转】如何解决Android7.0及以上的权限崩溃问题

大家好,一直想着写点什么来在记叙开发中遇到的问题和解决方案,激励自己,分享给需要的小伙伴! 话说自从google出来Android 7.0系统之后,我们公司的测试小伙伴就向我提出了7.0的bug,接下来就着手查阅了下问题是出在哪里的,该如何来解决呢。 bug日志是长这样子的: android.os.FileUriExposedException: file:///storage/...

lixuce1234的博客 2965

如何解决Android7.0及以上的权限崩溃问题

原文地址:http://blog.csdn.net/lixuce1234/article/details/69577309 话说自从google出来Android 7.0系统之后,我们公司的测试小伙伴就向我提出了7.0的bug,接下来就着手查阅了下问题是出在哪里的,该如何来解决呢。 bug日志是长这样子的: android.os.FileUriExposedExcepti

写代码的足球迷的博客 4857

解决Android 7.0, 8.0手机相机崩溃问题

在android 7.0之后的手机上用以上代码打开相机、相册会报如下错误: android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()  解决方法:  1、在manifest清单文件中注册provider &lt;provider android:name="android.su...

Hyg_99的博客 3105

android-解决 Android 7.0以上 访问相机或访问本地路径报错:android.os.FileUriExposedException

当我们在7.0之前访问相机 都是直接将 Uri.fromFile(new File(filePath)传进intent, 但是在7.0之后这样使用就会报异常,android.os.FileUriExposedException: file:///storage/emulated/0/.trainExam/head_icon_cache/headIcon.jpeg exposed beyond ap...

Mike_Fei的博客 1002

android 7.0 因为Uri.fromFile引起的FileUriExposedException异常

最近作者又碰到因为android 7.0 引起的兼容问题了。 在7.0以前的版本: //创建临时图片 File photoOutputFile = SDPath.getFile("temp.jpg", SDPath.PHOTO_FILE_STR); Uri photoOutputUri = Uri.fromFile(photoOutputFile); 这个file文件直接非常简单的转换成"f

android_an的博客 1万+
上一篇: Android 不解压直接读取zip包
下一篇: Android 使用Fiddler抓取Https请求
Mackkill
博客等级 码龄15年 65粉丝 39原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值