Android7.0系統(tǒng)使用Intent跳轉(zhuǎn)到APK安裝頁(yè)

轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/b566fa29a76e
本文出自Shawpoo的簡(jiǎn)書(shū)
我的博客:CSDN博客

前言

昨天在開(kāi)發(fā)的時(shí)候遇到這樣一個(gè)問(wèn)題瀑粥,在APP中更新版本下載完最新的apk之后沒(méi)有跳轉(zhuǎn)到應(yīng)用安裝頁(yè)面次泽。然后我換了個(gè)手機(jī)又進(jìn)行測(cè)試了一下是可以的,這就怪了匾委。我的代碼是這樣寫(xiě)的:

    /**
     * @param file
     * @return
     * @Description 安裝apk
     */
    public void installApk(File file) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file),
                "application/vnd.android.package-archive");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    } 

打開(kāi)安裝頁(yè)面不就是這樣嗎?難道還有其他的方法廉嚼?正在趕項(xiàng)目的我遇到這個(gè)問(wèn)題真是一臉懵逼药磺,不知所措...


見(jiàn)鬼了?

查看了Studio的loacat才發(fā)現(xiàn)拋了一個(gè)異常:

FileUriExposedException

后來(lái)發(fā)現(xiàn)只有Android7.0的系統(tǒng)會(huì)報(bào)這個(gè)錯(cuò):

android.os.FileUriExposedException

為什么會(huì)這樣舟舒?難道是系統(tǒng)版本搞的鬼拉庶?沒(méi)錯(cuò),大胸弟秃励,你的猜想一點(diǎn)沒(méi)錯(cuò)氏仗,導(dǎo)致這個(gè)錯(cuò)誤就是由于Android7.0系統(tǒng)引起的。

查詢(xún)Android開(kāi)發(fā)官網(wǎng)可知:

了解:Android7.0 系統(tǒng)權(quán)限更改

為了提高私有文件的安全性夺鲜,面向 Android 7.0 或更高版本的應(yīng)用私有目錄被限制訪(fǎng)問(wèn) (0700)皆尔。此設(shè)置可防止私有文件的元數(shù)據(jù)泄漏呐舔,如它們的大小或存在性。此權(quán)限更改有多重副作用:

上面三條更改總之就是讹开,對(duì)用戶(hù)私有的文件訪(fǎng)問(wèn)更加嚴(yán)格,在訪(fǎng)問(wèn)的時(shí)候需要使用特定的類(lèi)和方法捐名,而不像之前的系統(tǒng)那么容易旦万,雖然這種限制不能完全得到控制,但是官方強(qiáng)烈反對(duì)放寬私有目錄的權(quán)限镶蹋。

看到上面第二條成艘,貌似和安裝APK所報(bào)的異常一樣,根據(jù)提示贺归,看來(lái)需要使用FileProvider才能解決此異常的出現(xiàn)了淆两。

進(jìn)入正題:開(kāi)始解決異常

1、定義FileProvider

在Androidmanifest.xml文件中聲明:

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.shawpoo.app.fileprovider" //自定義名字 為避免重復(fù)建議設(shè)為:包名.fileprovider
            android:exported="false"
            android:grantUriPermissions="true">
            ...
        </provider>
        ...
    </application>
</manifest>

2拂酣、指定可用的文件路徑

在項(xiàng)目的res目錄下秋冰,創(chuàng)建xml文件夾,并新建一個(gè)file_paths.xml文件踱葛。通過(guò)這個(gè)文件來(lái)指定文件路徑:

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

有多種指定路徑丹莲,在<paths>標(biāo)簽內(nèi)應(yīng)至少包含一種,或者多種尸诽。

  • a甥材、表示應(yīng)用程序內(nèi)部存儲(chǔ)區(qū)中的文件/子目錄中的文件
<files-path name="name" path="image" />

等同于Context.getFileDir() : /data/data/com.xxx.app/files/image

  • b、表示應(yīng)用程序內(nèi)部存儲(chǔ)區(qū)緩存子目錄中的文件
<cache-path name="name" path="image" />

等同于Context.getCacheDir() : /data/data/com.xxx.app/cache/image

  • c性含、表示外部存儲(chǔ)區(qū)根目錄中的文件
<external-path name="name" path="image" />

等同于Environment.getExternalStorageDirectory() : /storage/emulated/image

  • d洲赵、表示應(yīng)用程序外部存儲(chǔ)區(qū)根目錄中的文件
<external-files-path name="name" path="image" />

等同于Context.getExternalFilesDir(String) / Context.getExternalFilesDir(null) : /storage/emulated/0/Android/data/com.xxx.app/files/image

  • e、表示應(yīng)用程序外部緩存區(qū)根目錄中的文件
<external-cache-path name="name" path="image" />

等同于Context.getExternalCacheDir() : /storage/emulated/0/Android/data/com.xxx.app/cache/image

3、引用指定的路徑

在剛才Androidmanifest.xml中聲明的provider進(jìn)行關(guān)聯(lián):

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

4叠萍、生成文件的Uri

File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.shawpoo.app.fileprovider", newFile);

5芝发、給Uri授予臨時(shí)權(quán)限

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

所以最終安裝apk的方法可以這么寫(xiě)了:

    /**
     * @param file
     * @return
     * @Description 安裝apk
     */
    protected void installApk(File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 7.0+以上版本
            Uri apkUri = FileProvider.getUriForFile(context, "com.shawpoo.app.fileprovider", file); //與manifest中定義的provider中的authorities="com.shawpoo.app.fileprovider"保持一致 
            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);
    }

總結(jié):好多東西還是得多查API吶~雖然英文是硬傷...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苛谷,隨后出現(xiàn)的幾起案子辅鲸,更是在濱河造成了極大的恐慌,老刑警劉巖腹殿,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件独悴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锣尉,警方通過(guò)查閱死者的電腦和手機(jī)刻炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)自沧,“玉大人坟奥,你說(shuō)我怎么就攤上這事∧聪幔” “怎么了爱谁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)孝偎。 經(jīng)常有香客問(wèn)我管行,道長(zhǎng),這世上最難降的妖魔是什么邪媳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荡陷,結(jié)果婚禮上雨效,老公的妹妹穿的比我還像新娘。我一直安慰自己废赞,他們只是感情好徽龟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著唉地,像睡著了一般据悔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耘沼,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天极颓,我揣著相機(jī)與錄音,去河邊找鬼群嗤。 笑死菠隆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骇径,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼躯肌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了破衔?” 一聲冷哼從身側(cè)響起清女,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晰筛,沒(méi)想到半個(gè)月后嫡丙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡传惠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年迄沫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卦方。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羊瘩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盼砍,到底是詐尸還是另有隱情尘吗,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布浇坐,位于F島的核電站睬捶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏近刘。R本人自食惡果不足惜擒贸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望觉渴。 院中可真熱鬧介劫,春花似錦、人聲如沸案淋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)踢京。三九已至誉碴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓣距,已是汗流浹背黔帕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹈丸,地道東北人蹬屹。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓侣背,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親慨默。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贩耐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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