代码编织梦想

升了targetSdkVersion,出现了一些适配的问题,还有权限的问题,实在是不想升,但是没办法Google爸爸要求必须要升,硬着头皮上了。

我主要是面临两个方面的问题:
(1)权限的动态申请
(2)应用升级、拍照获取图片异常(这两个是同一个问题)

对于权限问题,相对来说还是比较简单的,我是采用了RxPermissions来做的。对于运行时权限有兴趣的可以去了解一下。主要是说第二个问题。

原来的话是定义一个文件地址,然后通过Uri.fromFile(cameraFile)就可以获取到相应的Uri,但是7.0往上,发现崩了。。。查了一下资料,原来是为了安全起见,面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。公开的话会抛出 FileUriExposedException 异常。要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。具体步骤如下:
(1)配置AndroidManifest

  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="你的应用包名.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

(2)在meta-data中我们注意到一个@xml/filepaths文件,需要我们自己创建,内容如下:

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

在paths内部有几个标签可选,分别如下:

<files-path name="name" path="path" /> --> Context.getFilesDir()
<cache-path name="name" path="path" /> --> getCacheDir()
<external-path name="name" path="path" /> --> Environment.getExternalStorageDirectory()
<external-files-path name="name" path="path" /> --> Context#getExternalFilesDir(String);Context.getExternalFilesDir(null)
<external-cache-path name="name" path="path" /> --> Context.getExternalCacheDir()
<external-media-path name="name" path="path" /> --> Context.getExternalMediaDirs()

因为我使用的是getExternalCacheDir() + "/tmp";,所以在filepaths中使用的是external-cache-path标签,path为tmp/
(3)在需要使用到Uri的地方:

//cameraFile为自己的缓存路径文件对象
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    //7.0以上系统采用新API拍照
    //这里的BuildConfig,需要是程序包下BuildConfig。
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
                             FileProvider.getUriForFile(activity.getApplicationContext(), BuildConfig.APPLICATION_ID + ".fileprovider", cameraFile));
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
    //7.0以下,直接调用相机即可
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
}
 activity.startActivityForResult(intent, requestCode);

到这里应用升级及拍照获取图片异常在7.0以上的适配就做好了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cp_Mark/article/details/80652935

android targetsdkversion 原理-爱代码爱编程

前几天 Google 官方发布文章解析 compileSdkVersion、minSdkVersion 以及 targetSdkVersion 的含义,以及合理设置各个值的意义,原文 Picking your compile

关于targetsdkversion=26适配8.0以上的一些坑_影魔的博客-爱代码爱编程

最近犹豫项目需要,需要把targetSDKVersion提升到26,原来以为只是一句代码搞定的事情,后来经测试发现的两个坑: 一:系统弹窗(悬浮窗)不生效 项目里使用了SYSTEM_ALERT_WINDOW     权限弹了在service里面设置了dialog的TYPE_SYSTEM_ALERT的 悬浮窗,发现不好用。解决办法: 如果应用使用

android项目该如何选择targetsdkversion_mawei7510的博客-爱代码爱编程

新手的第一个Android项目或许没有认真考虑过如何选择targetSdkVersion的问题,也或许还有一部分像TeachCourse一样的开发者,积累一些工作经验后才回头来思考这个问题。那么该如何选择一个targetSdkVersion的属性值?一个属性值为23的targetSdkVersion表示什么含义?那么API 24和Android 7.

google play 目标 api 等级(targetsdkversion)重要变更要求_砖头23333的博客-爱代码爱编程

Google Play 目标 API 等级(targetSdkVersion)重要变更要求 Google Play 从 2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须针对 Andr

谷歌强制升级targetsdkversion适配指导,参考华为_行者______的博客-爱代码爱编程

谷歌强制升级TargetSdkVersion适配指导 谷歌发布的Android P版本对TargetSdkVersion参数提出了要求,华为终端开放实验室迅速对TOP3000应用展开检测,测试结果不容乐观:超过300个应用出现了兼容性问题,不兼容率超过十分之一。 那么,在 P 版本适配过程中开发者该如何解决由TargetSdkVersion引入的兼容性

应用市场出新规,国内千款应用targetsdkversion调查分析_weixin_34304013的博客-爱代码爱编程

近期,谷歌针对Google Play上架应用发布强制性适配Android 8.0公告,要求自2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须基于 Android 8.0 (API 等级 26) 完成开发;11 月 1 日起,所有 Google Play 的现有应用也必须基于 Android 8.0完成更新。 同

google 发布2018年android平台新政策,终于强硬了一回!-爱代码爱编程

1. 背景 从 Android 6.0 开始,Google 开始逐渐收紧 Android 平台的开放性,并在进一步提升应用的安全性、性能以及隐私保护方面做出了许多努力。这一点,从 Google 在之后的 Android 7.0 和 8.0 上不断作出的调整就可以看出。 但事实上,开发者在开发过程中,迫于开发及维护成本,并没有及时响应并针对 G

android关于targetsdkversion26的注意点_augusyoung的博客-爱代码爱编程

背景:   两大巨头的意思就是:广大码农赶紧996吧,别再偷懒了。 下面开始正题: targetsdkversion26之后,修改主要有两点,一个是api修改,还有就是所有权限需要动态获取, 关于6.0以上动态获取权限的方法网上有很多,有很多很牛的库,本人就不在这里献丑了。(实际上部分第三方库的布局也需要修改调整) 主要给萌新解答几个疑点

Google上架apk 64位与 Android App Bundle以及targetSdk的要求-爱代码爱编程

Google上架爬坑: google上架自2019.08.01后开始要求有32必须对应有64位。 1、targetSdk的问题 之前接手这个项目的时候发现项目中用的targetSdk为26,习惯性的按照改成targetSdk28,改后发现项目运行起来不兼容部分高版本手机,由于紧急发版,又撤回了26。这次上架Google这个问题又暴漏出来了,Goog

targetSdkVersion 升级到 29、30 文件处理-爱代码爱编程

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:zhongjh链接:https://www.jianshu.com/p/892a2ca5c41e声明:本文已获zhongjh授权发表,转发等请联系原作者授权 android12要来了,很多老app还在29以下,该文章就是讲述升级到29、30关于文件的

GooglePlay上架流程-爱代码爱编程

上传准备阶段 1.需要生成aab包 使用上传签名文件签名后可以上传到googleplay管理台 2.如果是第一次新建项目 签名文件会成为googlePlay的上传签名 3.googleplay分发安装包时会自动进行签名 默认新项目会自动生成一个签名可以在应用完整性选项下查看 4.有些依赖第三方的需要用特定的签名文件签名 可以在管理台修改一次 修改后

Android 上传Google Play 市场打包成AAB文件-爱代码爱编程

前言 谷歌商店从2021.8月份起只支持AAB格式上传文件,Google Play同时要求应用适配Android11,即 targetSdkVersion要求大于等于30。从2021年8月开始发布新应用必须设置targetSdkVersion大于等于30;从2021年11月开始更新已经上架的应用必须设置targetSdkVersion大于等于30。

实战 Android 升级目标版本到 30 过程中遇到的问题及解决办法-爱代码爱编程

应谷歌应用商店要求,自11月1日起,所有上传到谷歌应用商店的应用将被强制要求升级目标 API 版本到 30, upgrade_to_30_policy.png 这里记录我升级目标版本到 30 的过程中遇到的问题。 1、Toast API 内部变更 1.1 问题详情 一般来说,这种 API 级别的变更不会被记录到官方的文档中,但是,遇到了就是

TargetSdkVersion改为30后在Android版本为12的GOOGLE手机上判断是否安装第三方APP出现判断异常-爱代码爱编程

1.判断手机是否安装第三方APP的代码: //通过包名断是否安装了该程序 public static boolean isAPPInstalled(Context context, String packageName) { PackageManager pm = context.getPackageManager();//获取packagema

googleplay发布应用: targetsdkversion 30 的要求_zhengzxj的博客-爱代码爱编程

如题:我是22年8月初提交aab的 targetSdkVersion 提示最低需要 targetSdkVersion 30 所以迁移之 1.搜索第三方包名,被过滤屏蔽  就是这个方法,里面的pinfo直接就是空的 解决办法: 在清单文件第一层添加代码: <queries> <package android:nam