代碼安裝apk,解決Android7.0兼容問題

先上代碼

public static boolean install(Context con, String filePath) {
        try {
            if(TextUtils.isEmpty(filePath))
                return false;
            File file = new File(filePath);
            if(file.exists()){
                return false;
            }
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//增加讀寫權限
            }
            intent.setDataAndType(getPathUri(con, filePath), "application/vnd.android.package-archive");
            con.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(con, "安裝失敗,請重新下載", Toast.LENGTH_LONG).show();
            return false;
        } catch (Error error) {
            error.printStackTrace();
            Toast.makeText(con, "安裝失敗鸠信,請重新下載", Toast.LENGTH_LONG).show();
            return false;
        }
        return true;
    }
public static Uri getPathUri(Context context, String filePath) {
        Uri uri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            String packageName = context.getPackageName();
            uri = FileProvider.getUriForFile(context, packageName + ".fileProvider", new File(filePath));
        } else {
            uri = Uri.fromFile(new File(filePath));
        }
        return uri;
    }

由于Android.N做了修改需要添加權限

1、在AndroidManifest中添加provider和權限

<application
  ...>
      <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.fileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>
</application>

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

2纺酸、在res下創(chuàng)建xml文件夾,接著在xml文件夾中傳教file_paths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <root-path name="root" path="" />
    <external-path name="external_storage_root" path="." />
    <external-path name="external_storage_download" path="Download" />
</paths>

說一下FileProvider

隨著Android 7.0的到來引入“私有目錄被限制訪問”恕洲,“StrictMode API 政策”霜第,為了進一步提高私有文件的安全性,Android不再由開發(fā)者放寬私有文件的訪問權限秀睛,之前我們一直使用”file:///”絕對路徑來傳遞文件地址的方式蛮拔,在接收方訪問時很容易觸發(fā)SecurityException的異常。

因此酝掩,為了更好的適配Android 7.0,例如相機拍照這類涉及到文件地址傳遞的地方就用上了FileProvider眷柔,F(xiàn)ileProvider也更好地進入了大家的視野期虾。

其實FileProvider是ContentProvider的一個特殊子類,本質上還是基于ContentProvider的實現(xiàn)驯嘱,F(xiàn)ileProvider會把”file:///”的路徑轉換為特定的”content://”形式的content uri镶苞,接收方通過這個uri再使用ContentResolver去媒體庫查詢解析。

說一下file_paths.xml文件<paths>中可以定義的子節(jié)點
paths中可以定義的子節(jié)點.png

file://到content://的轉換規(guī)則:

1.替換前綴:把file://替換成content://${android:authorities}鞠评。

2.匹配和替換

2.1.遍歷的子節(jié)點茂蚓,找到最大能匹配上文件路徑前綴的那個子節(jié)點。

2.2.用path的值替換掉文件路徑里所匹配的內容。

3.文件路徑剩余的部分保持不變聋涨。


替換規(guī)則.png

注意

1晾浴、為了兼容8.0手機需要添加權限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

2、文件的路徑必須包含在xml中牍白,也就是2.1中必須能找到一個匹配的子節(jié)點

3脊凰、發(fā)現(xiàn)在華為mate9升級到Android8.0后,一直提示”安裝解析包錯誤”茂腥,這個問題就是個例狸涌,我反饋給參考文章中的大牛,他反饋給華為內部最岗,他們已經解決杈抢,升級到最新ROM就可以了。

參考文章

解決 Android N 上報錯:android.os.FileUriExposedException: file:///storage/emulated/0/
華為android6.0仑性,代碼安裝apk惶楼,不會彈出安裝界面
安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
對Provider詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诊杆,隨后出現(xiàn)的幾起案子歼捐,更是在濱河造成了極大的恐慌,老刑警劉巖晨汹,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豹储,死亡現(xiàn)場離奇詭異,居然都是意外死亡淘这,警方通過查閱死者的電腦和手機剥扣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铝穷,“玉大人钠怯,你說我怎么就攤上這事∈锬簦” “怎么了晦炊?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宁脊。 經常有香客問我断国,道長,這世上最難降的妖魔是什么榆苞? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任稳衬,我火速辦了婚禮,結果婚禮上坐漏,老公的妹妹穿的比我還像新娘薄疚。我一直安慰自己弄砍,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布输涕。 她就那樣靜靜地躺著,像睡著了一般慨畸。 火紅的嫁衣襯著肌膚如雪莱坎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天寸士,我揣著相機與錄音檐什,去河邊找鬼。 笑死弱卡,一個胖子當著我的面吹牛乃正,可吹牛的內容都是我干的。 我是一名探鬼主播婶博,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓮具,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凡人?” 一聲冷哼從身側響起名党,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挠轴,沒想到半個月后传睹,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡岸晦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年欧啤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片启上。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡邢隧,死狀恐怖,靈堂內的尸體忽然破棺而出冈在,到底是詐尸還是另有隱情府框,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布讥邻,位于F島的核電站迫靖,受9級特大地震影響,放射性物質發(fā)生泄漏兴使。R本人自食惡果不足惜系宜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望发魄。 院中可真熱鬧盹牧,春花似錦俩垃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至有滑,卻和暖如春跃闹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毛好。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工望艺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肌访。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓找默,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吼驶。 傳聞我的和親對象是個殘疾皇子惩激,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,156評論 25 707
  • 轉載自于連林 我們使用手機的時候經常會看到應用程序提示升級,大部分應用內部都需要實現(xiàn)升級提醒和應用程序文件(APK...
    sirai閱讀 1,147評論 0 24
  • 文 / 金小札 一個嚴肅魄咕、不逗比的85后 人民日報整版發(fā)問:如何給寶寶更適合的愛?“中國八大權威媒體齊聲回應“陪著...
    金小扎閱讀 3,518評論 0 1
  • 題記:很多年后才發(fā)現(xiàn)蚌父,很多東西己經離我們越來越遠哮兰。 但我們仍然很純真,因為好奇心還在我們的心里苟弛。 作為一個南方人喝滞,...
    jihua_usc閱讀 247評論 0 0
  • 被鄰里沖破門進到屋里,他一個人安然躺在床上膏秫,無聲無息右遭。沒人知道,他倒在了黎明前缤削,還是隕落在長夜窘哈?唯一的線索是,相熟...
    路小山閱讀 340評論 2 3