今天小編給大家分享一下Android各版本迭代改動與適配的方法的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
成都創新互聯專注于雨花臺網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供雨花臺營銷型網站建設,雨花臺網站制作、雨花臺網頁設計、雨花臺網站官網定制、微信平臺小程序開發服務,打造雨花臺網絡公司原創品牌,更為您提供雨花臺網站排名全網營銷落地服務。發布ART虛擬機,提供選項可以開啟。
HttpURLConnection 的底層實現改為了OkHttp。
ART成為默認虛擬機,完全代替Dalvik虛擬機。
Context.bindService() 方法需要顯式 Intent,假如提供隱式 intent,將引發異常。
添加運行時權限限制
假如你的應用使用到了危險權限,比方在運行時進行檢查和請求權限。checkSelfPermission() 方法用于檢查權限,requestPermissions() 方法用于請求權限。
取消支持Apache HTTP
Android 6.0 版移除了對 Apache HTTP 相關類庫的支持。要繼續使用 Apache HTTP API,您必需先在 build.gradle 文件中公告以下編譯時依賴項:
android {useLibrary 'org.apache.http.legacy'}
Apache HttpClient 是Apache開源組織提供的一個開源的項目,它是一個簡單的HTTP用戶端(并不是瀏覽器),可以發送HTTP請求,接受HTTP響應。
Android 7.0 引入一項新的應用簽名方案 APK Signature Scheme v2
Toast 導致的 BadTokenException
在Android7.0系統上,Android 框架強制執行了 StrictMode API 政策禁止向你的應用外公開 file:// URI。假如一項包含文件 file:// URI 類型 的 Intent 離開你的應用,應用失敗,并出現 FileUriExposedException 異常,如調用系統相機拍照錄制視頻,或者裁切照片。
其實就是限制了在應用間共享文件,假如需要在應用間共享,需要授予要訪問的URI臨時訪問權限,我們要做的就是注冊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"> //代表設施的根目錄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);}
修改運行時權限錯誤
在 Android 8.0 之前,假如應用在運行時請求權限并且被授予該權限,系統會錯誤地將屬于同一權限組并且在清單中注冊的其余權限也一起授予應用。對于針對 Android 8.0 的應用,系統只會授予應用明確請求的權限。然而,一旦客戶為應用授予某個權限,則所有后續對該權限組中權限的請求都將被自動批準。
也就是說,以前你申請了READ_EXTERNAL_STORAGE權限,應用會同時給你授予同權限組的WRITE_EXTERNAL_STORAGE權限。假如Android8.0以上,只會給你授予你請求的READ_EXTERNAL_STORAGE權限。假如需要WRITE_EXTERNAL_STORAGE權限,還要單獨申請,不過系統會立即授予,不會提醒。
修改通知
Android 8.0 對于通知修改了很多,比方通知渠道、通知標志、通知超時、背景顏色。其中比較重要的就是通知渠道,其允許您為要顯示的每種通知類型創立客戶可自己設置的渠道。
這樣的好處就是對于某個應用可以把權限分成很多類,客戶來控制能否顯示哪些類別的通知。而開發者要做的就是必需設置這個渠道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, "廣告"); //創立group notificationManager.createNotificationChannelGroup(group); //channelId要 String channelId = "channel_001"; NotificationChannel adChannel = new NotificationChannel(channelId, "推廣信息", NotificationManager.IMPORTANCE_DEFAULT); //補充channel的含義(可選) adChannel.setDescription("推廣信息"); //將渠道增加進組(先創立組才能增加) adChannel.setGroup(groupId); //創立channel notificationManager.createNotificationChannel(adChannel); //創立通知時,標記你的渠道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}
不允許安裝未知來源的應用
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) { //安裝應用 } else { //跳轉至“安裝未知應用”權限界面,引導客戶開啟權限 Uri selfPackageUri = Uri.parse("package:" + this.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri); startActivityForResult(intent, 100); } }else { //安裝應用 } } //接收“安裝未知應用”權限的開啟結果 @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 才可以設置方向。這應該是個bug,在Android8.0中出現,8.1中被修復。
我們的解決辦法就是要么去掉設置方向的代碼,要么舍棄透明效果。
在9.0中默認情況下啟用網絡傳輸層安全協議 (TLS),默認情況下已停用明文支持。也就是不允許使用http請求,要求使用https。處理辦法就是增加網絡安全配置:
<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"/>
前端服務調用
Android 9.0 要求創立一個前端服務需要請求 FOREGROUND_SERVICE 權限,否則系統會引發 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 環境中啟動Activity
在9.0 中,不能直接非 Activity 環境中(比方Service,Application)啟動 Activity,否則會崩潰報錯,處理辦法就是加上FLAG_ACTIVITY_NEW_TASK
Intent intent = new Intent(this, TestActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);
分區存儲
Android10 中默認開啟了分區存儲,也就是沙盒模式。應用只能看到本應用專有的目錄(通過 Context.getExternalFilesDir() 訪問)以及特定類型的媒體。
假如需要關閉這個功能可以配置:
android:requestLegacyExternalStorage="true"
分區存儲下,訪問文件的方法:
1)應用專屬目錄
//分區存儲空間val file = File(context.filesDir, filename)//應用專屬外部存儲空間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") } }
權限再次更新
從Android10開始普通應用不再允許請求權限 android.permission.READ_PHONE_STATE。而且,無論你的App能否適配過Android Q(既targetSdkVersion能否大于等于29),均無法再獲取到設施IMEI等設施信息。
假如Android10以下設施獲取設施IMEI等信息,可以配置較大sdk版本:
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="28"/>
分區存儲強制執行
Android11 強制執行分區存儲,也就是沙盒模式。這次真的沒有關閉功能了,離Android11出來也有一段時間了,還是抓緊適配吧。
修改電話權限
改動了兩個API:getLine1Number()和 getMsisdn() ,需要加上READ_PHONE_NUMBERS權限
不允許自己設置toast從后端顯示了
必需加上v2簽名
添加5g相關API
后端位置訪問權限再次限制
以上就是“Android各版本迭代改動與適配的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創新互聯行業資訊頻道。
當前題目:Android各版本迭代改動與適配的方法-創新互聯
網頁URL:http://vcdvsql.cn/article12/dsddgc.html
成都網站建設公司_創新互聯,為您提供小程序開發、虛擬主機、服務器托管、網站收錄、域名注冊、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯