Android7.0機型適配

sudeqiangxx發表於2019-02-15

###Android7.0機型適配儲存目錄的共享
都知道現在AI都很火,AI必定會誕生一些下一代巨頭企業,各行各業都爭搶這一股風,百度CEO不扔下了公司的內務不管,一頭扎進了AI的研究團隊工作中,前段時間李彥宏駕著自己公司生產的無人駕駛汽車,就是6,各個大巨頭都在AI方面有重要專案在實施,都爭搶著下一個時代的山頭。在物聯網方面,做的不錯的是小米,小米的生態鏈,聚集了70多家智慧硬體公司,形成了小米生態鏈,未來的小米將會在物聯網將是一個大贏家,我們知道的小米路由器,小米手環,小米掃地機器人等都是這70多家公司中來生產和研發的,雷軍太有遠見了。好了,不閒說了,進入正題,記錄一下我嗎7.0版本對使用儲存的要求。

最近根據需求做了線上更新app問題,起初沒有對7.0以上的機型進行
適配,造成7.0手機無法跳轉到app安裝介面。
   說一下吧,android系統發展越來越好用,使用者體驗越來越好,對
使用者的隱私也進行了一定規範性的保護,我們都知道從6.0系統的開始
goole就開始對app使用手機許可權進行了一定的約束,對於6.0以上 
的許可權申請我就不多說了,對於許可權申請,自己寫了一個框架,在項
目中使用很方便。下面我們就說說7.0系統對儲存使用增加
了“FileProvider”,我們來看看使用方式,閱讀一下官方文件。複製程式碼

#####FileProvider介紹

FileProvider is a special subclass of ContentProvider that facilitates secure sharing of files associated with an app by creating a content:// Uri for a file instead of a file:/// Uri.
A content URI allows you to grant read and write access using temporary access permissions. When
you create an Intent containing a contentURI, in
order to send the content URI to a client app, you can also call Intent.setFlags() to add permissions. These permissions are available to the client app for as long as the stack for a receiving Activity is active. For an Intent going to a Service, the permissions are available as long as the Service is running.

In comparison, to control access to a file:/// Uri you have to modify the file system permissions of the underlying file. The permissions you provide become available to any app, and remain in effect until you change them. This level of access is fundamentally insecure.

The increased level of file access security offered by a content URI makes FileProvider a key part of Android`s security infrastructure.

This overview of FileProvider includes the following topics:


意思就是說

FileProvider是一個特殊的ContentProvider子類,它通過為檔案建立一個Content:/ / Uri而不是file:/ / Uri,從而促進與應用程式關聯的檔案的安全共享。

內容URI允許您使用臨時訪問許可權授予讀和寫訪問。當您建立包含內容URI的意圖時,為了將內容URI傳送到客戶機應用程式,您還可以呼叫intent. setflags()來新增許可權。只要接收活動的堆疊是活動的,客戶機應用程式就可以使用這些許可權。為了獲得服務,只要服務執行,許可權就可用。

相比之下,為了控制對檔案的file:/ / / Uri,您必須修改底層檔案的檔案系統許可權。您提供的許可權對任何應用程式都可用,並且一直有效,直到您更改它們為止。這種級別的訪問基本上是不安全的。

由內容URI提供的檔案訪問安全性的提高使得FileProvider成為Android安全基礎設施的關鍵部分。

###使用方式
1.在程式清單檔案中新增程式碼:

<manifest>
...
<application>
   ...
   <provider  android:name= "android.support.v4.content.FileProvid"  
        android:authorities="com.mydomain.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
                   <!--後設資料-->
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_path" />
    </provider>
    ...
</application>
</manifest>複製程式碼

com.mydomain更換成自己專案的包名,唯一性。

2.在res目錄下新建一個xml資料夾,檔案下新建一個xml檔案“file_path”

3.file_path檔案寫法

<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
    <root-path name="download" path=""/>
</paths>
</resources>複製程式碼

根據我們使用的儲存路徑不同,對第三層的配置也不一樣。

 (1)當我們使用Context.getFilesDir()獲取路徑時我們應該配
 置成 <files-path name="name" path="path" />
 (2)當我們使用getCacheDir()獲取儲存路徑時,應該配置成
 <cache-path name="name" path="path" />
 (3)使用Environment.getExternalStorageDirectory()
 獲取目錄時,<root-path name="download" path=""/>,path值可以為null,null代表授權這個目錄下的所有檔案,name必須寫,不然會報嚴重異常
 (4)使用Context.getExternalCacheDir()
 <external-cache-path name="name" path="path" />
 (5)使用Context.getExternalFilesDir(null)配置成
 <external-files-path name="name" path="path" />複製程式碼

另外,我們在跳轉到安裝目錄程式碼有變如下:

 public static void install(Context context,String target) {
    File file = new File(target);
    Intent intent = new Intent(Intent.ACTION_VIEW);
    // 由於沒有在Activity環境下啟動Activity,設定下面的標籤
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if(Build.VERSION.SDK_INT>=24) { //判讀版本是否在7.0以上
        //引數1 上下文, 引數2 Provider主機地址 和配置檔案中保持一致   引數3  共享的檔案
        Uri apkUri =
                FileProvider.getUriForFile(context, "com.gzzhe.zhhwlkj.zigou.fileprovider", file);
        //新增這一句表示對目標應用臨時授權該Uri所代表的檔案
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
    }else{
        intent.setDataAndType(Uri.fromFile(file),
                "application/vnd.android.package-archive");
    }
    context.startActivity(intent);
}複製程式碼

好了就介紹到這兒吧。

相關文章