安卓6.0,7.0,8.0版本适配

安卓版本更新换代,对用安卓手机的人来说,是越来越有保障了,这是好事,但是对开发者来说,代码量就得增加了,不跟上谷歌的版本进度,那些买了新手机的人,可能就用不了你的app了,报错闪退,真的好烦,今天就说说,这三年,安卓四大版本,我们代码要怎么搞。

Android6.0

    在6.0之前的版本中,我们在使用某项权限时,只需要在Manifest中声明就可以使用了,但是在6.0之后,某些权限(例如:通讯录、位置、相机)不仅需要在Manifest中声明,还要在app运行的时候动态地申请并被用户允许才能正常使用。

需要动态获取的权限有:

举个例子,在AndroidManifest中, 添加两个权限,  录音和修改音量

.危险权限必须要授权, 一般权限不需要.在使用涉及隐私的安全权限时,需要动态申请,虽然不难,但写下来代码工作量也不少,而且几乎每个应用都需要用到

    <!--危险权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <!--一般权限-->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

在java代码中写动态申请权限的逻辑(这是官网的写法),通过弹窗,提醒客户打开权限

        //判断是否已经赋予权限
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.RECORD_AUDIO)
                != PERMISSION_GRANTED) {
            //如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.RECORD_AUDIO)) {
                //这里可以写个对话框之类的项向用户解释为什么要申请权限,
                // 并在对话框的确认键后续再次申请权限.它在用户选择"不再询问"的情况下返回false
            } else {
                //申请权限,字符串数组内是一个或多个要申请的权限
                // 1是申请权限结果的返回参数,
                // 在onRequestPermissionsResult可以得知申请结果
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.RECORD_AUDIO,}, 1);
            }
        }

随后重写onRequestPermissionsResult()方法来监听用户是否点击开启权限。

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1) {
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] == PERMISSION_GRANTED) {
                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

官方提供的方法在一次申请多个权限的时候代码逻辑写起来比较繁琐,于是有了第三方框架RxPermissions。RxPermissions是使用Rxjava封装的第三方的权限申请库,他的特点是借助Rxjava的特性简化了权限申请的代码逻辑,使代码看起来简洁易读。

Android7.0

我们要关注的是分屏和应用私有文件,首先说一下分屏;

  • 如果不想适配分屏模式,可以在Manifest的activity标签下设置属性android:resizeableActivity="false"
  • 如果是固定宽高的界面,设置android:minimalHeight、android:minimalWidth来设置分屏模式下的最小宽高。
  • 在分屏模式下调整窗口大小会回调onConfigurationChanged,系统将忽略对android:screenOrientation 属性所作的更改。

然后说一下,应用私有文件,经常会用到

访问应用私有文件,在7.0版本之前,我们可以通过File://这一类Uri访问其他应用的私有文件或者让其他应用访问自己的私有文件。例子,拍照功能,返回的Uri,如果尝试传递 file:// Uri来访问其他应用的私有文件会触发 FileUriExposedException异常。

解决方案,在AndroidManifest中添加FileProvider

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

在 res/xml 目录下新建一个 xml 文件,用于存放应用需要共享的文件目录,这里我命名为file_paths.xml

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

    <!--根目录下的pictures目录(eg:/storage/emulated/0/pictures)-->
    <external-path path="pictures" name="camera_photos" />
    <root-path
        name="root_path"
        path="." />

</paths>

随后在java代码内if判断后,7.0以上版本执行的Uri为下列方法获得,生成一个文件的Content URI,在这里

File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "image.jpg");
Uri contentUri = getUriForFile(getContext(), "包名", newFile);
//getUriForFile()方法返回 content URI,值为content://包名/my_images/image.jpg

Android 8.0

1,在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。说到底,6.0的坑,8.0填上去。这个倒是没必要细谈。

2,应用安装到Android7系统上面可正常使用,但是安装到Android8上面,就是死活收不到广播。具体看官网https://developer.android.google.cn/about/versions/oreo/android-8.0

3,Android 8.0还去除了“允许未知来源”选项,所以如果我们的App有安装App的功能(检查更新之类的),那么会无法正常安装。首先在AndroidManifest文件中添加安装未知来源应用的权限,这样系统会自动询问用户完成授权。

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

4.后台执行限制
应用在两个方面受到限制:

  • 后台服务限制:处于空闲状态时,应用可以使用的后台服务存在限制。 这些限制不适用于前台服务,因为前台服务更容易引起用户注意。
  • 广播限制:除了有限的例外情况,应用无法使用清单注册隐式广播。 它们仍然可以在运行时注册这些广播,并且可以使用清单注册专门针对它们的显式广播。

在大多数情况下,应用都可以使用 JobScheduler 克服这些限制。 这种方式让应用安排为在未活跃运行时执行工作,不过仍能够使系统可以在不影响用户体验的情况下安排这些作业。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值