美文网首页工作生活
Android 8.0+通知栏兼容以及APK安装问题

Android 8.0+通知栏兼容以及APK安装问题

作者: 小明从教科书中复活了 | 来源:发表于2019-07-04 17:22 被阅读0次

    Android 8.0+ 通知栏兼容问题

    当build.gradle里的targetSdk=23时(各大应用市场陆续提出此需求),之前app更新时使用的通知栏处理的代码出现了兼容性问题,Android O以后通知栏必须设置channelId,如果你把targetSdk设为23,之前的创建Notification.Builder代码会提示过时 new NotificationCompat.Builder(this),需要使用new NotificationCompat.Builder(this, channelId)来创建
      private void createNotification() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                String channelId = "channel_update";
                String channelName = "更新apk";
                mBuilder = new NotificationCompat.Builder(this, channelId);
                int importance = NotificationManager.IMPORTANCE_LOW;
                NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
                mNotifyManager.createNotificationChannel(channel);
                mBuilder.setSmallIcon(R.mipmap.notify_icon);
            } else {
                mBuilder = new NotificationCompat.Builder(this);
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
                    mBuilder.setSmallIcon(R.mipmap.notify_icon);
                } else {
                    mBuilder.setSmallIcon(R.mipmap.app_icon_new);
                }
            }
            if (getApplicationInfo().labelRes != 0) {
                String appName = getString(getApplicationInfo().labelRes);
                mBuilder.setContentTitle(appName);
            } else {
                mBuilder.setContentTitle("xxxx");
            }
        }
    
    而且在5.0以后谷歌要求对通知栏的图标做处理,所以如果你发现你的通知栏图标变成了白色小方块,不要慌,求助UI帮你切一张图,要求就是:背景色透明,然后用白色画图案
    下载更新完成后 install APK 的时候又会有兼容问题,因为android 7以后需要使用FileProvider,代码如下:
      /**
         * 安装APK文件
         */
        private void installApk(File file) {
            if (file == null || !file.getPath().endsWith(".apk")) {
                return;
            }
            Intent intent = new Intent(Intent.ACTION_VIEW);
    
            if (Build.VERSION.SDK_INT >= 24) {
                Uri apkUri = FileProvider.getUriForFile(this, "yourAppId.provider", file);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
            } else {
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            }
            startActivity(intent);
    
            //强制更新时,安装应用程序前退出应用,这里最好是加上一点延迟,防止获取不到FileProvider,可以使用Handler或者RxJava
            if (bForceUpdate) {
               //设置延迟,防止退出应用前未获取FileProvider
                mDisposable = Observable.timer(500, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread())
                        .subscribeOn(Schedulers.io()).subscribe(new Consumer<Long>() {
                            @Override
                            public void accept(Long aLong) throws Exception {
                                EventBus.getDefault().post(new ForceExitBean());
                            }
                        });
            }
        }
    
    同时不要忘记了要在AndroidManifest里面配置你的provider:
     <!-- ### provider start ### -->
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/你的自定义命名" />
            </provider>
    
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path name="external_storage_root" path="."/>
    </paths>
    

    相关文章

      网友评论

        本文标题:Android 8.0+通知栏兼容以及APK安装问题

        本文链接:https://www.haomeiwen.com/subject/tqgrhctx.html