targetSdkVersion升级为26之后的适配

1、权限的动态申请
这个是targetSdkVersion为23时,对于一些比较危险的权限,需要动态申请,网上很多资料,库也很多。
2、随着Android版本越来越高,Android对隐私的保护力度也越来越大。
比如:Android6.0引入的动态权限控制(Runtime Permissions),
Android7.0又引入“私有目录被限制访问”,“StrictMode API 政策”。
这些更改在为用户带来更加安全的操作系统的同时也为开发者带来了一些新的任务。如何让你的APP能够适应这些改变而不是crash,是摆在每一位Android开发者身上的责任。
“私有目录被限制访问“ 是指在Android7.0中为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目录将被限制访问。这点类似iOS的沙盒机制。
" StrictMode API 政策" 是指禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。
接下来就用FileProvider来解决这一问题
1)在AndroidManifest.xml清单文件中注册provider

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

2)在项目的res文件夹下新建xml文件夹,然后新建filepaths.xml,名字要与清单文件中的一致

android:resource="@xml/filepaths"

3)编写filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
    <files-path name="name" path="path" /> 对应Context.getFilesDir() + “/path/”,即/data/data/<package-name>/files/text/。
    -->
    <!--<files-path-->
        <!--name="my_files"-->
        <!--path="text/" />-->
    <!--
    <cache-path name="name" path="path" /> 对应Context.getCacheDir() + “/path/”,即/data/data/<package-name>/cache/text/。
    -->
    <!--<cache-path-->
        <!--name="my_cache"-->
        <!--path="text/" />-->
    <!--
    <external-path name="name" path="path" /> 对应Environment.getExternalStorageDirectory() + “/path/”,即/storage/emulated/0/path/
    -->
    <external-path
        name="myFile"
        path="" />
</paths>

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

 Intent installIntent = new Intent(Intent.ACTION_VIEW);
        installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        if (Utils.isAndroid7()) { //判读版本是否在7.0以上
            //参数1 上下文, 参数2 Provider主机地址 和清单文件中保持一致   参数3  共享的文件
            Uri apkUri = FileProvider.getUriForFile(context,"com.dh.test.fileprovider", file);
            //添加这一句表示对目标应用临时授权该Uri所代表的文件installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            installIntent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
installIntent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
        }
        context.startActivity(installIntent);

3、通知Notification
Android8.0其中一项行为变更是Notification,Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。targeSdk升级到26之后,所有的通知的实现都需要提供通知渠道,如果不提供通知渠道的话,所有通知在8.0系统上面都不能正常展示。

private NotifyManager() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 NotificationChannel channel =
                    new NotificationChannel("channel_id1", "channel_name1", NotificationManager.IMPORTANCE_DEFAULT);
            channel.enableVibration(true);
//            channel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
            //是否在桌面icon右上角展示小红点
//            channel.enableLights(true);
//            Uri mUri = Settings.System.DEFAULT_NOTIFICATION_URI;
//            channel.setSound(mUri, Notification.AUDIO_ATTRIBUTES_DEFAULT);
//            NotificationManager notifyManager = (NotificationManager) MyApplication.getInstance().getSystemService(Context.NOTIFICATION_SERVICE);
            getManager().createNotificationChannel(channel);

        }
    }

public void sendNotification(String title, String content) {
        //获取NotificationManager实例
//        NotificationManager notifyManager = (NotificationManager) MyApplication.getInstance().getSystemService(Context.NOTIFICATION_SERVICE);
        //实例化NotificationCompat.Builde并设置相关属性
        Notification notification = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification.Builder builder = new Notification.Builder(MyApplication.getInstance(), channelId);
            //设置小图标
            builder.setSmallIcon(R.mipmap.ic_launcher)
                    //设置通知标题
                    .setContentTitle(title)
                    //设置通知内容
                    .setContentText(content)
                    .setAutoCancel(true);//用户触摸时,自动关闭
            notification = builder.build();
        } else {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(MyApplication.getContext())
                    //点击通知后自动清除
                    .setAutoCancel(true)
                    //设置小图标
                    .setSmallIcon(R.mipmap.ic_launcher)
                    //设置通知标题
                    .setContentTitle(title)
                    //设置通知内容
                    .setContentText(content);
//                .setDefaults(Notification.DEFAULT_SOUND);// 设置通知响应方式  ;
//        .setContentIntent(mainPendingIntent);
            //设置通知时间,默认为系统发出通知的时间,通常不用设置
            //.setWhen(System.currentTimeMillis());
            //通过builder.build()方法生成Notification对象,并发送通知,id=1
            notification = builder.build();
            //这通知的其他属性,比如:声音和振动
            notification.defaults |= Notification.DEFAULT_SOUND;
            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
        }
        getManager().notify(count, notification);
        count++;
    }

4、8.0上版本升级无法跳转安装页面
Android 8.0强化了权限管理,变得更加安全。在Android 8.0以前,只要在设置中打开允许未知应用的安装,则所有的未知来源应用都可以被安装,如此设计虽然方便,但是若被引诱安装了恶意软件,安装"未知来源"的应用有可能会对手机系统带来潜在的危害;
而在Android 8.0的系统中,未知来源应用权限的开关被移除掉了,取而代之的是未知来源应用的管理列表,如果你想要安装某个被自己所信任的开发者的app,则需要在每一次都手动授权"安装未知应用"的许可。
坑就在这里了,下面是解决办法:
1)清单文件中添加

<!--android8.0版本更新跳转安装页面 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2)代码:

 Intent installIntent = new Intent(Intent.ACTION_VIEW);
        installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        if (Utils.isAndroid7()) { //判读版本是否在7.0以上
            //参数1 上下文, 参数2 Provider主机地址 和清单文件中保持一致   参数3  共享的文件
            Uri apkUri = FileProvider.getUriForFile(context,"com.dh.test.fileprovider", file);
            //添加这一句表示对目标应用临时授权该Uri所代表的文件installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            installIntent.setDataAndType(apkUri, "application/vnd.android.package-archive");
      //兼容8.0
            if (Utils.isAndroid8()) {
                boolean hasInstallPermission = context.getPackageManager().canRequestPackageInstalls();
                if (!hasInstallPermission) {
                    startInstallPermissionSettingActivity(context);
                    return;
                }
            }
        } else {
installIntent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
        }
        context.startActivity(installIntent);
/**
     * 跳转到设置-允许安装未知来源-页面
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity(final Context context) {
        //注意这个是8.0新API
        Uri packageURI = Uri.parse("package:" + context.getPackageName());
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      context.startActivity(intent);
    }

当用户打开了允许安装未知应用后,返回再次点击安装按钮,就可以跳转到安装页面了。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,350评论 0 17
  • 我也知道, 河里有只白鹅, 它尝不出葱油饼的滋味。 我也知道, 枝丫上有枚枇杷, 它听不到果儿落水的咕咚声。 我也...
    于凡尘发现真我阅读 284评论 0 1
  • 参加21天爱上写作活动,到今天坚持写下了十七篇文章了。 这中间,因为工作家庭的忙碌,深感每天时间紧迫,写下的一些文...
    玲珑小记阅读 325评论 1 0