1.Android 6.0
①新增运行时权限,危险权限需要动态申请
②删除了对 Apache HTTP 客户端的支持,
解决方法:必须在build.gradle文件中声明以下编译时依赖项
android {
useLibrary 'org.apache.http.legacy'
}
2.Android 8.0
①允许安装未知来源应用,需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限
②Android8.0取消隐式广播,移除掉了所有的隐式广播(即清单文件中注册的广播)需要使用显示广播进行注册(即代码注册)
③通知消息需要设置通知渠道才可显示,如下:
//只需要将渠道加进去,并且在NotificationCompat.Build中加入渠道id
//只需要将渠道加进去,并且在NotificationCompat.Build中加入渠道id
NotificationManager systemService = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel notificationChannel = new NotificationChannel("001", "xxx", NotificationManager.IMPORTANCE_MAX);
systemService.createNotificationChannel(notificationChannel);
mBuilder = new NotificationCompat.Builder(this, "001");
}else {
mBuilder = new NotificationCompat.Builder(this);
}
Notification build = mBuilder.setContentTitle("标题").setContentText("内容").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).build();
systemService.notify(1,build);
④使用startService开启service闪退,需要调用startForegroundService方法启动服务
3.Android 9.0
①限制了明文流量(即HTTP接口)的网络请求,需要使用使用HTTPS接口
解决方法:
方式一:在Application属性中添加如下配置:
<application android:usesCleartextTraffic="true">
方式二:在res目录下新建xml文件夹,并创建network_security_config.xml文件,内容如下:
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
之后在Application属性中配置 :
<application android:networkSecurityConfig="@xml/network_security_config">
②彻底废弃Apache HTTP库,如果想要继续使用,需要在清单文件中添加如下配置:
<application>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
</application>
③访问电话号码,需要申请 READ_CALL_LOG
④调用startForegroundService(),需要FOREGROUND_SERVICE权限
⑤不允许多进程使用同一目录webview,
解决办法:在app的application类OnCreate方法中加入代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val processName = getProcessName()
if (!"应用包名".equals(processName)) {
WebView.setDataDirectorySuffix(processName)
}
}
4.android 10
①引入沙盒存储机制,不需要存储权限
②新增加了后台定位权限:ACCESS_BACKGROUND_LOCATION
5.Android 11
①查询已安装的应用需要在清单文件中配置
解决办法:需要在应用的清单文件中添加 <queries> 元素,在 <queries> 元素中,你可以按软件包名称、intent 签名或提供程序授权指定软件包。
②支持并发使用多个摄像头
③更改了读取电话号码权限,需要动态获取READ_PHONE_NUMBERS权限
TelecomManager类中的 getLine1Number()方法
TelecomManager类中的 getMsisdn()方法
④自定义Toast被屏蔽
⑤前后台位置信息访问权限(声明 location 的前台服务类型,ACCESS_BACKGROUND_LOCATION)
6.Android 12
①大致位置权限(用户可以要求您的应用仅获取大致位置信息。)
粗略位置: 精确到2平方公里的位置值,请求 ACCESS_COARSE_LOCATION 权限可以获得。
精确位置: 精确到50米以内的位置值,请求 ACCESS_FINE_LOCATION 权限可以获得
②应用休眠(应用几个月没有启动,系统会自动重置授予的所有权限并将您的应用置于休眠状态)
③状态栏下拉菜单中新增麦克风和摄像头切换开关
④前台服务启动限制
⑤精确的闹钟权限
7.Android 13
①新增运行时通知权限:android.permission.POST_NOTIFICATIONS
②在后台使用身体传感器需要新的权限BODY_SENSORS_BACKGROUND
③细化媒体权限
④新增了使用精确闹钟的权限USE_EXACT_ALARM
8.Android 14
① 限制隐式intent(隐式intent仅传递给exported的组件,显式 intent 传送到未导出的组件 带包名的去跳转)
<activity android:name=".AppActivity"
android:exported="false"> //false 不可导出 true可导出
<intent-filter>
<action android:name="com.xxx.xx_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
//跳转不可导出,需要设置包名
Intent explicitIntent =new Intent("com.xxx.xx_ACTION")
explicitIntent.setPackage(context.getPackageName());
context.startActivity(explicitIntent);
②在运行时注册的广播接收器必须指定导出行为(动态注册广播接收器,需要设置标记 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED)