通過Intent安裝apk

最近接收一個(gè)老項(xiàng)目马澈,發(fā)現(xiàn)在Android Q版本上自動(dòng)更新的時(shí)候出錯(cuò)崩泡,表現(xiàn)為下載完app后直接崩潰迈螟。進(jìn)入文件管理器后發(fā)現(xiàn)安裝包已經(jīng)下載成功了叉抡,點(diǎn)擊安裝后能正常安裝,但這是文件管理器調(diào)用系統(tǒng)的安裝答毫,項(xiàng)目中調(diào)用系統(tǒng)安裝肯定是有問題的褥民。
查看gradle文件

android {
    compileSdkVersion 23
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.*****.*****"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 2
        versionName "2.4.2"
        multiDexEnabled true
        ndk {
            //選擇要添加的對(duì)應(yīng)cpu類型的.so庫
            abiFilters "armeabi", "armeabi-v7a"
            // 'armeabi-v8a', 'x86', 'x86_64', 'mips', 'mips64'
        }
    }
}

編譯版本和目標(biāo)版本都是23,項(xiàng)目中提示要更新到29洗搂。因?yàn)閷?duì)29新特性不是特別了解消返,不敢貿(mào)然升級(jí)。
再看看Manifest文件耘拇,權(quán)限有很多撵颊,這里就不貼了。查了下網(wǎng)上對(duì)安裝apk的權(quán)限惫叛,更新app以及安裝app需要的權(quán)限如下

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REPLACE_EXISTING_PACKAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/><!-- 8.0必要權(quán)限  -->

項(xiàng)目中的權(quán)限列表中沒發(fā)現(xiàn)REPLACE_EXISTING_PACKAGE和REQUEST_INSTALL_PACKAGES這兩項(xiàng)權(quán)限倡勇,猜想是再其他的引用中加入了這些權(quán)限。因?yàn)樵贏ndroidQ以下的手機(jī)能安裝成功嘉涌。
再往下看發(fā)現(xiàn)一個(gè)問題妻熊,manifest中缺少provider的節(jié)點(diǎn)。網(wǎng)上查了下關(guān)于安裝apk所需的provider

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"  <!--定義provider后面取值需要用到仑最,名字要一致-->
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />    <!--在xml文件夾內(nèi)新建文件配置路徑-->
</provider>

@xml/file_paths文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="移動(dòng)辦公" path="/" />
</paths>

查了下關(guān)于該xml的定義:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Context.getFilesDir() 位于/data/data/安裝目錄-->
    <files-path name="internalPath" path="file" />
    <!--Context.getCacheDir()-->
    <cache-path name="cachePath" path="file" />
    <!--Environment.getExternalStorageDirectory()-->
    <external-path name="externalPath" path="file" />
    <!--Context.getExternalFilesDir(null)-->
    <external-files-path name="externalFPath" path="file" />
</paths>

項(xiàng)目中用 <external-path 定義了外置路徑扔役,最后在代碼中調(diào)用安裝

public static boolean installApk(Context context, String apkPath) {
        if (context == null || apkPath.isEmpty()) {
            return false;
        }
        File apkfile = new File(apkPath);
        if (!apkfile.exists()) {
            return false;
        }
        PackageInfo pi = AppPackageUtil.getAPKFilePackageInfo(context, apkPath);
        if (pi == null) {
            apkfile.delete();
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 24) { //7.p0以上
            Uri apkUri = FileProvider.getUriForFile(context, "com.你的包名.fileprovider", apkfile);//注意這里的fileprovider要和manifest一致
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else { //7.0以下
            //intent.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
            intent.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
        return true;
    }

項(xiàng)目中沒有對(duì)版本進(jìn)行適配,缺少24以上的適配警医,加入以上代碼適配后亿胸,在Android 10的紅米手機(jī)上測(cè)試了更新后問題解決。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末预皇,一起剝皮案震驚了整個(gè)濱河市损敷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌深啤,老刑警劉巖拗馒,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異溯街,居然都是意外死亡诱桂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門呈昔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挥等,“玉大人,你說我怎么就攤上這事堤尾「尉ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辞槐。 經(jīng)常有香客問我掷漱,道長,這世上最難降的妖魔是什么榄檬? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任卜范,我火速辦了婚禮,結(jié)果婚禮上鹿榜,老公的妹妹穿的比我還像新娘海雪。我一直安慰自己,他們只是感情好舱殿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布奥裸。 她就那樣靜靜地躺著,像睡著了一般沪袭。 火紅的嫁衣襯著肌膚如雪湾宙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天枝恋,我揣著相機(jī)與錄音创倔,去河邊找鬼。 笑死焚碌,一個(gè)胖子當(dāng)著我的面吹牛畦攘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播十电,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼知押,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鹃骂?” 一聲冷哼從身側(cè)響起台盯,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畏线,沒想到半個(gè)月后静盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寝殴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蒿叠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚣常。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡市咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵蚊,到底是詐尸還是另有隱情施绎,我是刑警寧澤溯革,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站谷醉,受9級(jí)特大地震影響致稀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孤紧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一豺裆、第九天 我趴在偏房一處隱蔽的房頂上張望拒秘。 院中可真熱鬧号显,春花似錦、人聲如沸躺酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹应。三九已至揽碘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間园匹,已是汗流浹背雳刺。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓锚贱,卻偏偏與公主長得像腻贰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倍阐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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