概要: Android タブレット SDK 29+ にダウンロードされたパッケージを PackageInstaller を使用してインストールするにはどうすればよいですか?
targetSDK を 29 に更新した後、Android アプリからパッケージをダウンロードしてインストールしようとしていUri.fromFile
ますstartActivity
。例については、以下の私のコードを参照してください。
if(result) {
Intent intent = new Intent(Intent.ACTION_VIEW);
String filePath = Environment.getExternalStorageDirectory() + DOWNLOAD_DIR + updateContext.getFilename();
if (android.os.Build.VERSION.SDK_INT < 29) {
Ln.i("Inside < 29");
File file = new File(filePath);
Ln.i(filePath);
Uri uri = Uri.fromFile(file); //For < SDK 24
if (android.os.Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(
context, context.getApplicationContext()
.getPackageName() + ".provider", file);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
if(updateContext != UpdateContext.SELF) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);
} else {
Ln.i("Ran 29+ install");
InstallPackageAndroidQAndAbove(context, filePath, intent);
}
}
static void InstallPackageAndroidQAndAbove(Context context, String filePath, Intent intent) {
int sessionId = 0;
PackageInstaller.Session session = null;
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
sessionParams.setAppPackageName(context.getApplicationContext().getPackageName());
try {
sessionId = packageInstaller.createSession(sessionParams);
} catch (Exception ex) {
Ln.e("Could not create session");
}
try {
session = packageInstaller.openSession(sessionId);
} catch (Exception ex) {
Ln.e("Could not open session");
}
intent.setAction("ACTION_INSTALL_COMPLETE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
sessionId,
intent,
0);
IntentSender statusReceiver = pendingIntent.getIntentSender();
session.commit(statusReceiver);
}
Android 29 以降のタブレットで実行すると、ファイルは正しい場所にダウンロードされます。インストール ウィンドウが一瞬開き、その後自動的に閉じます。コンソールに警告はなく、サイレント敗北です。
PackageInstaller がどのように機能するかについての私の理解に問題があると思います。FileProvider.getUriForFile
問題が最初のメソッドの FileProvider 呼び出しにある可能性もあります。