web-dev-qa-db-fra.com

Pourquoi Google Play Store indique-t-il que mon application Android est incompatible avec mon propre appareil?

J'hésite à poser cette question, car il semble que beaucoup de gens ont un problème similaire et pourtant je n'ai trouvé aucune solution qui résolve mon cas particulier.

J'ai développé une application Android ( lien vers l'application réelle _) et l'ai téléchargée sur le Play Store. Le Play Store dit

"This app is incompatible with your XT Mobile Network HTC HTC Wildfire S A510b."

Bien sûr, c’est le téléphone sur lequel j’ai développé l’application, donc il devrait être compatible. Certains utilisateurs d’autres appareils disent qu’il signale qu’il est compatible, d’autres disent que c’est incompatible, mais je ne trouve aucune tendance. (Apparemment, je ne connais pas beaucoup de personnes avec des appareils Android.)

J'ai essayé ce qui suit:

  • déplacer un fichier de grande taille hors du répertoire res/raw comme suggéré par cette réponse . Le seul fichier présent était un fichier texte d'environ 700 ko, mais je l'ai déplacé vers assets/ sans modification apparente.

  • en ajoutant les deux assertions de fonctionnalités suivantes:

    <uses-feature Android:name="Android.hardware.faketouch" />
    <uses-feature Android:name="Android.hardware.touchscreen" Android:required="false" />
    

    en pensant que peut-être mon téléphone ne prétend pas prendre en charge la fonction habituelle Android.hardware.touchscreen, mais encore une fois, sans changement apparent.

Lors du téléchargement du fichier APK sur le Play Store, le seul filtre indiqué comme étant actif est la fonction Android.hardware.faketouch.

Ce qui suit est la sortie de aapt dump badging bin/NZSLDict-release.apk:

package: name='com.hewgill.Android.nzsldict' versionCode='3' versionName='1.0.2'
sdkVersion:'4'
targetSdkVersion:'4'
uses-feature:'Android.hardware.faketouch'
uses-feature-not-required:'Android.hardware.touchscreen'
application-label:'NZSL Dictionary'
application-icon-160:'res/drawable/icon.png'
application: label='NZSL Dictionary' icon='res/drawable/icon.png'
launchable-activity: name='com.hewgill.Android.nzsldict.NZSLDictionary'  label='NZSL Dictionary' icon=''
main
other-activities
supports-screens: 'small' 'normal' 'large'
supports-any-density: 'true'
locales: '--_--'
densities: '160'

et pour être complet, mon fichier manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.hewgill.Android.nzsldict"
      Android:versionCode="3"
      Android:versionName="1.0.2">
    <uses-sdk Android:minSdkVersion="4" Android:targetSdkVersion="4" />
    <uses-feature Android:name="Android.hardware.faketouch" />
    <uses-feature Android:name="Android.hardware.touchscreen" Android:required="false" />
    <application Android:label="@string/app_name"
        Android:icon="@drawable/icon">
        <activity Android:name="NZSLDictionary"
                  Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity Android:name=".WordActivity" />
        <activity Android:name=".VideoActivity" />
        <activity Android:name=".AboutActivity" />
    </application>
</manifest> 

Dans la section "Disponibilité des appareils" du Play Store, je constate que tous les appareils HTC, y compris le Wildfire S, sont pris en charge, à l'exception de "G1 (truite)" et "Touch Viva (opale)", quels qu'ils soient. En fait, je vois que "Wildfire S (merveille)" et "Wildfire S A515c (marvelc)" sont répertoriés comme étant pris en charge, mais que mon "Wildfire S A510b" n’est pas spécifiquement mentionné. Ce type d'identifiant de sous-modèle est-il aussi important? J'ai pu télécharger plusieurs autres applications de Google Play sur mon téléphone sans aucun problème.

La seule chose que je n'ai pas faite à ce stade est d'attendre 4 à 6 heures après le téléchargement de la dernière version (comme dans ce commentaire ) pour voir s'il est toujours incompatible avec mon téléphone. Cependant, la page Play Store affiche actuellement la version 1.0.2, la dernière que j'ai téléchargée.

83
Greg Hewgill

La réponse semble être uniquement liée à la taille de l'application. J'ai créé une application simple "Bonjour tout le monde" avec rien de spécial dans le fichier manifeste, je l'ai téléchargée sur le Play Store et elle a été signalée compatible avec mon appareil.

Je n'ai rien changé dans cette application, sauf pour ajouter plus de contenu dans le répertoire res/drawable. Lorsque la taille de .apk a atteint environ 32 Mo, le Play Store a commencé à signaler que mon application était incompatible avec mon téléphone.

Je vais essayer de contacter le service d'assistance aux développeurs de Google et demander des éclaircissements sur la raison de cette limite.

UPDATE: Voici la réponse de l'assistance aux développeurs Google à cette question:

Merci pour votre note. Actuellement, la taille maximale des fichiers pour le téléchargement d'une application sur Google Play est d'environ 50 Mo.

Cependant, certains périphériques peuvent avoir une partition de cache inférieure à 50 Mo, ce qui rend l'application indisponible pour le téléchargement par les utilisateurs. Par exemple, certains appareils HTC Wildfire sont connus pour avoir des partitions de cache de 35 à 40 Mo. Si Google Play parvient à identifier un tel appareil dont le cache n'est pas assez volumineux pour stocker l'application, il peut empêcher son affichage par l'utilisateur.

J'ai fini par résoudre mon problème en convertissant tous les fichiers PNG en JPG, avec une légère perte de qualité. Le fichier .apk fait maintenant 28 Mo, ce qui est inférieur au seuil que Google Play applique pour mon téléphone.

J'ai également supprimé tous les éléments <uses-feature>, et je n'ai maintenant que ceci:

<uses-sdk Android:minSdkVersion="4" Android:targetSdkVersion="15" />
82
Greg Hewgill

Je me suis également heurté à ce problème: j'ai réalisé tous mes développements sur un Lenovo IdeaTab A2107A-F, je pouvais exécuter des versions de développement, et même publier des fichiers APK signés (installés avec adb install) sans aucun problème. Une fois publié en mode test Alpha et disponible sur Google Play, j'ai reçu le message d'erreur "incompatible avec votre appareil".

Il s’est avéré que j’avais placé dans mon AndroidManifest.xml les éléments suivants d’un tutoriel:

<uses-feature Android:name="Android.hardware.camera" />
<uses-feature Android:name="Android.hardware.camera.autofocus" />
<uses-permission Android:name="Android.permission.CAMERA" />

Eh bien, le Lenovo IdeaTab A2107A-F ne possède pas d'appareil photo à mise au point automatique (que j'ai appris de http://www.phonearena.com/phones/Lenovo-IdeaTab-A2107_id7611 , sous Inconvénients: manque de caméra autofocus. ). Peu importe si j'utilisais cette fonctionnalité, Google Play a dit non. Une fois que cela a été supprimé, j'ai reconstruit mon APK, je l'ai transféré sur Google Play et assez, mon IdeaTab était maintenant dans la liste des appareils compatibles.

Donc, revérifiez chaque <uses-feature> et si vous avez encore copié-collé à partir de la vérification Web. Les chances sont que vous avez demandé une fonctionnalité que vous n'utilisez même pas.

14
Joe

J'ai également rencontré ce problème lors du développement d'une application pour un client souhaitant disposer de vidéos hors connexion disponibles à partir de leur application. J'ai écrit un article de blog expliquant pourquoi l'application sur laquelle j'avais travaillé pendant des mois ne serait pas affichée dans le Play Store pour mon appareil ( l'article peut être trouvé ici ). J'ai trouvé la même chose que @Greg Hewgill a trouvé: limitations de partition Cache sur certains périphériques.

Le voyage ne s'est pas arrêté là pour moi. Le client souhaitait avoir ces vidéos dans l'application et ne souhaitait pas que la qualité de la vidéo soit diminuée. Après quelques recherches, je me suis rendu compte que en utilisant des fichiers d'extension était la solution idéale à notre problème.

Pour partager mes connaissances avec la communauté Android, j'ai présenté un exposé sur droidconNL 2012 à propos des fichiers d'extension. J'ai créé une présentation et un exemple de code pour illustrer à quel point il est facile de commencer à utiliser des fichiers d'extension. Pour tous ceux qui souhaitent utiliser des fichiers d’extension pour résoudre ce problème, n'hésitez pas à consulter le message contenant la présentation et le code exemple

10
Ali Derbane

Finlay, j'ai rencontré le même problème dans ma candidature. J'ai développé l'application Phone Gap pour Android:minSdkVersion="7" & Android:targetSdkVersion="18" qui est la version récente de la plate-forme Android. 

J'ai trouvé le problème en utilisant Google Docs

Le problème peut être lié au fait que j’ai écrit une fonction JS qui fonctionne sur KEY-CODE pour ne valider que les alphabets et les nombres, mais le clavier a un code différent, spécialement conçu pour le clavier de l’ordinateur et le clavier mobile. C'était donc mon problème.

Je ne suis pas sûr que ma réponse soit correcte ou non et il est possible que cela puisse paraître plus agréable, mais je vais essayer de lister certains points qui devraient être pris en compte pendant la construction de l'application. J'espère que vous suivez cela à la résoudre ce genre de problème. 

  • Utilisez le Android:minSdkVersion="?" selon vos besoins et le Android:targetSdkVersion="?" devrait être la dernière dans laquelle votre application ciblera. voir plus

  • Essayez d'ajouter uniquement les autorisations qui seront utilisées dans votre application et supprimez toutes celles qui sont inutiles.

  • Vérifier l'écran pris en charge par application 

    <supports-screens 
    Android:anyDensity="true"
    Android:largeScreens="true"
    Android:normalScreens="true"
    Android:resizeable="true"
    Android:smallScreens="true"
    Android:xlargeScreens="true"/>
    
  • Peut-être avez-vous implémenté un code de costume ou un widget de costume qui ne pouvait pas fonctionner en retard sur un appareil ou un onglet; alors, avant d'écrire le code long, essayez d'abord d'écrire du code bêta et testez-le, que votre code soit exécuté sur tous les appareils ou non. .

  • Et j'espère que Google publiera un outil capable de valider votre code avant le téléchargement de l'application. Il indique également qu'en raison d'une raison particulière, nous ne sommes pas autorisés à exécuter votre application sur un appareil afin que nous puissions le résoudre facilement.

7
Chintan Khetiya

Vous voudrez peut-être essayer de définir l'attribut supports-screens:

<supports-screens
    Android:largeScreens="true"
    Android:normalScreens="true"
    Android:smallScreens="true"
    Android:xlargeScreens="true" >
</supports-screens>

Le Wildfire a un petit écran et, selon la documentation, cet attribut devrait avoir la valeur "vrai" par défaut dans tous les cas, mais il y a des problèmes connus liés aux paramètres des écrans de prise en charge sur différents téléphones.

En outre, comme le suggère David, compilez et ciblez toujours contre la version la plus récente de l'API Android, à moins que vous n'ayez de fortes raisons de ne pas le faire. Presque tous les SDK antérieurs à la version 2.2 présentent un problème sérieux ou un comportement étrange; ce dernier aide à résoudre ou à dissimuler beaucoup d’entre eux. Vous pouvez (et devriez) utiliser l'outil Lint pour vérifier que votre application reste compatible avec API 4 lors de la préparation d'une version.

7
Michael A.

J'ai quelques suggestions:

  1. Tout d'abord, vous semblez utiliser l'API 4 comme cible. Si je comprends bien, il est recommandé de toujours compiler avec le dernier SDK et de configurer votre Android:minSdkVersion en conséquence.

  2. Dans cet esprit, rappelez-vous que Android:required attribut a été ajouté dans l'API 5 :

La déclaration de fonctionnalité peut inclure un attribut Android:required=["true" | "false"] (si vous compilez avec une API de niveau 5 ou supérieur), qui vous permet de spécifier si l'application (...)

Par conséquent, je vous conseillerais de compiler avec le SDK 15, de définir targetSdkVersion sur 15 également et de fournir cette fonctionnalité.

Il indique également ici, sur le site de jeu, que incompatible avec n'importe quel appareil dont je dispose (coïncidence?) Pain d'épice} _ (Galaxy Ace et Galaxy Y ici). Mais il s’agit de compatible avec mon Galaxy Tab 10.1 (Honeycomb), Nexus S et Galaxy Nexus (tous deux sur ICS).

Cela m’a également laissé perplexe. C’est une hypothèse très sauvage, mais puisque Android.hardware.faketouchest API11 + , pourquoi n’essayez-vous pas de le supprimer pour voir si cela fonctionne? Ou peut-être que tout cela est lié de toute façon, puisque vous essayez d'utiliser des fonctionnalités (faketouch) et l'attribut required qui ne sont pas disponibles dans l'API 4. Et dans ce cas, vous devez compiler avec la dernière API.

J'essaierais d'abord, et supprimerais l'exigence faketouch seulement en dernier recours (bien sûr) --- puisque cela fonctionne lors du développement, je dirais que c'est simplement une question de l'application compilée ne reconnaissant pas la fonctionnalité (en raison des exigences du SDK ), laissant ainsi des problèmes de filtrage inattendus sur Play.

Désolé, si cette proposition ne répond pas à votre question, mais il est très difficile de diagnostiquer ce type de problèmes et de déterminer la solution sans tester réellement. Ou du moins pour moi sans toutes les connaissances appropriées sur la manière dont Play filtre réellement les applications.

Bonne chance.

6
davidcesarino

Des autorisations qui impliquent des fonctionnalités

par exemple, la fonctionnalité Android.hardware.bluetooth a été ajoutée dans Android 2.2 (API de niveau 8), mais l’API Bluetooth à laquelle elle fait référence a été ajoutée dans Android 2.0 (API de niveau 5). De ce fait, certaines applications ont pu utiliser l'API avant de pouvoir déclarer qu'elles en ont besoin via le système.

Pour empêcher la mise à disposition involontaire de ces applications, Google Play suppose que certaines autorisations liées au matériel indiquent que les fonctionnalités matérielles sous-jacentes sont requises par défaut. Par exemple, les applications utilisant Bluetooth doivent demander la permission BLUETOOTH dans un élément. Pour les applications existantes, Google Play suppose que la déclaration de permission signifie que la fonctionnalité sous-jacente Android.hardware.bluetooth est requise par l'application et configure le filtrage en fonction de cette fonctionnalité. .

Le tableau ci-dessous répertorie les autorisations qui impliquent des exigences de fonctionnalité équivalentes à celles déclarées dans les éléments. Notez que les déclarations, y compris les attributs Android: requis déclarés, ont toujours priorité sur les fonctionnalités impliquées par les autorisations ci-dessous.

Pour toutes les autorisations ci-dessous, vous pouvez désactiver le filtrage basé sur la fonctionnalité implicite en déclarant explicitement la fonctionnalité implicite, dans un élément, avec un attribut Android: required = "false". Par exemple, pour désactiver tout filtrage basé sur l’autorisation CAMERA, vous devez ajouter cette déclaration au fichier manifeste:

<uses-feature Android:name="Android.hardware.camera" Android:required="false" />


<uses-feature Android:name="Android.hardware.bluetooth" Android:required="false" />
<uses-feature Android:name="Android.hardware.location" Android:required="false" />
<uses-feature Android:name="Android.hardware.location.gps" Android:required="false" />
<uses-feature Android:name="Android.hardware.telephony" Android:required="false" />
<uses-feature Android:name="Android.hardware.wifi" Android:required="false" />

http://developer.Android.com/guide/topics/manifest/uses-feature-element.html#permissions

6

Pour donner une solution supplémentaire à ce qui précède 'Cette application est incompatible avec votre problème ...', laissez-moi partager ma solution pour une autre cause. J'ai essayé d'installer une application sur un appareil bas de gamme Samsung Galaxy Y (GT-S6350) et j'ai eu cette erreur du Play Store. Pour tester diverses configurations AndroidManifest, j'ai créé un compte et suivi la procédure décrite dans https://stackoverflow.com/a/5449397/372838 jusqu'à ce que mon appareil apparaisse dans la liste des appareils pris en charge.

Il s'est avéré que de nombreux appareils deviennent incompatibles lorsque vous utilisez l'autorisation d'utilisation de l'appareil photo:

<uses-permission Android:name="Android.permission.CAMERA" />

Lorsque j'ai supprimé cette autorisation spécifique, l'application était disponible pour 1180 appareils au lieu de 870. J'espère que cela aidera quelqu'un

5
dvtoever

Typique, trouvé juste après avoir posté cette question dans le désespoir; l'outil que je cherchais était:

$ aapt dump badging <my_apk.apk>
3
keldar

Bien qu'il y ait déjà pas mal de réponses, j'ai pensé que ma réponse pourrait aider certaines personnes qui ont exactement le même problème que le mien. Dans mon cas, le problème provient des autorisations suivantes, ajoutées par la suggestion d'un réseau publicitaire:

<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />

La conséquence des autorisations ci-dessus est que les fonctionnalités suivantes sont ajoutées automatiquement:

Android.hardware.LOCATION
Android.hardware.location.GPS
Android.hardware.location.NETWORK

La raison en est que "Google Play tente de découvrir les exigences implicites en matière de fonctionnalités d'une application en examinant d'autres éléments déclarés dans le fichier manifeste, en particulier des éléments." avec eux. La suppression de ces autorisations a résolu le problème immédiatement.

3
Hong

J'ai trouvé un moyen supplémentaire dans lequel ce problème se produit:
Le système d'exploitation d'origine de mon téléphone LG était Froyo (Android 2.2) et a été mis à jour vers ICS (Android 4.0.4) . Mais la console des développeurs Google Play indique qu'il détecte mon téléphone. en tant qu'appareil Froyo . (Google Play n'autorisait pas le téléchargement de l'application en raison de la fausse "incompatibilité", mais il détectait tout de même l'installation.) 

Les paramètres du téléphone, dans "logiciel", indiquent ICS V4.0.4. Il semble que les informations de serveur Google Play du téléphone ne soient pas mises à jour pour refléter la mise à jour ICS sur le périphérique. Le manifeste de l'application, minSDK, est défini sur Honeycomb (3.0). Par conséquent, Google Play filtre l'application.


2
ajay1865

J'ai eu le même problème. Cela était dû à la présence de codes et de numéros de version différents dans mon script de construction de manifeste et gradle. Je l'ai résolu en supprimant le code et le numéro de version de mon manifeste et en laissant Gradle s'en charger.

0
John Moffitt