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,其清楚地詳細介紹應用正在請求訪問的目錄。
具體檢視官方文件:
現象
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
}
}
}