内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Android各版本迭代改動與適配的方法-創(chuàng)新互聯(lián)

今天小編給大家分享一下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ù)。

Android 4.4

  • 發(fā)布ART虛擬機,提供選項可以開啟。

  • HttpURLConnection 的底層實現(xiàn)改為了OkHttp。

Android 5.0

  • ART成為默認虛擬機,完全代替Dalvik虛擬機。

  • Context.bindService() 方法需要顯式 Intent,假如提供隱式 intent,將引發(fā)異常。

Android 6.0

  • 添加運行時權(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

  • 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);}

Android 8.0

  • 修改運行時權(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è)置方向的代碼,要么舍棄透明效果。

Android 9.0

  • 在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);

Android 10

  • 分區(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"/>

Android 11

  • 分區(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)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
邵阳市| 咸丰县| 宁城县| 玉树县| 乌拉特前旗| 微山县| 武强县| 若尔盖县| 苏尼特左旗| 乌拉特后旗| 福泉市| 南雄市| 启东市| 泰州市| 辽阳市| 辽阳市| 皋兰县| 文登市| 丰都县| 红安县| 海城市| 新泰市| 三江| 凤台县| 陇南市| 自贡市| 靖宇县| 紫阳县| 榆中县| 岗巴县| 铁力市| 三江| 称多县| 砀山县| 海丰县| 天长市| 竹溪县| 张掖市| 宜昌市| 阆中市| 剑川县|