Android7.0機型適配

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


最近根據需求作了在線更新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.
bash

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.app

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:dom

意思就是說

FileProvider是一個特殊的ContentProvider子類,它經過爲文件建立一個Content:/ / Uri而不是file:/ / Uri,從而促進與應用程序關聯的文件的安全共享。
ide

內容URI容許您使用臨時訪問權限授予讀和寫訪問。當您建立包含內容URI的意圖時,爲了將內容URI發送到客戶機應用程序,您還能夠調用intent. setflags()來添加權限。只要接收活動的堆棧是活動的,客戶機應用程序就可使用這些權限。爲了得到服務,只要服務運行,權限就可用。ui

相比之下,爲了控制對文件的file:/ / / Uri,您必須修改底層文件的文件系統權限。您提供的權限對任何應用程序均可用,而且一直有效,直到您更改它們爲止。這種級別的訪問基本上是不安全的。spa

由內容URI提供的文件訪問安全性的提升使得FileProvider成爲Android安全基礎設施的關鍵部分。
code

###使用方式
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);
}複製代碼

好了就介紹到這兒吧。

相關文章
相關標籤/搜索