Je ne sais pas ce que signifie "chargeur dynamique, dépendant de l'environnement utilisateur actuel". La réponse fournie par @Lie Ryan montre comment vous pouvez installer un APK téléchargé par tout moyen que vous choisissez.
CommonsWare
Réponses:
241
Vous pouvez facilement lancer un lien Play Store ou une invite d'installation:
Bonne réponse, mais ne codez pas en dur /sdcard, car c'est faux sur Android 2.2+ et d'autres appareils. Utilisez Environment.getExternalStorageDirectory()plutôt.
CommonsWare
3
Le répertoire / asset / n'existe que dans votre machine de développement, lorsque l'application est compilée en APK, le répertoire / asset / n'existe plus puisque tous les actifs sont zippés à l'intérieur de l'APK. Si vous souhaitez installer à partir de votre répertoire / asset /, vous devrez d'abord l'extraire dans un autre dossier.
Lie Ryan
2
@LieRyan. Ravi de voir votre réponse. J'ai le périphérique enraciné avec une ROM personnalisée. Je veux installer des thèmes dynamiquement sans demander à l'utilisateur d'appuyer sur le bouton d'installation. Puis-je faire cela.
Sharanabasu Angadi
1
Cela ne semble plus fonctionner lorsque targetSdk a 25 ans. Cela donne une exception: "android.os.FileUriExposedException: ... apk exposé au-delà de l'application via Intent.getData () ...". Comment venir?
développeur Android
4
@android developer: Je ne peux pas tester cela pour le moment, mais sur targetSdkVersion> = 24, ce qui suit s'applique: stackoverflow.com/questions/38200282/… donc vous devez utiliser FileProvider.
J'ai eu le même problème et après plusieurs tentatives, cela a fonctionné pour moi de cette façon. Je ne sais pas pourquoi, mais la définition des données et du type séparément a foiré mon intention.
Je ne peux pas assez voter pour cette réponse. Pour une raison quelconque, la définition séparée des données d'intention et du type MIME entraîne une exception ActivityNotFoundException dans le niveau 17 de l'API.
Brent M. Spell
Je viens aussi de voter positivement. Ce formulaire était le seul que je pouvais mettre au travail. Encore des années plus tard .. quel est ce bug bizarre? Des heures perdues. J'utilise Eclipse (Helios), BTW.
Tam
10
@ BrentM.Spell et autres: regardez dans la documentation, vous verrez que chaque fois que vous définissez uniquement les données OU le type, l'autre est automatiquement annulé, par exemple: setData()entraînerait la suppression du paramètre type. Vous DEVEZ utiliser setDataAndType()si vous voulez donner des valeurs pour les deux. Ici: developer.android.com/reference/android/content/…
Bogdan Alexandru
41
Les solutions apportées à cette question s'appliquent toutes aux targetSdkVersionarticles 23 et inférieurs. Pour Android N, c'est-à-dire API niveau 24 et supérieur, cependant, ils ne fonctionnent pas et se bloquent avec l'exception suivante:
android.os.FileUriExposedException: file:///storage/emulated/0/... exposed beyond app through Intent.getData()
Cela est dû au fait qu'à partir d'Android 24, l' Uriadressage du fichier téléchargé a changé. Par exemple, un fichier d'installation nommé appName.apkstocké sur le système de fichiers externe principal de l'application avec le nom du package com.example.testserait comme
le pathName celui illustré dans l'exemple de contenu uri ci-dessus et pathValuec'est le chemin réel sur le système. Ce serait une bonne idée de mettre un "." (sans guillemets) pour pathValue ci-dessus si vous ne souhaitez pas ajouter de sous-répertoire supplémentaire.
Écrivez le code suivant pour installer l'apk avec le nom appName.apksur le système de fichiers externe principal:
Aucune autorisation n'est également nécessaire lors de l'écriture dans le répertoire privé de votre propre application sur le système de fichiers externe.
J'ai écrit ici une bibliothèque AutoUpdate dans laquelle j'ai utilisé ce qui précède.
J'ai suivi cette méthode. Cependant, il dit que le fichier est corrompu lorsque j'appuie sur le bouton d'installation. Im capable d'installer le même fichier en effectuant un transfert via Bluetooth. pourquoi
HI Lorsque vous obtenez une erreur de fichier corrompu, quel est le mode de transport que vous avez donné à votre application pour apporter l'APK, si vous téléchargez à partir du serveur, vérifiez pour vider les flux du fichier de copie du serveur? Depuis l'installation de l'APK qui a été transféré par Bluetooth, c'est le problème, je suppose.
Sridhar S
2
java.lang.NullPointerException: tentative d'appel de la méthode virtuelle 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData (android.content.pm.PackageManager, java.lang.String)' sur une référence d'objet null
Makvin
Votre bibliothèque pourrait enfin avoir un fichier
Lisezmoi
2
Merci beaucoup, après une semaine de lutte avec cette réponse, j'ai résolu mon problème! @SridharS, je sais que cela fait longtemps, comme je le vois, mais si vous êtes intéressé, à la ligne 5, vous devriez ajouter .authorityStraprès context.getPackageName()cela devrait fonctionner.
sehrob
30
Eh bien, j'ai creusé plus profondément et trouvé des sources d'application PackageInstaller à partir d'Android Source.
android.permission.INSTALL_PACKAGES est disponible uniquement pour les applications signées par le système. Donc, cela n'aiderait pas beaucoup
Hubert Liberacki
21
Je veux juste partager le fait que mon fichier apk a été enregistré dans le répertoire "Data" de mon application et que je devais changer les autorisations sur le fichier apk pour qu'il soit lisible par tout le monde afin de permettre son installation de cette façon, sinon le système lançait "Erreur d'analyse: il y a un problème d'analyse du package"; donc en utilisant la solution de @Horaceman qui fait:
Je reçois la même erreur d'analyseur! Je ne sais pas comment le résoudre? J'ai défini file.setReadable (true, false) mais cela ne fonctionne pas pour moi
Troisièmement: Définissez path.xml dans le dossier res / xml comme ci-dessous! J'utilise ce chemin pour le stockage interne si vous voulez le changer pour autre chose, il y a quelques façons! Vous pouvez accéder à ce lien:
FileProvider
Permet à une application de demander l'installation de packages. Les applications ciblant des API supérieures à 25 doivent détenir cette autorisation pour utiliser Intent.ACTION_INSTALL_PACKAGE.
Veuillez vous assurer que les autorités du fournisseur sont les mêmes!
Merci, la quatrième étape était ce qui manquait à chacun d'eux.
Amin Keshavarzian
1
En effet, le 4ème point est absolument nécessaire. Toutes les autres réponses l'ont complètement raté.
whiteagle
Android.permission.REQUEST_INSTALL_PACKAGES n'est-il pas disponible uniquement pour les applications système ou les applications signées avec le magasin de clés système ou autre?
pavi2410
@Pavitra Permet à une application de demander l'installation de packages. Les applications ciblant des API supérieures à 25 doivent détenir cette autorisation pour utiliser Intent.ACTION_INSTALL_PACKAGE. Niveau de protection: signature
Hadi Note
Ce code n'utilise pas Intent.ACTION_INSTALL_PACKAGE. Alors pourquoi cette permission ??
Alexander Dyagilev
5
Une autre solution qui ne nécessite pas de coder en dur l'application réceptrice et qui est donc plus sûre:
Oui c'est possible. Mais pour cela, vous avez besoin du téléphone pour installer des sources non vérifiées. Par exemple, slideMe fait cela. Je pense que la meilleure chose que vous puissiez faire est de vérifier si l'application est présente et d'envoyer une intention pour l'Android Market. vous devez utiliser quelque chose que le schéma d'url pour Android Market.
market://details?id=package.name
Je ne sais pas exactement comment démarrer l'activité mais si vous démarrez une activité avec ce type d'URL. Il devrait ouvrir le marché Android et vous donner le choix d'installer les applications.
Comme je le vois, cette solution est la plus proche de la vérité :). Mais cela ne convient pas à mon cas. J'ai besoin d'un chargeur dynamique, dépendant de l'environnement utilisateur actuel et commercialisé - pas une bonne solution. Mais bon, merci.
Alkersan
4
Il convient de noter que si vous utilisez le DownloadManagerpour lancer votre téléchargement, assurez-vous de l'enregistrer dans un emplacement externe, par exemple setDestinationInExternalFilesDir(c, null, "<your name here>).apk";. L'intention d'un type d'archive de package ne semble pas aimer le content:schéma utilisé pour les téléchargements vers un emplacement interne, mais il aime file:. (Essayer d'encapsuler le chemin d'accès interne dans un objet File, puis d'obtenir le chemin d'accès ne fonctionne pas non plus, même s'il en résulte unfile: URL, car l'application ne analysera pas l'apk; il semble que ce doit être externe.)
String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));String title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length());Intent intent =newIntent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(newFile(filePath)),"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// without this flag android returned a intent error!MainActivity.this.startActivity(intent);
UpdateNode fournit une API pour Android pour installer des packages APK à partir d'une autre application.
Vous pouvez simplement définir votre mise à jour en ligne et intégrer l'API dans votre application - c'est tout.
Actuellement, l'API est en état bêta, mais vous pouvez déjà faire quelques tests vous-même.
À côté de cela, UpdateNode propose également d'afficher des messages via le système - assez utile si vous voulez dire quelque chose d'important à vos utilisateurs.
Je fais partie de l'équipe de développement client et j'utilise au moins la fonctionnalité de message pour ma propre application Android.
Dans Oreo et les versions supérieures, nous avons besoin d'une autorisation d'installation de ressources inconnue. donc dans le résultat de l'activité, vous devez vérifier le résultat pour la permission
Réponses:
Vous pouvez facilement lancer un lien Play Store ou une invite d'installation:
ou
Cependant, vous ne pouvez pas installer .apks sans l' autorisation explicite de l'utilisateur ; sauf si l'appareil et votre programme sont enracinés.
la source
/sdcard
, car c'est faux sur Android 2.2+ et d'autres appareils. UtilisezEnvironment.getExternalStorageDirectory()
plutôt.J'ai eu le même problème et après plusieurs tentatives, cela a fonctionné pour moi de cette façon. Je ne sais pas pourquoi, mais la définition des données et du type séparément a foiré mon intention.
la source
setData()
entraînerait la suppression du paramètre type. Vous DEVEZ utilisersetDataAndType()
si vous voulez donner des valeurs pour les deux. Ici: developer.android.com/reference/android/content/…Les solutions apportées à cette question s'appliquent toutes aux
targetSdkVersion
articles 23 et inférieurs. Pour Android N, c'est-à-dire API niveau 24 et supérieur, cependant, ils ne fonctionnent pas et se bloquent avec l'exception suivante:Cela est dû au fait qu'à partir d'Android 24, l'
Uri
adressage du fichier téléchargé a changé. Par exemple, un fichier d'installation nomméappName.apk
stocké sur le système de fichiers externe principal de l'application avec le nom du packagecom.example.test
serait commefile:///storage/emulated/0/Android/data/com.example.test/files/appName.apk
pour
API 23
et en dessous, alors que quelque chose commepour
API 24
et au-dessus.Plus de détails à ce sujet peuvent être trouvés ici et je ne vais pas les parcourir.
Pour répondre à la question
targetSdkVersion
de24
et au-dessus, il faut suivre ces étapes: Ajoutez ce qui suit au fichier AndroidManifest.xml:2. Ajoutez le
paths.xml
fichier suivant auxml
dossier surres
dans src, main:le
pathName
celui illustré dans l'exemple de contenu uri ci-dessus etpathValue
c'est le chemin réel sur le système. Ce serait une bonne idée de mettre un "." (sans guillemets) pour pathValue ci-dessus si vous ne souhaitez pas ajouter de sous-répertoire supplémentaire.Écrivez le code suivant pour installer l'apk avec le nom
appName.apk
sur le système de fichiers externe principal:Aucune autorisation n'est également nécessaire lors de l'écriture dans le répertoire privé de votre propre application sur le système de fichiers externe.
J'ai écrit ici une bibliothèque AutoUpdate dans laquelle j'ai utilisé ce qui précède.
la source
.authorityStr
aprèscontext.getPackageName()
cela devrait fonctionner.Eh bien, j'ai creusé plus profondément et trouvé des sources d'application PackageInstaller à partir d'Android Source.
https://github.com/android/platform_packages_apps_packageinstaller
D'après le manifeste, j'ai trouvé qu'il fallait une autorisation:
Et le processus réel d'installation se produit après confirmation
la source
Je veux juste partager le fait que mon fichier apk a été enregistré dans le répertoire "Data" de mon application et que je devais changer les autorisations sur le fichier apk pour qu'il soit lisible par tout le monde afin de permettre son installation de cette façon, sinon le système lançait "Erreur d'analyse: il y a un problème d'analyse du package"; donc en utilisant la solution de @Horaceman qui fait:
la source
Cela peut aider beaucoup les autres!
Première:
Deuxièmement: Pour Android 7 et supérieur, vous devez définir un fournisseur dans le manifeste comme ci-dessous!
Troisièmement: Définissez path.xml dans le dossier res / xml comme ci-dessous! J'utilise ce chemin pour le stockage interne si vous voulez le changer pour autre chose, il y a quelques façons! Vous pouvez accéder à ce lien: FileProvider
Quatrième: vous devez ajouter cette autorisation dans le manifeste:
la source
Une autre solution qui ne nécessite pas de coder en dur l'application réceptrice et qui est donc plus sûre:
la source
Oui c'est possible. Mais pour cela, vous avez besoin du téléphone pour installer des sources non vérifiées. Par exemple, slideMe fait cela. Je pense que la meilleure chose que vous puissiez faire est de vérifier si l'application est présente et d'envoyer une intention pour l'Android Market. vous devez utiliser quelque chose que le schéma d'url pour Android Market.
Je ne sais pas exactement comment démarrer l'activité mais si vous démarrez une activité avec ce type d'URL. Il devrait ouvrir le marché Android et vous donner le choix d'installer les applications.
la source
Il convient de noter que si vous utilisez le
DownloadManager
pour lancer votre téléchargement, assurez-vous de l'enregistrer dans un emplacement externe, par exemplesetDestinationInExternalFilesDir(c, null, "<your name here>).apk";
. L'intention d'un type d'archive de package ne semble pas aimer lecontent:
schéma utilisé pour les téléchargements vers un emplacement interne, mais il aimefile:
. (Essayer d'encapsuler le chemin d'accès interne dans un objet File, puis d'obtenir le chemin d'accès ne fonctionne pas non plus, même s'il en résulte unfile:
URL, car l'application ne analysera pas l'apk; il semble que ce doit être externe.)Exemple:
la source
N'oubliez pas de demander des autorisations:
Ajoutez dans AndroidManifest.xml le fournisseur et l'autorisation:
Créer le fournisseur de fichiers XML res / xml / provider_paths.xml
Utilisez l'exemple de code ci-dessous:
la source
Juste une extension, si quelqu'un a besoin d'une bibliothèque, cela pourrait aider. Merci à Raghav
la source
essaye ça
la source
Ajoutez d'abord la ligne suivante à AndroidManifest.xml:
Utilisez ensuite le code suivant pour installer apk:
la source
UpdateNode fournit une API pour Android pour installer des packages APK à partir d'une autre application.
Vous pouvez simplement définir votre mise à jour en ligne et intégrer l'API dans votre application - c'est tout.
Actuellement, l'API est en état bêta, mais vous pouvez déjà faire quelques tests vous-même.
À côté de cela, UpdateNode propose également d'afficher des messages via le système - assez utile si vous voulez dire quelque chose d'important à vos utilisateurs.
Je fais partie de l'équipe de développement client et j'utilise au moins la fonctionnalité de message pour ma propre application Android.
Voir ici une description comment intégrer l'API
la source
Essayez ceci - Écrivez sur le manifeste:
Écrivez le code:
la source
Dans Android Oreo et les versions supérieures, nous devons aborder différentes méthodes pour installer apk par programme.
Dans Oreo et les versions supérieures, nous avons besoin d'une autorisation d'installation de ressources inconnue. donc dans le résultat de l'activité, vous devez vérifier le résultat pour la permission
la source