Android Oreo(8.0)、不明なソースから(ユーザーの観点から)アプリのインストールを許可する方法、およびそれらをインストールする許可を取得するプロセスに対して行われたいくつかの変更(開発者の観点から)。
開発者側で必要なすべての手順を見つけるのが特に難しいと感じたので、ここで解決策を尋ねて自分で質問に答えると便利だと思いました。同じ障害に直面しています。
答えには次の質問が含まれます。
(ここでまだ何かを見逃している場合は、それを指摘する追加の回答やコメントに感謝します。)
まず最初に、アプリケーションはbuild.gradleまたはAndroidManifest.xmlでtargetSdkVersion
を26(APIレベルAndroid Oreo)以上)で宣言する必要があります。
次に、上記の質問に答えます。
- パッケージのインストールをリクエストできるかどうかを確認するにはどうすればよいですか?
これは、アクティビティのコードのどこでも getPackageManager().canRequestPackageInstalls()
を使用して確認できます。適切なアクセス許可を宣言しない場合や間違ったSDKバージョンをターゲットにしない場合、このメソッドは常にfalse
を返すことに注意してください。
- どのような正確な許可を要求する必要がありますか?
次のように、AndroidManifest.xmlで _Manifest.permission.REQUEST_INSTALL_PACKAGES
_ を宣言する必要があります。
_ <uses-permission Android:name="Android.permission.REQUEST_INSTALL_PACKAGES" />
_
- この許可を付与するようユーザーに促すにはどうすればよいですか?
Intent _ACTION_MANAGE_UNKNOWN_APP_SOURCES
_ を使用して、ユーザーを適切な宛先に送信できます。
_startActivity(new Intent(Android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES));
_
次の方法で、ユーザーをアプリケーションの特定の設定に直接送信することもできます。
_startActivity(new Intent(Android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:your.application.package")));
_
- 指定した.apkをインストールするようユーザーに促すにはどうすればよいですか?
適切な権限が付与されていることを確認したら、次のコマンドを使用して、アクティビティのコードの任意の場所(this
がアクティビティのContext
を指す)に.apkファイルをインストールするようユーザーに促すことができます。
_Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(FileProvider.getUriForFile(this, "your.application.package.fileprovider", new File("/path/to/your/apk")), "application/vnd.Android.package-archive");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
_
インストールが成功したか、キャンセルされたか、失敗したかを知りたい場合は、intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
を追加してstartActivityForResult(Intent, int)
で開始することもできます。
.apkファイルのUriを正しく取得する方法については、 FileProvider
を参照してください。