Dans Android Oreo (8.0), plusieurs modifications ont été apportées sur la façon d'autoriser l'installation d'applications à partir de sources inconnues (du point de vue de l'utilisateur) et sur le processus d'obtention de l'autorisation de les installer ( du point de vue du développeur).
Étant donné que j'ai trouvé particulièrement difficile de trouver toutes les étapes nécessaires du côté développeur, j'ai pensé qu'il était utile de demander ici la solution et de répondre moi-même à la question, maintenant que j'ai trouvé les réponses, pour référence future à ceux qui sont face aux mêmes obstacles.
La réponse comprendra les questions suivantes:
(Si je manque encore quelque chose ici, je serais reconnaissant pour toute réponse ou commentaire supplémentaire le signalant.)
Pour commencer, votre application doit déclarer un targetSdkVersion
de 26 (niveau API Android Oreo) ou supérieur dans votre build.gradle ou AndroidManifest.xml pour que tout cela fonctionne.
Ensuite, pour répondre aux questions ci-dessus:
- Comment vérifier si je suis autorisé à demander une installation de package?
Vous pouvez vérifier cela en utilisant getPackageManager().canRequestPackageInstalls()
n'importe où dans le code de votre activité. Notez que cette méthode renvoie toujours false
, si vous ne déclarez pas l'autorisation appropriée ou ne ciblez pas la mauvaise version du SDK.
- Quelle autorisation exacte dois-je demander?
Vous devez déclarer Manifest.permission.REQUEST_INSTALL_PACKAGES
dans votre AndroidManifest.xml, comme ceci:
<uses-permission Android:name="Android.permission.REQUEST_INSTALL_PACKAGES" />
- Comment puis-je inviter l'utilisateur à accorder cette autorisation?
Vous pouvez envoyer l'utilisateur vers la destination appropriée, avec l'intention ACTION_MANAGE_UNKNOWN_APP_SOURCES
:
startActivity(new Intent(Android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES));
Vous pouvez également envoyer l'utilisateur plus directement vers le paramètre spécifique de votre application, avec:
startActivity(new Intent(Android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:your.application.package")));
- Comment inviter l'utilisateur à installer un .apk spécifié?
Une fois que vous vous êtes assuré que vous disposez de l'autorisation appropriée, vous pouvez inviter l'utilisateur à installer votre fichier .apk n'importe où dans le code de votre activité (où this
fait référence à Context
) de votre activité, en utilisant:
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);
Vous pouvez également ajouter intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
et commencer par startActivityForResult(Intent, int)
, si vous voulez savoir si l'installation a réussi, a été annulée ou a échoué.
Pour plus d'informations sur la façon d'obtenir correctement l'URI de votre fichier .apk, consultez FileProvider
.