Android 7.0 FilePrivider實(shí)踐

FilePrividerContentPrivider的特殊子類粥血,是為了能安全地向其他App分享文件而定義的履因。它用content://Uri創(chuàng)建一個(gè)文件替代Android7.0之前使用的的file://Uri砌左。

content Uri使用臨時(shí)的權(quán)限來允許讀寫汇四,當(dāng)你創(chuàng)建一個(gè)包含content UriIntent,為了把它發(fā)送給目標(biāo)App(client app)踏烙,你可以調(diào)用Intent.addFlags()來添加權(quán)限,只要目標(biāo)的activity是激活狀態(tài)历等,權(quán)限會(huì)一直存在宙帝。
對(duì)于打開ServiceIntent,只有Service還在運(yùn)行募闲,則權(quán)限會(huì)一直存在步脓。

作為對(duì)比,為了獲得特定file Uri文件的權(quán)限你必須更改整個(gè)文件系統(tǒng)的權(quán)限浩螺,這樣其他所有的app都有了讀取的權(quán)限靴患,而且權(quán)限會(huì)一直存在知道你改變它。這種的讀取方式從根本上來說是不安全的要出。

下面記錄一下在Android 7.0之后如何使用(示例是打開某種文件的場景鸳君,如打開APK安裝包,打開.doc文件等)

1.menifests中配置provider

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="包名.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
</provider>

2.創(chuàng)建filepaths.xml文件(在res文件夾下新建xml文件夾患蹂,文件名可隨意)

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <cache-path
        name="apk"
        path="/upgrade" />
    <external-cache-path
        name="apk"
        path="/upgrade" />
</paths>

參考 FilePrivider Specifying Available Files
<paths>標(biāo)簽下可以包含以下幾種子標(biāo)簽

<files-path name="" path="" />

其中path對(duì)應(yīng)Context.getFilesDir()或颊,像path="/upgrade"就是getfilesDir()下的子文件夾upgradename可以隨意取名

<cache-path name="name" path="path" />

對(duì)應(yīng)Context.getCacheDir()

<external-path name="name" path="path" />

對(duì)應(yīng)Environment.getExternalStorageDirectory()

<external-files-path name="name" path="path" />

對(duì)應(yīng)Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)

<external-cache-path name="name" path="path" />

對(duì)應(yīng)Context.getExternalCacheDir()

3.向App外發(fā)送文件(這里是APK安裝程序)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                // SDK24以上
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", apkFile);
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            } else {
                // SDK24以下
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
}

其中的apkFile是文件路徑名传于,我是將下載的apk放在緩存目錄中

public static File cacheApkFile(Context context) {

        File file;
        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
            // sdcard
            file = new File(context.getExternalCacheDir(), "upgrade");
            if (!file.exists()) {
                file.mkdir();
            }
            file = new File(file, "cache.apk");
        } else {
            // 內(nèi)存
            file = new File(context.getCacheDir(), "upgrade");
            if (!file.exists()) {
                file.mkdir();
            }
            file = new File(file, "cache.apk");
        }
        return file;
    }

因?yàn)樵?code>cache文件夾下新建了子目錄upgrade囱挑,所以filepaths.xml文件需要臨時(shí)對(duì)外開放這個(gè)子目錄的權(quán)限

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沼溜,隨后出現(xiàn)的幾起案子平挑,更是在濱河造成了極大的恐慌,老刑警劉巖系草,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件通熄,死亡現(xiàn)場離奇詭異,居然都是意外死亡找都,警方通過查閱死者的電腦和手機(jī)唇辨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來能耻,“玉大人赏枚,你說我怎么就攤上這事『烤” “怎么了嗡贺?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵隐解,是天一觀的道長鞍帝。 經(jīng)常有香客問我,道長煞茫,這世上最難降的妖魔是什么帕涌? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任摄凡,我火速辦了婚禮,結(jié)果婚禮上蚓曼,老公的妹妹穿的比我還像新娘亲澡。我一直安慰自己,他們只是感情好纫版,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布床绪。 她就那樣靜靜地躺著,像睡著了一般其弊。 火紅的嫁衣襯著肌膚如雪癞己。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天梭伐,我揣著相機(jī)與錄音痹雅,去河邊找鬼。 笑死糊识,一個(gè)胖子當(dāng)著我的面吹牛绩社,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赂苗,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愉耙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拌滋?” 一聲冷哼從身側(cè)響起劲阎,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸠真,沒想到半個(gè)月后悯仙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吠卷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年锡垄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭隔。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡货岭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疾渴,到底是詐尸還是另有隱情千贯,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布搞坝,位于F島的核電站搔谴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏桩撮。R本人自食惡果不足惜敦第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一峰弹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芜果,春花似錦鞠呈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舀射,卻和暖如春灭将,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背后控。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工庙曙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浩淘。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓首启,卻偏偏與公主長得像旨指,于是被迫代替她去往敵國和親破讨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碑定,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容