1. 程式人生 > >Android 7.0 安裝失敗的兩個原因 Failed to collect certificates from /data/app/vmd......

Android 7.0 安裝失敗的兩個原因 Failed to collect certificates from /data/app/vmd......

提示安裝失敗,安裝包不完整


原因

這是因為Android7.0作用域目錄訪問 
在 Android 7.0 中,應用可以使用新的 API 請求訪問特定的外部儲存目錄,包括可移動媒體上的目錄,如 SD 卡。新 API 大大簡化了應用訪問標準外部儲存目錄的方式,如 Pictures 目錄。應用(如照片應用)可以使用這些 API(而不是使用 READ_EXTERNAL_STORAGE),其授予所有儲存目錄的訪問許可權或儲存訪問框架,從而讓使用者可以導航到目錄。

此外,新的 API 簡化了使用者嚮應用授予外部儲存訪問許可權的步驟。當您使用新的 API 時,系統使用一個簡單的許可權 UI,其清楚地詳細介紹應用正在請求訪問的目錄。 
具體檢視官方文件:

developer.android.google.cn

現象

app內升級會失敗,因為下載完apk包之後,發intent安裝時,沒有讀取包所在目錄的許可權,而導致讀取失敗,安裝失敗。

解決方式

 /**
     * 通過隱式意圖呼叫系統安裝程式安裝APK
     */
    public static void install(Context context) {
        File file = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                , "myApp.apk"
); Intent intent = new Intent(Intent.ACTION_VIEW); // 由於沒有在Activity環境下啟動Activity,設定下面的標籤 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if(Build.VERSION.SDK_INT>=24) { //判讀版本是否在7.0以上 //引數1 上下文, 引數2 Provider主機地址 和配置檔案中保持一致 引數3 共享的檔案 Uri apkUri = FileProvider.getUriForFile(context, "com.a520wcf.chapter11.fileprovider"
, file); //新增這一句表示對目標應用臨時授權該Uri所代表的檔案 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); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

提示安裝找不到安裝證書

原因

Android 7.0 引入一項新的應用簽名方案 APK Signature Scheme v2,它能提供更快的應用安裝時間和更多針對未授權 APK 檔案更改的保護。在預設情況下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 會使用 APK Signature Scheme v2 和傳統簽名方案來簽署您的應用。

雖然我們建議您對您的應用採用 APK Signature Scheme v2,但這項新方案並非強制性的。如果您的應用在使用 APK Signature Scheme v2 時不能正確開發,您可以停用這項新方案。禁用過程會導致 Android Studio 2.2 和 Android Plugin for Gradle 2.2 僅使用傳統簽名方案來簽署您的應用。要僅用傳統方案簽署,開啟模組級 build.gradle 檔案,然後將行 v2SigningEnabled false 新增到您的版本簽名配置中: 
具體檢視官方文件:developer.android.google

現象

美團多渠道打包工具就因為這個問題導致安裝失敗

解決方法

android {
    ...
    defaultConfig { ... }
    signingConfigs {
      release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
        v2SigningEnabled false
      }
    }
  }