ToB企服应用市场:ToB评测及商务社交产业平台

标题: Android 各版本适配(更新到Android14) [打印本页]

作者: 小秦哥    时间: 2024-9-15 20:32
标题: Android 各版本适配(更新到Android14)
一 简介
1.1 Android 现在最新版已更新到了Android14,google市场每次更新都要求必须同步更新项目API,否则会有下架风险。
1.2 Android 每一个版本更新都对电量优化,通知的利用,隐私权限方面做了修改,所以重点适配方面也是在这几个方面
二 各版本更新厘革
2.1 Android 1.0 (API Level 1) - 2008年9月发布,首次发布的Android版本,提供了基本功能。
2.2 Android 1.1 (API Level 2) - 2009年2月发布,增加了一些功能改进,如支持地图和小部件。
2.3 Android 1.5 (Cupcake, API Level 3) - 2009年4月发布,首次引入了虚拟键盘和小部件。
2.4 Android 1.6 (Donut, API Level 4) - 2009年9月发布,增强了搜索功能,支持不同屏幕尺寸。
2.5 Android 2.0 (Eclair, API Level 5) - 2009年10月发布,引入了多帐户支持、图像和音频增强。
2.6 Android 2.2 (Froyo, API Level 8) - 2010年5月发布,增加了对Flash的支持,提升了性能和安全性。
2.7 Android 2.3 (Gingerbread, API Level 9) - 2010年12月发布,优化了用户界面和游戏性能,增加了对NFC的支持。
2.8 Android 3.0 (Honeycomb, API Level 11) - 2011年2月发布,专为平板电脑设计,改进了界面和多使命功能。
2.9 Android 4.0 (Ice Cream Sandwich, API Level 14) - 2011年10月发布,同一了智能手机和平板电脑的用户界面,增加了面部解锁。
2.10  Android 4.1 (Jelly Bean, API Level 16) - 2012年7月发布,增强了流畅度和通知功能。
2.11 Android 4.4 (KitKat, API Level 19) - 2013年10月发布,优化了性能,进步了在低内存装备上的运行效果。
2.12 Android 5.0 (Lollipop, API Level 21) - 2014年11月发布,彻底改进了用户界面,增加了Material Design。
2.13 Android 6.0 (Marshmallow, API Level 23) - 2015年10月发布,增强了权限管理和Doze模式以延长电池利用。
2.14 Android 7.0 (Nougat, API Level 24) - 2016年8月发布,支持分屏模式和增强的通知功能。
2.15 Android 8.0 (Oreo, API Level 26) - 2017年8月发布,引入了画中画、多窗口和通知渠道。
2.16 Android 9.0 (Pie, API Level 28) - 2018年8月发布,改进了用户界面,增加了手势导航和数字健康功能。
2.17 Android 10 (API Level 29) - 2019年9月发布,全面改进隐私权和位置控制,并引入黑暗模式。
2.18 Android 11 (API Level 30) - 2020年9月发布,增强了通讯管理和多媒体功能。
2.19  Android 12 (API Level 31) - 2021年10月发布,改进了隐私和新的用户自界说界面。
2.20 Android 13 (API Level 33) - 2022年8月发布,进行了小幅改进,包罗新的个性化选项和隐私特性。
2.21 Android 14 (API Level 34) - 2023年预期发布,预计将继续增强隐私和用户体验。
三 版本,名字,和api对比表
Android VersionNameAPI Level
Android 15V35
Android 14U34
Android 13T33
Android 12LS31
Android 12.0S30
Android 11.0R29
Android 10.0Q28
Android 9.0Pie27
Android 8.1Orea26
Android 8.0Orea25
Android 7.1.1Nougat24
Android 6.0MarshMallow23
Android 5.1Lollipop22
Android 5.0Lollipop21
Android 4.4WKitKat Wera20
Android 4.4KitKat 19
四 各版本适配
4.1 Android4.4到android5(API19-22)
权限比力低,不需要太多权限就能访问,不再多介绍,现在android5以下手机已经非常少了(开辟板RK系列除外)
4.2 Android6(API23) 
运行时权限
   
  

  HttpClient的移除
   自Android6.0起,HttpClient系列代码从SDK中剔除,保举利用HttpURLConnection。
  4.3 Android7(API24) 
 应用间共享文件
   
  
  
   广播
   
  4.4 Android 8.0 
通知渠道id
Android 8.0 引入了通知渠道,其答应您为要显示的每种通知类型创建用户可自界说的渠道。用户界面将通知渠道称之为通知种别。targeSdk升级到26之后,所有的通知的实现都需要提供通知渠道,如果不提供通知渠道的话,所有通知在8.0体系上面都不能正常展示。
  1.                 //通知渠道id
  2.         val channelId = "channelId"
  3.         val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  4.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  5.             //通知渠道名称
  6.             val channelName = "channelName"
  7.             //通知渠道重要程度
  8.             val importance = NotificationManager.IMPORTANCE_HIGH
  9.             //构建通知渠道
  10.             val channel = NotificationChannel(channelId, channelName, importance)
  11.             //设置通知渠道描述
  12.             channel.description = ""
  13.             //向系统注册通知渠道,注册后则不能修改重要性以及其他通知行为,但可以删除
  14.             notificationManager.createNotificationChannel(channel)
  15.         }
  16.         
  17.         val notification = NotificationCompat.Builder(this, "channelId")
  18.                 .setContentTitle("标题")
  19.                 .setContentText("消息内容")
  20.                 .setSmallIcon(R.drawable.ic_launcher_background)
  21.                 .setAutoCancel(true)//点击自动消失
  22.                 .build()
  23.         //通知id,每个通知都应该不同否则会覆盖
  24.         val notifyId = 1
  25.         notificationManager.notify(notifyId, notification)
复制代码
后台实行限制
   
  答应安装未知来源应用
   8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。 
  1. <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
复制代码
 隐式广播的限制
   我们自己界说的广播隐式调用不能接收,显式Intent可以接收。或者动态注册,然后隐式调用可以接收。如果要接收体系广播只能动态注册。
  权限
   之前对于隐私权限只要申请一个就会将其在的权限组全部通过,android 8.0以后申请单个只给单个
  4.5 Android9(API27) 
限制非 Activity 情况中启动 Activity
   在 Android 9 中,不能从非 Activity 情况中启动 Activity,除非您通报 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果您尝试在不通报此标志的情况下启动 Activity,则该 Activity 不会启动,体系会在日志中输出一则消息。
  前台服务
   针对 Android 9 或更高版本并利用前台服务的应用必须请求 FOREGROUND_SERVICE 权限。 这是普通权限,因此,体系会自动为请求权限的应用授予此权限。 
  默认情况下启用网络传输层安全协议 (TLS)
   
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <network-security-config>
  3.     <base-config cleartextTrafficPermitted="true">
  4.         <trust-anchors>
  5.             <certificates src="system" />
  6.             <certificates src="user" />
  7.         </trust-anchors>
  8.     </base-config>
  9. </network-security-config>
复制代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest ... >
  3.     <application android:networkSecurityConfig="@xml/network_security_config">
  4.             ...
  5.     </application>
  6. </manifest>
复制代码
 硬件序列号
   
  4.6 Android10(API28) 
分区存储:分区存储将外部存储分成两部门
   
  
  
  
  
  后台运行时访问装备位置信息需要权限
   
  后台启动 Activity 的限制
   应用处于后台时,无法启动Activity。
  深色主题
   
  标识符和数据
   
  对启用和停用 WLAN 实施了限制
   以 Android 10 或更高版本为目标平台的应用无法启用或停用 WLAN。WifiManager.setWifiEnabled() 方法始终返回 false。
  4.7 Android11(API29)
分区存储强制实行
   
  1. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  2. val intent = Intent()
  3. intent.action= Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
  4. startActivity(intent)
  5. //判断是否获取MANAGE_EXTERNAL_STORAGE权限:
  6. val isHasStoragePermission= Environment.isExternalStorageManager()
复制代码
 电话号码干系权限
   
  1. <manifest ...>
  2.     <!-- Grants the READ_PHONE_STATE permission only on devices that run
  3.          Android 10 (API level 29) and lower. -->
  4.     <uses-permission android:name="READ_PHONE_STATE"
  5.                      android:maxSdkVersion="29" />
  6.     <uses-permission android:name="READ_PHONE_NUMBERS" />
  7. </manifest>
复制代码
 自界说消息框视图被屏蔽
   
  1. W/NotificationService: Blocking custom toast from package \
  2.   <package> due to package not in the foreground
复制代码
媒体intent操作需要体系默认相机 
   
  软件包可见性 
   
  前台服务类型 
   
  1. <manifest ...>
  2.     <service ...
  3.         android:foregroundServiceType="location|camera|microphone" />
  4. </manifest>
复制代码
4.8 Android12(API30-31)
SplashScreen
   从 Android 12 开始,在搭载 Android 12 或更高版本的装备上运行时,所有应用都将拥有启动动画。这包罗启动时的进入应用动作、显示应用图标的启动画面,以及向应用自己的过渡
  

   
  更安全的组件导出 
   以Android 12为目标平台的App,如果其包含的四大组件中利用到了Intent过滤器(intent-filter),则必须显式声明 android:exported 属性,否则App将无法在Android 12及更高体系版本的装备上安装。
  定位权限:大概位置 
   
  PendingIntent可变性 
   
  蓝牙权限
   
  1. <manifest ...>
  2.     <!-- Request legacy Bluetooth permissions on older devices. -->
  3.     <uses-permission android:name="android.permission.BLUETOOTH"
  4.                      android:maxSdkVersion="30" />
  5.     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
  6.                      android:maxSdkVersion="30" />
  7.     <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
  8.     <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
  9.     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  10.     <!-- 只有当您的应用程序使用蓝牙扫描结果来获取物理位置时才需要 -->
  11.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  12.     ...
  13. </manifest>
复制代码

  1. <manifest ...>
  2.     <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
  3.                      android:usesPermissionFlags="neverForLocation" />
  4.     <!--Android 12后,可以删除定位权限 -->
  5.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  6.     ...
  7. </manifest>
复制代码
4.9 Android13 (API33)
细化的媒体权限
   如果应用以 Android 13 或更高版本为目标平台,并且需要访问其他应用已经创建的媒体文件,必须请求以下一项或多项细化的媒体权限,而不是READ_EXTERNAL_STORAGE 权限:
  
媒体类型请求权限
图片和照片READ_MEDIA_IAMGES
视频READ_MEDIA_VIDEO
音频文件READ_MEDIA_AUDIO
如果用户之前向您的应用授予了 READ_EXTERNAL_STORAGE 权限,体系会自动向您的应用授予细化的媒体权限。否则,当应用请求上表中显示的任何权限时,体系会显示面向用户的对话框。
  1. <manifest ...>
  2.     <!-- Required only if your app targets Android 13. -->
  3.     <!-- Declare one or more the following permissions only if your app needs
  4.     to access data that's protected by them. -->
  5.     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
  6.     <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
  7.     <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
  8.     <!-- Required to maintain app compatibility. -->
  9.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
  10.                      android:maxSdkVersion="32" />
  11.     <application ...>
  12.         ...
  13.     </application>
  14. </manifest>
复制代码
通知运行时权限 
   在AndroidManifest.xml中对发送通知权限进行声明:
  1. <manifest ...>
  2.     <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
  3.     <application ...>
  4.         ...
  5.     </application>
  6. </manifest>
复制代码
POST_NOTIFICATIONS权限只有在应用程序的targetSdk指定成33或更高时才会有用。
  要确认用户是否已启用通知,请调用 areNotificationsEnabled()。
  静态广播注册
   
  1. private void registerTestReceiver() {
  2.     IntentFilter filter = new IntentFilter();
  3.     filter.addAction("com.xiaxl.test.action");
  4.     // api >= 33
  5.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
  6.         // 跨应用间使用
  7.         MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
  8.         // 应用内使用
  9.         //MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
  10.     }
  11.     // api <= 32
  12.     else {
  13.         MainActivity.this.registerReceiver(mTestReceiver, filter);
  14.     }
  15. }
复制代码

  4.10 Android 14 (API34)
默认拒绝设定精确的闹钟
   
  1. setExact()
  2. setExactAndAllowWhileIdle()
  3. setExactAndAllowWhileIdle()
  4. setAlarmClock()
复制代码
对照片和视频进行独立授权 
   
  1. private fun checkPermissionResult() {
  2.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
  3.         && (ContextCompat.checkSelfPermission(this, READ_MEDIA_IMAGES) == PERMISSION_GRANTED
  4.                 || ContextCompat.checkSelfPermission(this, READ_MEDIA_VIDEO) == PERMISSION_GRANTED)
  5.     ) {
  6.         // Android 13及以上完整照片和视频访问权限
  7.     } else if (
  8.         Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
  9.         ContextCompat.checkSelfPermission(this, READ_MEDIA_VISUAL_USER_SELECTED) == PERMISSION_GRANTED
  10.     ) {
  11.         // Android 14及以上部分照片和视频访问权限
  12.     } else if (ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED) {
  13.         // Android 12及以下完整本地读写访问权限
  14.     } else {
  15.         // 无本地读写访问权限
  16.     }
  17. }
复制代码
限制前台服务
   
  最低可安装的目标 API 级别
   从 Android 14 开始,targetSdkVersion 低于 23 (Android 6.0)的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于进步用户的安全性和隐私性。 
  在 BluetoothAdapter 中强制实行 BLUETOOTH_CONNECT 权限 
   
  1. <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
复制代码
对隐式 intent 和待处理 intent 的限制 
   对于以 Android 14 为目标平台的应用,Android 会通过以下方式限制应用向内部应用组件发送隐式 intent:
  隐式 intent 只能传送到导出的组件。应用必须利用显式 intent 传送到未导出的组件,或将该组件标志为已导出。
如果应用通过未指定组件或软件包的 intent 创建可变待处理 intent,体系现在会抛出非常。
这些变动可防止恶意应用拦截意在供应用内部组件利用的隐式 intent。
  好比在清单文件中声明:
  1. <activity   
  2.         android:name=".AppActivity"
  3.         android:exported="false">
  4.          <intent-filter>
  5.            <action android:name="com.example.action.APP_ACTION" />
  6.            <category android:name="android.intent.category.DEFAULT" />
  7.          </intent-filter>
  8.         </activity>
复制代码
如果应用尝试利用隐式 intent 启动此 activity,则体系会抛出非常:
  1. // Throws an exception when targeting Android 14.  
  2. context.startActivity(Intent("com.example.action.APP_ACTION"))
复制代码
如需启动非导出的 activity,应用应改用显式 intent:
  1. // This makes the intent explicit.
  2. val explicitIntent = Intent("com.example.action.APP_ACTION")
  3. explicitIntent.apply {
  4.    package = context.packageName  
  5. }
  6. context.startActivity(explicitIntent)
复制代码
注册的广播接收器必须指定导出举动 
   以 Android 14 为目标平台并利用上下文注册的接收器的应用和服务必须指定以下标志,以指明接收器是否应导出到装备上的所有其他应用:RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。
  1. val filter = IntentFilter(APP_SPECIFIC_BROADCAST)
  2. val listenToBroadcastsFromOtherApps = false
  3. val receiverFlags = if (listenToBroadcastsFromOtherApps) {
  4.    ContextCompat.RECEIVER_EXPORTED
  5. } else {
  6.    ContextCompat.RECEIVER_NOT_EXPORTED
  7. }
  8. ContextCompat.registerReceiver(context, br, filter, receiverFlags)
复制代码
如果您的应用仅通过 Context#registerReceiver 方法(例如 Context#registerReceiver()针对 体系广播 注册接收器,那么它在注册接收器时不应指定标志。
  五 刷脸付出适配
5.1 微信刷脸付出流程
   https://open.weixin.qq.com/
https://pay.weixin.qq.com/wiki/doc/wxfacepay/develop/android/facepay.html
微信开放平台付出开通:
5.1.1,注册开放平台账号
5.1.2,进行开辟者资质认证
5.1.3,开通商户号
5.1.4,新建移动应用(名字,logo,简介,介绍图,appid)
5.1.5,绑定应用包名和md5签名
5.1.6,开放平台开通付出能力
5.1.7,登录超管商户平台绑定appid,和账号主体(账号信息中的公司名字)
5.1.8,在开放平台确认授权商户号
5.1.9,接入付出平台SDK(微信付出,刷脸付出,扫码付出)
  5.2 付出宝刷脸付出流程
   https://open.alipay.com/
https://opendocs.alipay.com/open/20180402104715814204
付出宝开放平台付出开通:
5.2.1,注册开放平台账号
5.2.2,进行开辟者资质认证
5.2.3,开通商户号
5.2.4,新建移动应用(名字,logo,简介,appid)
5.2.5,绑定应用包名和md5签名
5.2.6,进行开辟设置,公钥私钥
5.2.7,进行ip白名单设置
  5.3 注意:
   微信付出宝熟练付出并不是随意机器就可以,必须要厂家授权的机器类型才可以,所以一般并不能同同时付出两种刷脸付出。
  六 微信小程序开辟流程 
   https://mp.weixin.qq.com/
1,新建账号,完成资质认证
2,个人需要完成实名认证
3,企业需要营业执照
4,注册小程序,确定小程序信息和类目
5,小程序微信认证,个人需要打款30元考核费用,期间微信客户会打电话核实
6,小程序存案,工信部会发短信,24小时内点击毗连验证
7,下载微信开辟者工具,创建小程序项目,关联小程序id
8,上传预览版,可以在小程序平台看到版本管理
9,小程序必须开辟好后才能正式提交,期间可以上传预览

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4