今天小編給大家分享一下Android各版本迭代改動與適配的方法的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
成都創(chuàng)新互聯(lián)專注于雨花臺網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供雨花臺營銷型網(wǎng)站建設(shè),雨花臺網(wǎng)站制作、雨花臺網(wǎng)頁設(shè)計、雨花臺網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務(wù),打造雨花臺網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供雨花臺網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。發(fā)布ART虛擬機,提供選項可以開啟。
HttpURLConnection 的底層實現(xiàn)改為了OkHttp。
ART成為默認虛擬機,完全代替Dalvik虛擬機。
Context.bindService() 方法需要顯式 Intent,假如提供隱式 intent,將引發(fā)異常。
添加運行時權(quán)限限制
假如你的應(yīng)用使用到了危險權(quán)限,比方在運行時進行檢查和請求權(quán)限。checkSelfPermission() 方法用于檢查權(quán)限,requestPermissions() 方法用于請求權(quán)限。
取消支持Apache HTTP
Android 6.0 版移除了對 Apache HTTP 相關(guān)類庫的支持。要繼續(xù)使用 Apache HTTP API,您必需先在 build.gradle 文件中公告以下編譯時依賴項:
android {useLibrary 'org.apache.http.legacy'}
Apache HttpClient 是Apache開源組織提供的一個開源的項目,它是一個簡單的HTTP用戶端(并不是瀏覽器),可以發(fā)送HTTP請求,接受HTTP響應(yīng)。
Android 7.0 引入一項新的應(yīng)用簽名方案 APK Signature Scheme v2
Toast 導致的 BadTokenException
在Android7.0系統(tǒng)上,Android 框架強制執(zhí)行了 StrictMode API 政策禁止向你的應(yīng)用外公開 file:// URI。假如一項包含文件 file:// URI 類型 的 Intent 離開你的應(yīng)用,應(yīng)用失敗,并出現(xiàn) FileUriExposedException 異常,如調(diào)用系統(tǒng)相機拍照錄制視頻,或者裁切照片。
其實就是限制了在應(yīng)用間共享文件,假如需要在應(yīng)用間共享,需要授予要訪問的URI臨時訪問權(quán)限,我們要做的就是注冊FileProvider:
1)公告FileProvider。
<provider android:name="android.support.v4.content.FileProvider" android:authorities="app的包名.fileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /></provider><!--androidx版本類路徑為:androidx.core.content.FileProvider-->
2)編寫xml文件,確定可訪問的目錄
<paths xmlns:android="http://schemas.android.com/apk/res/android"> //代表設(shè)施的根目錄new File("/"); <root-path name="root" path="." /> //context.getFilesDir() <files-path name="files" path="." /> //context.getCacheDir() <cache-path name="cache" path="." /> //Environment.getExternalStorageDirectory() <external-path name="external" path="." /> //context.getExternalFilesDirs() <external-files-path name="name" path="path" /> //getExternalCacheDirs() <external-cache-path name="name" path="path" /></paths>
3)使用 FileProvider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri uri = FileProvider.getUriForFile(CameraActivity.this, "app的包名.fileProvider", photoFile);} else { Uri uri = Uri.fromFile(photoFile);}
修改運行時權(quán)限錯誤
在 Android 8.0 之前,假如應(yīng)用在運行時請求權(quán)限并且被授予該權(quán)限,系統(tǒng)會錯誤地將屬于同一權(quán)限組并且在清單中注冊的其余權(quán)限也一起授予應(yīng)用。對于針對 Android 8.0 的應(yīng)用,系統(tǒng)只會授予應(yīng)用明確請求的權(quán)限。然而,一旦客戶為應(yīng)用授予某個權(quán)限,則所有后續(xù)對該權(quán)限組中權(quán)限的請求都將被自動批準。
也就是說,以前你申請了READ_EXTERNAL_STORAGE權(quán)限,應(yīng)用會同時給你授予同權(quán)限組的WRITE_EXTERNAL_STORAGE權(quán)限。假如Android8.0以上,只會給你授予你請求的READ_EXTERNAL_STORAGE權(quán)限。假如需要WRITE_EXTERNAL_STORAGE權(quán)限,還要單獨申請,不過系統(tǒng)會立即授予,不會提醒。
修改通知
Android 8.0 對于通知修改了很多,比方通知渠道、通知標志、通知超時、背景顏色。其中比較重要的就是通知渠道,其允許您為要顯示的每種通知類型創(chuàng)立客戶可自己設(shè)置的渠道。
這樣的好處就是對于某個應(yīng)用可以把權(quán)限分成很多類,客戶來控制能否顯示哪些類別的通知。而開發(fā)者要做的就是必需設(shè)置這個渠道id,否則通知可能會失效。
private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //分組(可選) //groupId要 String groupId = "group_001"; NotificationChannelGroup group = new NotificationChannelGroup(groupId, "廣告"); //創(chuàng)立group notificationManager.createNotificationChannelGroup(group); //channelId要 String channelId = "channel_001"; NotificationChannel adChannel = new NotificationChannel(channelId, "推廣信息", NotificationManager.IMPORTANCE_DEFAULT); //補充channel的含義(可選) adChannel.setDescription("推廣信息"); //將渠道增加進組(先創(chuàng)立組才能增加) adChannel.setGroup(groupId); //創(chuàng)立channel notificationManager.createNotificationChannel(adChannel); //創(chuàng)立通知時,標記你的渠道id Notification notification = new Notification.Builder(MainActivity.this, channelId) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentTitle("一條新通知") .setContentText("這是一條測試消息") .setAutoCancel(true) .build(); notificationManager.notify(1, notification); } }
懸浮窗
Android 8.0 以上必需使用新的窗口類型(TYPE_APPLICATION_OVERLAY)才能顯示提示懸浮窗:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY}else { mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT}
不允許安裝未知來源的應(yīng)用
Android 8.0 去除了“允許未知來源”選項,所以假如我們的 App 有安裝 App 的功能(檢查升級之類的),那么會無法正常安裝。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> private void installAPK(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls(); if (hasInstallPermission) { //安裝應(yīng)用 } else { //跳轉(zhuǎn)至“安裝未知應(yīng)用”權(quán)限界面,引導客戶開啟權(quán)限 Uri selfPackageUri = Uri.parse("package:" + this.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri); startActivityForResult(intent, 100); } }else { //安裝應(yīng)用 } } //接收“安裝未知應(yīng)用”權(quán)限的開啟結(jié)果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100) { installAPK(); } }
Only fullscreen opaque activities can request orientation
只有全屏不透明的 activity 才可以設(shè)置方向。這應(yīng)該是個bug,在Android8.0中出現(xiàn),8.1中被修復。
我們的解決辦法就是要么去掉設(shè)置方向的代碼,要么舍棄透明效果。
在9.0中默認情況下啟用網(wǎng)絡(luò)傳輸層安全協(xié)議 (TLS),默認情況下已停用明文支持。也就是不允許使用http請求,要求使用https。處理辦法就是增加網(wǎng)絡(luò)安全配置:
<application android:networkSecurityConfig="@xml/network_security_config"><network-security-config> <base-config cleartextTrafficPermitted="true" /></network-security-config><!--或者者在AndroidManifest.xml中配置:android:usesCleartextTraffic="true"-->
移除 Apache HTTP 用戶端
在6.0中取消了對Apache HTTP 用戶端的支持,Android9.0中直接移除了該庫,要使用的話需要增加配置:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
前端服務(wù)調(diào)用
Android 9.0 要求創(chuàng)立一個前端服務(wù)需要請求 FOREGROUND_SERVICE 權(quán)限,否則系統(tǒng)會引發(fā) SecurityException。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { startForegroundService(intentService);} else { startService(intentService);}
不能在非 Activity 環(huán)境中啟動Activity
在9.0 中,不能直接非 Activity 環(huán)境中(比方Service,Application)啟動 Activity,否則會崩潰報錯,處理辦法就是加上FLAG_ACTIVITY_NEW_TASK
Intent intent = new Intent(this, TestActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);
分區(qū)存儲
Android10 中默認開啟了分區(qū)存儲,也就是沙盒模式。應(yīng)用只能看到本應(yīng)用專有的目錄(通過 Context.getExternalFilesDir() 訪問)以及特定類型的媒體。
假如需要關(guān)閉這個功能可以配置:
android:requestLegacyExternalStorage="true"
分區(qū)存儲下,訪問文件的方法:
1)應(yīng)用專屬目錄
//分區(qū)存儲空間val file = File(context.filesDir, filename)//應(yīng)用專屬外部存儲空間val appSpecificExternalDir = File(context.getExternalFilesDir(), filename)
2)訪問公共媒體目錄文件
val cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, "${MediaStore.MediaColumns.DATE_ADDED} desc")if (cursor != null) { while (cursor.moveToNext()) { val id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID)) val uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) println("image uri is $uri") } cursor.close()}
3)SAF(存儲訪問框架--Storage Access Framework)
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.type = "image/*" startActivityForResult(intent, 100) @RequiresApi(Build.VERSION_CODES.KITKAT) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (data == null || resultCode != Activity.RESULT_OK) return if (requestCode == 100) { val uri = data.data println("image uri is $uri") } }
權(quán)限再次更新
從Android10開始普通應(yīng)用不再允許請求權(quán)限 android.permission.READ_PHONE_STATE。而且,無論你的App能否適配過Android Q(既targetSdkVersion能否大于等于29),均無法再獲取到設(shè)施IMEI等設(shè)施信息。
假如Android10以下設(shè)施獲取設(shè)施IMEI等信息,可以配置較大sdk版本:
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="28"/>
分區(qū)存儲強制執(zhí)行
Android11 強制執(zhí)行分區(qū)存儲,也就是沙盒模式。這次真的沒有關(guān)閉功能了,離Android11出來也有一段時間了,還是抓緊適配吧。
修改電話權(quán)限
改動了兩個API:getLine1Number()和 getMsisdn() ,需要加上READ_PHONE_NUMBERS權(quán)限
不允許自己設(shè)置toast從后端顯示了
必需加上v2簽名
添加5g相關(guān)API
后端位置訪問權(quán)限再次限制
以上就是“Android各版本迭代改動與適配的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當前題目:Android各版本迭代改動與適配的方法-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://www.rwnh.cn/article12/dsddgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、虛擬主機、服務(wù)器托管、網(wǎng)站收錄、域名注冊、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容