1. 程式人生 > >Android8.0應用安裝許可權處理

Android8.0應用安裝許可權處理

最近Google釋出8.0加強了未知應用的監管,本文記錄解決8.0App版本自動更新由於沒有未知應用安裝許可權(此許可權需使用者手動開啟)導致升級失敗問題。相容8.0以前的版本。溫馨提示記得新增基本許可權(6.0以上需動態申請哦):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

1、首先在專案的res->values目錄下新建一個file_paths.xml檔案內容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="download"
            path="" />
    </paths>
</resources>

2、接下來在AndroidManifest.xml->application下新增如下內容,其中FileProvider這裡不解釋,請Google或百度:

<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>

3、以下內容的前提是安裝包已經下載完畢後的操作,檢查是否獲得未知應用安裝許可權(Android8.0系統):

    注:1、showError()方法是自定義toast,修改為你自己提示方式的就可以了;

           2、DialogHelper.showConfirm()為自定義提示框,同樣修改為你自己的提示對話方塊;

           3、對應字串說明:

                apk_damage:{0}安裝包已損壞或不存在;

                app_name:應用名稱;

                updateFile:apk檔案路徑;

                need_unknown_app_permission:安裝應用需要開啟未知來源許可權,請去設定中開啟許可權

/**
 * 檢測是否已經開啟許可權
 *
 * @param updateFile 安裝包檔案
 */
private void checkNeedPermission(File updateFile) {
    if (updateFile == null) {
        showError(MessageFormat.format(getString(R.string.apk_damage), getString(R.string.app_name)));
        return;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls();
        if (haveInstallPermission) {
            startInstallAPK(updateFile);
        } else {
            this.updateFile = updateFile;
            DialogHelper.showConfirm(getString(R.string.need_unknown_app_permission), new DialogFactory.OnDialogListener() {
                @RequiresApi(api = Build.VERSION_CODES.O)
                @Override
                public void onConfirm() {
                    startInstallPermissionSettingActivity();
                }

                @Override
                public void onCancel() {

                }
            });
        }
    } else {
        startInstallAPK(updateFile);
    }
}

4、開啟未知應用介面,使用者處理後會通過onActivityResult返回處理結果:

private static final int INSTALL_PACKAGES_REQUEST_CODE = 0x001;

unknownApkInstallDenied欄位我這裡是用來判斷使用者拒絕開啟未知應用許可權後再次安裝時不用重新下載apk直接進行第3步操作使用,如無相關業務邏輯刪除便是。

/**
 * 開啟未知應用介面
 */
@RequiresApi(api = Build.VERSION_CODES.O)
private void startInstallPermissionSettingActivity() {
    Uri packageURI = Uri.parse("package:" + getPackageName());
    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
    startActivityForResult(intent, INSTALL_PACKAGES_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == INSTALL_PACKAGES_REQUEST_CODE) {
        this.unknownApkInstallDenied = false;
        startInstallAPK(updateFile);
    } else {
        this.unknownApkInstallDenied = true;
    }
}

5、開始安裝最新apk:

Uri contentUri = FileProvider.getUriForFile(context, "你的應用包名.fileprovider", updateFile);

中的“你的應用包名.fileprovider”對應步驟2中"${applicationId}.fileprovider"(注:${applicationId}預設就是專案包名,前提是你沒有手動修改過app->build.gradle->defaultConfig下的applicationId)

android:authorities="${applicationId}.fileprovider"

必須一致

/**
 * 開始安裝
 *
 * @param updateFile 安裝包檔案
 */
private void startInstallAPK(File updateFile) {
    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);
        Uri contentUri = FileProvider.getUriForFile(context, "你的應用包名.fileprovider", updateFile);
        String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(FileUtils.getFileExtension(updateFile));
        intent.setDataAndType(contentUri, type);
    } else {
        String type = "application/vnd.android.package-archive";
        intent.setDataAndType(Uri.fromFile(updateFile), type);
    }
    startActivity(intent);
    finish();
}
/**
 * 獲取全路徑中的檔案拓展名
 *
 * @param file 檔案
 * @return 檔案拓展名
 */
public static String getFileExtension(File file) {
    if (file == null) return null;
    return getFileExtension(file.getPath());
}

相關推薦

Android8.0應用安裝許可權處理

最近Google釋出8.0加強了未知應用的監管,本文記錄解決8.0App版本自動更新由於沒有未知應用安裝許可權(此許可權需使用者手動開啟)導致升級失敗問題。相容8.0以前的版本。溫馨提示記得新增基本許可權(6.0以上需動態申請哦): <uses-permissio

Android8.0未知來源應用安裝許可權最好的適配方案

Android8.0的諸多新特性中有一個非常重要的特性:未知來源應用許可權 以前安裝未知來源應用的時候一般會彈出一個彈窗讓使用者去設定允許還是拒絕,並且設定為允許之後,所有的未知來源的應用都可以被安裝。 Android8.0的變化是,未知應用安裝許可權的開關被除掉,取而代之的是未知來源應用的管理列表,需

Android8.0 允許安裝未知來源許可權(一)

一. 簡介 在Android8.0之前的系統中,使用者要從除官方應用商店之外的來源安裝App時,需要開啟系統設定當中的”允許未知來源”安裝應用程式的選項,在最新的Android O當中谷歌已經刪除了該永久授權的選項,從系統設定當中已經找不到該開關。谷歌將永久授權修改為每次的單獨授權

Android8.0+應用內更新安裝apk失敗

描述 應用內更新,下載apk呼叫系統api進行安裝,在android8.0+手機上無法安裝,在android8.0以下可以安裝成功,看了看google for android 官網得知android8.0許可權控制的更嚴格,安裝應用需要應用本身具有“安裝未知來

Android 6 0 執行時許可權處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 6 0 執行時許可權處理完全解析

                     一、概述ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。當然非常推薦閱讀官網許可權相關文章:本文也是在上述文章基礎上理解、實驗以及封裝。二、執行時許可權的變化及特點對於6.0以下的許可權及在安裝的時候,根據許可權宣告產生一個

Android6.0執行時許可權處理-超簡單封裝

之前除錯的時候,出現了一個問題,就是當我開啟二維碼掃描介面的時候,對於一部分手機一直不會出現那個掃描框,這點我也很是鬱悶,這不好整啊,畢竟二維碼介面是用的別人的,怎麼改啊?這個時候我分析了一下原因,最後知道只有部分6.0的手機才會出現這種情況,那麼這就簡單了。下

這可能是最精簡的Android6.0執行時許可權處理,70行程式碼的工具類。附:各種許可權詳細處理

0x00:前言 對於Android6.0執行時許可權的處理方式網上有很多,包括註解,RxJava等等。一直沒有正面提到我關心的問題--如果我不在Activity或者Fragment裡面,需要執行時許可權該怎麼去做?導致我開始一直以為執行時許可權的處理必需要在Activity

Android 6.0 執行時許可權處理

執行時許可權介紹 Android 6.0在我們原有的AndroidManifest.xml宣告許可權的基礎上, 又新增了執行時許可權動態檢測,以下許可權都需要在執行時判斷: 執行時許可權處理 Android6.0系統預設為targetSdkVersion小於23的應用預設授予了所申請的所有許可權,

Android 6.0 執行時許可權處理完全解析

一、概述 ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。 當然非常推薦閱讀官網許可權相關文章: 本文也是在上述文章基礎上理解、實驗以及封裝。 二、執行時許可權的變化及特點 對於6.0以下

安卓6.0執行時許可權處理方案

    許可權檢查一般放在APP的入口,比如說閃屏頁splashactivity中或者baseapplication中。     其中需要兩個類,一個是PermissionChecker,一個是PermissionsActivity。第一個是用來檢測當前是否已經獲取到了申請

Android6.0執行時許可權處理(專案中使用到的一種形式,沒有使用第三方庫)

相信大家都知道Android6.0之後的許可權申請跟之前的版本有一個很大的差別,那就是任何危險許可權都必須經過使用者的手動選擇是否接受來做相應的操作,而Android6.0之前安裝應用的過程中是預設選

安卓開發——android8.0應用崩潰,報錯: Only fullscreen opaque activities can request orientation

上週末升級了最新的MIUI 8.1.18開發版,早早的吃上了奧利奧 Android O(雖然在miui下並沒有什麼變化(-_-),但還是很開心的,畢竟我的小米MIX2終於可以用到了之前只是內測的全屏手

Android app實現自更新和安裝許可權檢測適配Android6.0以下和Android6.0和Android7.0Android8.0總結篇

首先下載問檔案需要在AndroidManifest.xml裡新增SD卡讀寫許可權,下面兩個許可權:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <us

Android8.0適配之——版本升級不跳轉應用安裝頁面的完美解決

      最近開發遇到了個問題,app升級的時候,其他手機都能正常升級,下載完安裝包,跳到安裝頁面進行新版本的安裝。但卻有使用者反映,華為P10和華為Mate 9升級時,怎麼也無法跳轉到安裝頁面。起初我以為是華為手機自身系統的問題(因為手上的華為測試機都是正常的),還特地對

Android8.0適配之一應用圖標適配

weixin ref 就會 gpo asset mage studio 我們 編輯器 1、適配條件 target在26以下,不用做適配。 如果設置target=26及以上,在8.0不做適配,就會顯示成一個圓圈包圍著logo,不好看。 2、Android 8.0應用圖標適配

MySQL8.0.12安裝步驟及問題處理

關於資料庫的安裝真是一條心酸而漫長的道路 版本:mysql8.0.12 下載地址:  連結:https://pan.baidu.com/s/1tRuZnHJhacnacQF2yP7eYA              

Android 6.0執行時許可權勾選不再詢問後該如何處理

Android 6.0執行時許可權勾選不再詢問後該如何處理? 當第一次請求許可權申請被拒絕後再進行第二次申請時,對話方塊中會多出一個 不再詢問 的複選框。如果勾選了該複選框並且拒絕請求,那麼以後將無法再申請該許可權。也就是說在呼叫 requestPermissions() 後,onRequest

「在行動」重點關注!綠色應用2.0標準釋出,超過半數應用存在許可權過度獲取問題

相信很多安卓使用者都有這樣的體驗,安裝應用的時候各種許可權申請讓自己眼花繚亂,不耐心的可能一股腦都點同意了,耐心的可能會一項一項看,拒絕一些敏感許可權,比如位置資訊,讀取聯絡人之類的,避免自己的隱私被洩露。隨著安卓綠色聯盟應用體驗標準2.0的釋出,使用者的這個煩惱將會得到改善。 近日,華為

為什麼應用程式在Android 7.0之後安裝和執行都變得更快?

需要了解幾個概念 Dalvik 虛擬機器 負責解釋dex檔案為機器碼,每次執行程式碼,都需要Dalvik將dex程式碼翻譯為微處理器指令,然後交給系統處理,這樣效率不高。 JIT(Just-In-Time) 為了解決上面的問題,Google在2