Android targetSDK升级到26 后遇到的问题及解决方法

背景

现在国内Android市场都要求targetSdkVersion 升级到26,否则不允许上架或者更新。主要要求是:2019年5月1日后,未达到要求的新应用,拒绝提交应用市场。2019年8月1日后,未达到要求的已上架应用,拒绝更新。因此就开始了升级的踩坑之旅。

1.相机拍照崩溃(Android7.0引入“私有目录被限制访问”,“StrictModeAPI政策”)

升级之后使用之前的方式打开系统相机的方式会产生崩溃。会报下面的错误

Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.ct.client/files/com.ct.client/camere/1547090088847.jpg exposed beyond app through ClipData.Item.getUri()
解决方法:

第一步:在AndroidManifest.xml清单文件中注册provider

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.wr.test.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
       android:name="android.support.FILE_PROVIDER_PATHS"
       android:resource="@xml/file_paths" />
</provider>

第二步:指定共享文件的目录,需要在res文件夹中新建xml目录,并且创建file_pathswen文件

<?xml version="1.0" encoding="utf-8"?>
<!-- path:需要临时授权访问的路径(.代表所有路径)
name:就是你给这个访问路径起个名字-->
<paths>
   <external-path
       name="files_root"
       path="Android/data/com.wr.test/" />
   <external-path
       name="external_storage_root"
       path=" " />
</paths>

path="",它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了。如果你将path设为path="text",那么它代表着根目录下的text目录(/storage/emulated/0/text),如果你向其它应用分享text目录范围之外的文件是不行的。
第三步:

File fileUri = new File(Environment.getExternalStorageDirectory().getPath() + "/"
                    + SystemClock.currentThreadTimeMillis() + ".jpg");
imageUri = Uri.fromFile(fileUri);
Intent intentCamera = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    imageUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", fileUri);//通过FileProvider创建一个content类型的Uri
    intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文
 }
intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
 //将拍照结果保存至photo_file的Uri中,不保留在相册中
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PHOTO_REQUEST);

2.MODE_WORLD_READABLE模式废弃(SharedPreferences模式)

解决方法:

MODE_WORLD_READABLE 模式换成 MODE_PRIVATE

3. 8.0以上版本升级无法跳转安装页面(Android8.0强化了权限管理)

解决方法:

第一步:在manifast中新增权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

第二步:把

Intent intent = new Intent(Intent.ACTION_VIEW)

换为

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);

4.解析包安装失败

解决方法:

安装时把

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

这句话放在

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

前面

5.通知栏不显示(Android8.0引入了通知渠道)

解决方法:
        String id = getApplicationContext().getPackageName();
        String name = "name";
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel mChannel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW);
            notificationManager.createNotificationChannel(mChannel);
            notification = new Notification.Builder(getApplicationContext())
                    .setChannelId(id)
                    .setContentTitle(title)
                    .setContentText(content)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .setAutoCancel(true)//用户点击就自动消失
                    .setContentIntent(pendingIntent)
                    .setSmallIcon(R.mipmap.ic_launcher).build();
        } else {
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext())
                    .setContentTitle(title)
                    .setContentText(content)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .setAutoCancel(true)//用户点击就自动消失
                    .setContentIntent(pendingIntent)
                    .setOngoing(true)
                    .setChannelId(id);//无效
            notification = notificationBuilder.build();
        }
        notificationManager.notify(0, notification);

6.隐式广播限制(静态广播不可用)

安卓8.0对广播进行了限制接收广播消耗资源如果多个应用注册了系统广
播会持续消耗资源。

解决方法:

如果是注册系统广播不要在清单文件中注册了要根据自己的需要在代码中
注册比如少儿项目清单文件中注册了个像监听网络变化和投屏监听网络
的广播这些都可以在项目开启时动态注册
如果是自定义广播尽量也要动态注册如果实在需要静态注册可以尝试在
发送的时候携带intent.addFlags(0x01000000);

7.权限的动态申请(Android6.0引入的动态权限控制)

解决方法:

对运行时权限进行动态申请,建议使用easyPermission进行动态申请,也是Google官方建议使用的权限申请库。
easyPermission github地址

8..低电耗模式和应用待机模式限制

8.0系统待机一段时间后会进入低电量模式低电量模式下闹钟类AlarmManager功能会受到影响

解决方法:

设置闹钟时使用setInexactRepeating这个方法也是设置重复闹钟他会把几
个时间差不多的闹钟合并成一个执行相对来说更省电如果还是不行的话就要
申请电池白名单

  PowerManagerpowerManager=(PowerManager)
  activity.getSystemService(Context.POWER_SERVICE);
  if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
       //判断应用是否在去除低电耗的白名单中
      if (!powerManager.isIgnoringBatteryOptimizations(activity.getPackageName())){
        //申请白名单 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS意图intent
       Intentintent=new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
       activity.startActivity(intent);
       }
   }

以上就是遇到的问题和解决方法。
本文参考文章
Android8.0适配——targetSdkVersion 23升级26遇到的坑
targetSdkVersion升级为26之后的适配

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容