适配Android 8 遇到的问题---apk下载、安装、通知栏不显示等问题

生活虐你千百遍,你要待生活如初恋!!  

今天仍然很忙,抽出1h,来梳理下内容

这里简单记录下在工作过程中,适配Android8遇到的坑,Android 9 、10 、持续更新...


当targetSdkVersion小于26时,没有问题,当targetSDK等于26时,就会出现下述问题。

(1)APK文件下载失败

(2)通知栏不显示

(3)下载成功没有跳出应用安装界面

问题1: APK文件下载失败

       是因为代码中申请的其实是READ_EXTERNAL_STORAGE读存储权限,这在Android O(Android 8.0)之前是没有任何问题的,因为读写是一组权限,同属存储权限,只要申请了同组权限中的一个,同组中的其他在清单文件中列出了的权限也就被授予了。但是Android O(Android 8.0)运行时权限有了变动,就是系统只会授予应用明确请求的权限,然而一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准,但是还是需要去申请,这点和Android O(Android 8.0)之前不同。由于这里创建下载文件,实际上是往存储中写文件,需要写存储权限WRITE_EXTERNAL_STORAGE,于是将代码点击更新时申请READ_EXTERNAL_STORAGE改为申请WRITE_EXTERNAL_STORAGE。运行测试,APK文件是可以下载成功了。第一个问题得到解决。

问题2: 通知栏不显示

       在Android O(Android 8.0)之前的手机上,更新下载APK文件时,通知栏会显示下载进度的通知,然而Android O(Android 8.0)的手机上,targetSDK等于26时,下载文件并没有通知栏显示。查看官网Android O行为变更,发现通知的创建与显示发生了变化,创建通知之前还需要创建一个NotificationChannel

示例代码如下:

private NotificationManagernotificationManager;

private Notificationnotification; //下载通知进度提示

private Notification.Builderbuilder;

private boolean flag =false; //进度框消失标示 之后发送通知

private final static int NOTIFY_ID =100;

NotificationCompat.BuildermBuilder =null;

private void showNotification() {

notificationManager = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);

    String CHANNEL_ID ="your_custom_id";//应用频道Id唯一值, 长度若太长可能会被截断,

    String CHANNEL_NAME ="your_custom_name";//最长40个字符,太长会被截断

    mBuilder =new NotificationCompat.Builder(mContext, CHANNEL_ID);

    // notification = new NotificationCompat.Builder(mContext, CHANNEL_ID)

    final Notification notification =mBuilder.setContentTitle("")

.setSmallIcon(R.mipmap.logo_jgz_icon)

.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher_round))

.setAutoCancel(true)

.build();

    //Android 8.0 以上需包添加渠道

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

NotificationChannel notificationChannel =new NotificationChannel(CHANNEL_ID,

                CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);

        notificationManager.createNotificationChannel(notificationChannel);

    }

notificationManager.notify(NOTIFY_ID, notification);

}


问题3:APK文件下载成功没有正常跳到应用安装界面

        Android O (Android 8.0) 中,Google 移除掉了容易被滥用的“允许未知来源”应用的开关,在安装 Play Store 之外的第三方来源的 Android 应用的时候,竟然没有了“允许未知来源”的检查框,如果你还是想要安装某个被自己所信任的开发者的 app,则需要在每一次都手动授予“安装未知应用”的许可。

首先在AndroidManifest.xml 清单文件中添加安装未知来源应用的权限

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

然后在用户点击更新时判断是否开启了该应用的“允许安装未知来源”的权限,没有的话,就引导用户去开启该应用的“允许安装未知来源”的权限,判断代码如下:

private void installAPK(){

      boolean hasInstallPerssion = getPackageManager().canRequestPackageInstalls();

            if (hasInstallPerssion ) {

              //安装应用的逻辑

             intentAPK()

            } else {

              //跳转至“安装未知应用”权限界面,引导用户开启权限,可以在onActivityResult中接收权限的开启结果

                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);

                startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP);

            }

          }

//接收“安装未知应用”权限的开启结果

@Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_UNKNOWN_APP) {

            installAPK();

        }

    }

  //安装应用的逻辑

priviate void  intentAPK(){

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

File file = new File(absolutePath);

Log.e("install", absolutePath);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 7.0+以上版本Uri apkUri = FileProvider.getUriForFile(BaseApps.getInstance(), BaseApps.getInstance().getPackageName() + ".fileProvider", file);

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

intent.setDataAndType(apkUri, "application/vnd.android.package-archive");

} else {

intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");

}

startActivity(intent);

}

到此,今天的内容整理完毕,继续回到工作的烧脑状态...

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

推荐阅读更多精彩内容