1. 程式人生 > >android版本更新適配7.0,解決7.0手機無法更新安裝apk

android版本更新適配7.0,解決7.0手機無法更新安裝apk

許可權更改

隨著Android7.0的到來,隨之,許可權獲取也隨之更改,因為部分7.0手機就會出現無法下載乃至載入完成後無法安全或者安裝失敗的問題,因為,我們適配7.0版本是很重要的,不然部分7.0手機就會出現上述問題。

在api23版本開始部分許可權需要動態獲取,共有9組許可權,每組許可權中只要有一個許可權成功即為全部申請成功,然而7.0也是一樣的在下載前需要動態獲取檔案的讀寫許可權,一定要獲取,博主記得華為mate 9就會出現這個問題。關於動態獲取許可權的問題,稍後會貼部落格,或者自行百度。


隨著Android版本越來越高,android對隱私的保護力度也越來越大。從Android6.0引入的動態許可權控制(Runtime Permissions)到Android7.0的“私有目錄被限制訪問”,“StrictMode API 政策”。這些更改在為使用者帶來更加安全的
作業系統的同時也為開發者帶來了一些新的任務。如何讓你的APP能夠適應這些改變而不是cash,是擺在每一位Android開發者身上的責任。

目錄被限制訪問

一直以來,在目錄及檔案的訪問保護方面iOS做的是很到位的,如:ios的沙箱機制。但,Android在這方面的保護就有些偏弱了,在Android中應用可以讀寫手機儲存中任何一個目錄及檔案,這也帶來了很多的安全問題。現在Android也在著力解決這一問題。

在Android7.0中為了提高私有檔案的安全性,面向 Android N 或更高版本的應用私有目錄將被限制訪問。對於這個許可權的更改開發者需要留意一下改變:

對策略:這項許可權的變更將意味著你無法通過File API訪問手機儲存上的資料了,基於File API的一些檔案瀏覽器等也將受到很大的影響,看到這大家是不是驚呆了呢,不過迄今為止,這種限制尚不能完全執行。 應用仍可能使用原生 API 或 File API 來修改它們的私有目錄許可權。 但是,Android官方強烈反對放寬私有目錄的許可權。可以看出收起對私有檔案的訪問許可權是Android將來發展的趨勢。

  • 給其他應用傳遞 file:// URI 型別的Uri,可能會導致接受者無法訪問該路徑。 因此,在Android7.0中嘗試傳遞 file:// URI 會觸發 FileUriExposedException。
應對策略:大家可以通過使用FileProvider來解決這一問題。

下面講述如何適配7.0:首先在AndroidManifest.xml中新增一下程式碼

  1. <!--此處適配android 7.0-->  
  2.        <provider  
  3.            android:name="android.support.v4.content.FileProvider"
  4.            android:authorities="${applicationId}.fileprovider"
  5.            android:exported="false"
  6.            android:grantUriPermissions="true">  
  7.            <meta-data  
  8.                android:name="android.support.FILE_PROVIDER_PATHS"
  9.                <span style="color:#cc0000;">android:resource="@xml/file_paths"</span>/>  
  10.        </provider>  

其中紅色程式碼部分是引用xml檔案,檔名為:file_paths。然後我們如果在res下沒有xml資料夾的話就新建一個xml資料夾,在xml資料夾下新建file_paths的xml資原始檔。裡面新增如下程式碼

  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <paths>  
  3.     <external-path  
  4.         name="files_root"
  5.         path="Android/data/你的包名/" />  
  6.     <external-path  
  7.         name="external_storage_root"
  8.         path="." />  
  9. </paths></span>  
最後通過provider生成Uri,在你下載完後啟動安裝的程式碼需要更改下,判斷下你的api版本號:
  1. <span style="font-size:14px;">Intent i = new Intent(Intent.ACTION_VIEW);  
  2. if (Build.VERSION.SDK_INT >= 24) { //適配安卓7.0
  3.     i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_ACTIVITY_NEW_TASK);  
  4.     Uri apkFileUri = FileProvider.getUriForFile(mContext.getApplicationContext(),  
  5.             mContext.getPackageName()+".fileprovider", apkfile);  
  6.     i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");  
  7. else {  
  8.     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  9.     i.setDataAndType(Uri.parse("file://" + apkfile.toString()),  
  10.             "application/vnd.android.package-archive");// File.toString()會返回路徑資訊
  11. }  
  12. mContext.startActivity(i);</span>