web-dev-qa-db-ja.com

Android Oreo?で不明なソースからのインストールを管理する方法?

Android Oreo(8.0)、不明なソースから(ユーザーの観点から)アプリのインストールを許可する方法、およびそれらをインストールする許可を取得するプロセスに対して行われたいくつかの変更(開発者の観点から)。

開発者側で必要なすべての手順を見つけるのが特に難しいと感じたので、ここで解決策を尋ねて自分で質問に答えると便利だと思いました。同じ障害に直面しています。

答えには次の質問が含まれます。

  1. パッケージのインストールをリクエストできるかどうかを確認するにはどうすればよいですか?
  2. どのような正確な許可を要求する必要がありますか?
  3. この許可を付与するようユーザーに促すにはどうすればよいですか?
  4. 指定した.apkをインストールするようユーザーに促すにはどうすればよいですか?

(ここでまだ何かを見逃している場合は、それを指摘する追加の回答やコメントに感謝します。)

13
Patneu

まず最初に、アプリケーションはbuild.gradleまたはAndroidManifest.xmlでtargetSdkVersionを26(APIレベルAndroid Oreo)以上)で宣言する必要があります。

次に、上記の質問に答えます。

  1. パッケージのインストールをリクエストできるかどうかを確認するにはどうすればよいですか?

これは、アクティビティのコードのどこでも getPackageManager().canRequestPackageInstalls() を使用して確認できます。適切なアクセス許可を宣言しない場合や間違ったSDKバージョンをターゲットにしない場合、このメソッドは常にfalseを返すことに注意してください。

  1. どのような正確な許可を要求する必要がありますか?

次のように、AndroidManifest.xmlで _Manifest.permission.REQUEST_INSTALL_PACKAGES_ を宣言する必要があります。

_    <uses-permission Android:name="Android.permission.REQUEST_INSTALL_PACKAGES" />
_
  1. この許可を付与するようユーザーに促すにはどうすればよいですか?

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")));
_
  1. 指定した.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 を参照してください。

29
Patneu