Andorid适配计划

246 阅读5分钟

目前记录从Android5.0开始,放弃Android4.4的适配

Android6.0

运行时权限

危险权限列表:developer.android.google.cn/guide/topic…

  1. 向清单添加权限

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                package="com.example.snazzyapp">
    
    	<uses-permission android:name="android.permission.INTERNET"/>
    	<!-- other permissions go here -->
    
    	<application ...>
    		...
    	</application>
    </manifest>
        
    
  2. 检查权限

    if (ContextCompat.checkSelfPermission(thisActivity, 	 	Manifest.permission.WRITE_CALENDAR)
                != PackageManager.PERMISSION_GRANTED) {
            // Permission is not granted
        }
    
  3. 申请权限

        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
    
            // Permission is not granted
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                    Manifest.permission.READ_CONTACTS)) {
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
            } else {
                // No explanation needed; request the permission
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    
                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        } else {
            // Permission has already been granted
        }
        
    

Android7.0

在应用间共享文件

为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问

  1. 指定FileProvider

        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.myapp">
            <application
                ...>
                <provider
                    android:name="android.support.v4.content.FileProvider"
                    android:authorities="com.example.myapp.fileprovider"
                    android:grantUriPermissions="true"
                    android:exported="false">
                    <meta-data
                        android:name="android.support.FILE_PROVIDER_PATHS"
                        android:resource="@xml/filepaths" />
                </provider>
                ...
            </application>
        </manifest>
    
  2. 指定共享目录

        <paths>
            <files-path path="images/" name="myimages" />
        </paths>
    

Android8.0

后台执行限制

在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。 Android 8.0 有一项复杂功能:系统不允许后台应用创建后台 Service。 因此,Android 8.0 引入了一种全新的方法,即 startForegroundService(),以在前台启动新 Service。 在系统创建 Service 后,应用有五秒的时间来调用该 Service 的 startForeground() 方法以显示新 Service 的用户可见通知。 如果应用在此时间限制内调用 startForeground(),则系统将停止此 Service 并声明此应用为 ANR

广播限制

无法注册隐式广播

标识

AndroidID规则与之前不同

注意

全屏固定方向activity报错(Android9.0修复),不固定方向或透明

Android9.0

前台服务

如果应用以 Android 9 或更高版本为目标平台并使用前台服务,则必须请求 FOREGROUND_SERVICE 权限。这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

标识

在 Android 9 中,Build.SERIAL 始终设为 "UNKNOWN",以保护用户隐私。

如果您的应用需要访问设备的硬件序列号,您应改为请求 READ_PHONE_STATE 权限,然后调用 getSerial()

https

默认不允许使用http接口,在清单文件中cleartextTrafficPermitted 设置为 true

Android10

隐私权变更

受影响的应用 缓解策略
分区存储 针对外部存储的过滤视图,可提供对特定于应用的文件和媒体集合的访问权限 访问和共享外部存储中的文件的应用 使用特定于应用的目录和媒体集合目录 了解详情
增强了用户对位置权限的控制力 仅限前台权限,可让用户更好地控制应用对设备位置信息的访问权限 在后台时请求访问用户位置信息的应用 确保在没有后台位置信息更新的情况下优雅降级 使用 Android 10 中引入的权限在后台获取位置信息 了解详情
系统执行后台 Activity 针对从后台启动 Activity 实施了限制 不需要用户互动就启动 Activity 的应用 使用通知触发的 Activity 了解详情
不可重置的硬件标识符 针对访问设备序列号和 IMEI 实施了限制 访问设备序列号或 IMEI 的应用 使用用户可以重置的标识符 了解详情
无线扫描权限 访问某些 WLAN、WLAN 感知和蓝牙扫描方法需要获得精确位置权限 使用 WLAN API 和蓝牙 API 的应用 针对相关使用场景请求 ACCESS_FINE_LOCATION 权限 了解详情

分区存储

使用分区存储的应用对自己创建的文件始终拥有读/写权限,无论文件是否位于应用的专有目录内。因此,如果您的应用仅保存和访问自己创建的文件,则无需请求获得 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限。

不过,若要访问其他应用创建的文件,则必须满足以下两个条件:

  1. 您的应用已获得 READ_EXTERNAL_STORAGE 权限。
  2. 这些文件位于以下其中一个明确定义的媒体集合中:

为了访问其他应用创建的任何其他文件(包括“downloads”目录下的文件),您的应用必须使用存储访问框架,该框架允许用户选择特定文件。

如果此类应用要访问外部存储设备的原始文件系统视图,则即使拥有 READ_EXTERNAL_STORAGE 权限,也只能访问应用专有的目录。如果应用尝试通过原始文件系统视图打开此目录之外的文件,则会发生错误:

注意:使用分区存储的应用对于 /sdcard/DCIM/IMG1024.JPG 这类路径不具有直接内核访问权限。要访问此类文件,应用必须使用 MediaStore,并调用 openFile() 等方法。

媒体数据限制

分区存储会施加以下媒体数据限制:

该指南介绍了如何处理媒体文件,并提供了有关访问 MediaStore 内的单个文档和文档树的最佳做法。如果您的应用使用分区存储,则需要使用这些方法来访问媒体。

不可重置标识

使用国家统一标识OAID www.msa-alliance.cn/