Android 7.0 FileUriExposedException 解決

從Android 7.0開始,一個(gè)應(yīng)用提供自身文件給其它應(yīng)用使用時(shí),如果給出一個(gè)file://格式的URI的話,應(yīng)用會(huì)拋出FileUriExposedException。這是由于谷歌認(rèn)為目標(biāo)app可能不具有文件權(quán)限,會(huì)造成潛在的問題。所以讓這一行為快速失敗。

http://www.itdecent.cn/p/3f9e3fc38eae

1 FileProvider方式

這是谷歌官方推薦的解決方案。即使用FileProvider來生成一個(gè)content://格式的URI。具體實(shí)現(xiàn)方式如下:
manifest聲明
在manifest中聲明一個(gè)provider。name(即類名)為android.support.v4.content.FileProvider。

<manifest>
    ... 
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.xx.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        ...
    </application>
</manifest>

其中authorities可以自定義。為了避免和其它app沖突,最好帶上自己app的包名。file_paths.xml中編寫該P(yáng)rovider對(duì)外提供文件的目錄。文件放置在res/xml/下。
2.編寫file_paths.xml
文件格式如下:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    ...
</paths>

3.在Java代碼當(dāng)中使用
以分享一個(gè)圖片為例:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            phonePath=getImageTempPath();
            //為了防止華為 酷派等一些手機(jī) 不能拍照的問題
            File file=new File(phonePath);
            file.createNewFile();
            //7.0  FileUriExposedException  問題
            Uri uri;
            if (Build.VERSION.SDK_INT >= 24) {
                uri = FileProvider.getUriForFile(getContext(), "org.xx.fileprovider", file);
            } else {
                uri = Uri.fromFile(file);
            }
            // 下面這句指定調(diào)用相機(jī)拍照后的照片存儲(chǔ)的路徑
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            startActivityForResult(intent, REQUEST_CAMERA);

通過FileProvider解決,實(shí)例下載:https://github.com/honjane/fileProviderDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從Android7.0開始,一個(gè)應(yīng)用提供自身文件給其它應(yīng)用使用時(shí),如果給出一個(gè)file://格式的URI的話,應(yīng)用...
    ifeng_max閱讀 3,614評(píng)論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • 上周,寫了個(gè)小demo,正好同事使用的小米手機(jī)系統(tǒng)內(nèi)核更新到7.0,遂拿來測(cè)試了一番。其中遇到的小問題,現(xiàn)在來跟大...
    monkey_who閱讀 4,870評(píng)論 0 13
  • Android N系列適配---FileProvider Android 7.0的適配,主要包含方面: Andro...
    25a58172fbb5閱讀 7,262評(píng)論 3 32
  • 今天精選了3個(gè)內(nèi)容和大家分享,分別是聽眾檔案、93%法則和魚熊技巧。 1、聽眾檔案 你是否也曾遇到過這樣...
    kevin習(xí)習(xí)閱讀 155評(píng)論 0 0

友情鏈接更多精彩內(nèi)容