Почему в магазине Google Play говорится, что мое приложение Android несовместимо с моим собственным устройством?

Я не решаюсь задать этот вопрос, потому что кажется, что у многих людей есть подобная проблема, и все же я не нашел решения, которое решало бы мой конкретный случай.

Я разработал приложение для Android ( ссылка на само приложение) и загрузил его в магазин Play. Магазин Play говорит

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

Конечно, это телефон, на котором я разработал приложение, поэтому оно должно быть совместимым. Некоторые люди с другими устройствами говорят, что он сообщает о совместимости, другие говорят, что он сообщает о несовместимости, но я не могу найти никакой тенденции. (Видимо, я не знаю много людей с устройствами Android.)

Я пробовал следующее:

  • перемещение файла большого размера из res/raw каталог, как предлагается этим ответом. Там был только текстовый файл ~700 кБ, но я переместил его в assets/ без видимых изменений.

  • добавив следующие два утверждения функции:

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

    думая, что, возможно, мой телефон не претендует на поддержку обычного android.hardware.touchscreen особенность, но опять же, без видимых изменений.

При загрузке APK в Play store единственным фильтром, который он сообщает как активный, является android.hardware.faketouch особенность.

Ниже приводится вывод 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'

и для полноты, мой файл манифеста:

<?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> 

В разделе "Доступность устройств" в магазине Play можно увидеть, что поддерживаются все устройства HTC, включая Wildfire S, кроме "G1 (форель)" и "Touch Viva (опал)", независимо от того, что это такое. На самом деле я вижу, что и "Wildfire S (marvel)", и "Wildfire S A515c (marvelc)" указаны как поддерживаемые, но мой "Wildfire S A510b" конкретно не упоминается. Может ли такой вид идентификатора подмодели иметь такое большое значение? Я смог загрузить несколько других приложений из Google Play на свой телефон без проблем.

Единственное, что я пока не сделал, - это подождите 4-6 часов после загрузки последней версии (как в этом комментарии), чтобы увидеть, говорит ли она, что она несовместима с моим телефоном. Тем не менее, на странице Play store в настоящее время отображается версия 1.0.2, которая является последней, которую я загрузил.

15 ответов

Решение

Кажется, что ответ связан исключительно с размером приложения. Я создал простое приложение "hello world", в котором не было ничего особенного в файле манифеста, загрузил его в магазин Play и сообщил, что оно совместимо с моим устройством.

Я ничего не изменил в этом приложении, за исключением добавления контента в res/drawable каталог. Когда .apk Размер магазина достиг примерно 32 МБ, магазин Play начал сообщать, что мое приложение несовместимо с моим телефоном.

Я попытаюсь связаться со службой поддержки Google и попросить разъяснить причину этого ограничения.

ОБНОВЛЕНИЕ: Вот ответ поддержки разработчиков Google на это:

Спасибо за вашу заметку. В настоящее время максимальный размер файла для загрузки приложения в Google Play составляет примерно 50 МБ.

Тем не менее, некоторые устройства могут иметь кэш-память размером менее 50 МБ, что делает приложение недоступным для загрузки пользователями. Например, некоторые устройства HTC Wildfire известны наличием разделов кэша 35-40 МБ. Если Google Play может идентифицировать такое устройство, которое не имеет достаточно большого кеша для хранения приложения, оно может отфильтровать его от появления для пользователя.

Я решил свою проблему, преобразовав все файлы PNG в JPG с небольшой потерей качества. .apk размер файла теперь составляет 28 МБ, что ниже порогового значения, которое Google Play применяет для моего телефона.

Я также удалил все <uses-feature> вещи, и теперь есть только это:

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />

Я тоже столкнулся с этим - все свои разработки я выполнял на Lenovo IdeaTab A2107A-F и мог запускать на нем сборки для разработки и даже выпускать подписанные APK (установленные с adb install) без проблем. Как только он был опубликован в тестовом режиме Alpha и доступен в Google Play, я получил сообщение об ошибке "несовместимо с вашим устройством".

Оказывается, я поместил в свой AndroidManifest.xml следующее из учебника:

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

Ну, у Lenovo IdeaTab A2107A-F нет камеры с автофокусировкой (о чем я узнал на http://www.phonearena.com/phones/Lenovo-IdeaTab-A2107_id7611, в разделе Минусы: отсутствует камера с автофокусировкой). Независимо от того, использовал ли я эту функцию, Google Play сказал нет. После того, как это было удалено, я восстановил свой APK, загрузил его в Google Play, и, конечно же, мой IdeaTab был теперь в списке совместимых устройств.

Итак, перепроверьте каждый <uses-feature> и если вы делали несколько копий-вставок из Интернета, проверьте еще раз. Скорее всего, вы запросили некоторые функции, которые вы даже не используете.

Я также столкнулся с этой проблемой при разработке приложения для клиента, который хотел, чтобы видео офлайн были доступны из их приложения. Я написал пост в блоге о том, почему приложение, над которым я работал в течение нескольких месяцев, не появилось в магазине игр для моего устройства ( пост можно найти здесь). Я нашел то же самое, что и @Greg Hewgill: ограничения раздела кэша на некоторых устройствах.

Путешествие не остановилось для меня там. Заказчик хотел, чтобы эти видео были в приложении, и не хотел, чтобы качество видео снижалось. После некоторых исследований я выяснил, что использование файлов расширения было идеальным решением нашей проблемы.

Чтобы поделиться своими знаниями с сообществом Android, я провел беседу на droidconNL 2012 о файлах расширения. Я создал презентацию и пример кода, чтобы проиллюстрировать, как легко можно начать использовать файлы расширения. Для любого из вас, кто хочет использовать файлы расширения для решения этой проблемы, не стесняйтесь проверить пост, содержащий презентацию и пример кода

Возможно, вы захотите попробовать установить атрибут support-Screens:

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

Wildfire имеет небольшой экран, и в соответствии с документацией этот атрибут должен по умолчанию иметь значение "true" во всех случаях, но есть известные проблемы с настройками экранов поддержки на разных телефонах, поэтому я все равно попробую.

Кроме того, как предполагает Дэвид, всегда компилируйте и ориентируйтесь на самую последнюю версию API Android, если только у вас нет веских причин не делать этого. Почти каждый SDK до 2.2 имеет серьезную проблему или странное поведение; последний SDK помогает решить или скрыть многие (хотя и не все) из них. Вы можете (и должны) использовать инструмент Lint, чтобы убедиться, что ваше приложение остается совместимым с API 4 при подготовке релиза.

Финлай, я столкнулся с той же проблемой в моем приложении. Я разработал приложение Phone Gap для android:minSdkVersion="7" & android:targetSdkVersion="18" которая является последней версией платформы Android.

Я нашел проблему, используя Google Docs

Может быть проблема в том, что я написал некоторую функцию JS, которая работает на KEY-CODE проверять только буквы и цифры, но клавиатура имеет другой код, специально предназначенный для клавиатуры компьютера и клавиатуры мобильного телефона. Так что это была моя проблема.

Я не уверен, является ли мой ответ правильным или нет, и, возможно, это может быть смелым ответом выше, но я постараюсь перечислить некоторые моменты, которые следует учитывать при создании приложения. Я надеюсь, что вы следуете этому решить эту проблему.

  • Использовать android:minSdkVersion="?" согласно вашему требованию android:targetSdkVersion="?" должно быть последним, в котором ваше приложение будет нацелено. узнать больше

  • Попробуйте добавить только те разрешения, которые будут использоваться в вашем приложении, и удалите все ненужные.

  • Проверьте поддерживаемый экран приложением

    <supports-screens 
    android:anyDensity="true"
    android:largeScreens="true"
    android:normalScreens="true"
    android:resizeable="true"
    android:smallScreens="true"
    android:xlargeScreens="true"/>
    
  • Возможно, вы реализовали какой-то костюмный код или виджет костюма, который не мог запуститься на каком-либо устройстве или вкладке с опозданием, поэтому перед написанием длинного кода сначала попробуйте написать бета-код и проверить его, будет ли ваш код работать на всех устройствах или нет.,

  • И я надеюсь, что Google опубликует инструмент, который может проверить ваш код перед загрузкой приложения, а также сообщит, что по какой-то конкретной причине нам не разрешено запускать ваше приложение на каком-либо устройстве, поэтому мы можем легко его решить.

Разрешения, которые подразумевают требования к функциям

Например, функция Android.hardware.bluetooth была добавлена ​​в Android 2.2 (уровень API 8), а API-интерфейс bluetooth, на который она ссылается, была добавлена ​​в Android 2.0 (уровень API 5). Из-за этого некоторые приложения смогли использовать API, прежде чем они смогли объявить, что им требуется API через систему.

Чтобы предотвратить непреднамеренный доступ к этим приложениям, Google Play предполагает, что определенные аппаратные разрешения указывают на то, что базовые аппаратные функции требуются по умолчанию. Например, приложения, использующие Bluetooth, должны запрашивать разрешение BLUETOOTH в элементе - для устаревших приложений Google Play предполагает, что объявление разрешения означает, что приложение требует базовой функции android.hardware.bluetooth, и настраивает фильтрацию на основе этой функции.,

В таблице ниже перечислены разрешения, которые подразумевают требования к функциональности, эквивалентные тем, которые объявлены в элементах. Обратите внимание, что объявления, включая любой объявленный атрибут android: required, всегда имеют приоритет над функциями, подразумеваемыми разрешениями ниже.

Для любого из приведенных ниже разрешений вы можете отключить фильтрацию на основе подразумеваемой функции, явно объявив подразумеваемую функцию в элементе с атрибутом android:required="false". Например, чтобы отключить любую фильтрацию на основе разрешения CAMERA, вы должны добавить это объявление в файл манифеста:

<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

У меня есть пара предложений:

  1. Прежде всего, вы, кажется, используете API 4 в качестве своей цели. AFAIK, хорошая практика - всегда компилировать с последним SDK и настраивать android:minSdkVersion соответственно.

  2. Имея это в виду, помните, что android:required атрибут был добавлен в API 5:

Объявление функции может включать android:required=["true" | "false"] атрибут (если вы компилируете по API уровня 5 или выше), который позволяет указать, будет ли приложение (...)

Таким образом, я бы предложил вам скомпилировать с SDK 15, установить targetSdkVersion до 15, а также обеспечить эту функциональность.

Это также показывает здесь, на сайте Play, как несовместимое с любым моим устройством (совпадение?) Gingerbread (Galaxy Ace и Galaxy Y здесь). Но он показывает совместимость с моей Galaxy Tab 10.1 (Honeycomb), Nexus S и Galaxy Nexus (обе на ICS).

Это также заставило меня задуматься, и это очень дикое предположение, но так как android.hardware.faketouch такое API11 +, почему бы вам не попробовать удалить его, просто чтобы посмотреть, работает ли он? Или, может быть, это все равно связано, так как вы пытаетесь использовать функции (faketouch) и required атрибут, который недоступен в API 4. И в этом случае вы должны скомпилировать в соответствии с последним API.

Я бы попробовал это сначала и удалил faketouch Требование только в крайнем случае (конечно) - поскольку оно работает при разработке, я бы сказал, что это просто вопрос скомпилированного приложения, не распознающего эту функцию (из-за требований SDK), что оставляет непредвиденные проблемы с фильтрацией в Play.

Извините, если это предположение не отвечает на ваш вопрос, но очень трудно диагностировать подобные проблемы и точно определить решение, не выполняя тестирование. Или, по крайней мере, для меня без должного знания того, как Play на самом деле фильтрует приложения.

Удачи.

Чтобы дать дополнительное решение вышеупомянутой проблеме "Это приложение несовместимо с вашей...", позвольте мне поделиться своим решением для другой причины проблемы. Я попытался установить приложение на бюджетное устройство Samsung Galaxy Y (GT-S6350) и получил эту ошибку в магазине Play. Чтобы протестировать различные конфигурации AndroidManifest, я создал учетную запись и следовал процедуре, описанной в /questions/5573261/moe-prilozhenie-dlya-android-otobrazhaetsya-kak-etot-element-ne-sovmestim-s-vashim-ustrojstvom/5573275#5573275 пока мое устройство не появилось в списке поддерживаемых устройств.

Оказалось, что многие устройства становятся несовместимыми при использовании разрешения "Камера":

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

Когда я удалил это конкретное разрешение, приложение было доступно для 1180 устройств вместо 870. Надеюсь, оно кому-нибудь поможет

Хотя уже есть довольно много ответов, я подумал, что мой ответ может помочь тем, у кого точно такая же проблема, как и у меня. В моем случае проблема вызвана следующими разрешениями, добавленными в соответствии с предложением рекламной сети:

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

Следствием указанных разрешений является то, что следующие функции добавляются автоматически:

android.hardware.LOCATION
android.hardware.location.GPS
android.hardware.location.NETWORK

Причина заключается в том, что "Google Play пытается выявить подразумеваемые требования к функциям приложения, изучая другие элементы, объявленные в файле манифеста, в частности, элементы". Два моих тестирующих устройства не имеют вышеуказанных функций, поэтому приложение стало несовместимым с ними. Удаление этих разрешений решило проблему немедленно.

Типично, нашел его сразу после публикации этого вопроса в отчаянии; инструмент, который я искал, был:

$ aapt dump badging <my_apk.apk>

Я нашел дополнительный способ возникновения этой проблемы:
Исходная ОС моего телефона LG была Froyo (Android 2.2) и была обновлена ​​до ICS (Android 4.0.4). Но консоль разработчика Google Play показывает, что она определяет мой телефон как устройство Froyo. (Google Play не разрешал загружать приложение из-за ложной "несовместимости", но все равно обнаруживает установку.)

В настройках телефона в "программном обеспечении" отображается ICS V4.0.4. Кажется, что информация сервера Google Play для телефона не обновляется, чтобы отразить обновление ICS на устройстве. Манифест приложения minSDK установлен на Honeycomb (3.0), поэтому, конечно, Google Play отфильтровывает приложение.

Из дополнительного интереса:
Приложение использует In-app Billing V3. Первый раз через IabHelper позволяет приложению совершать покупки через сервис Google Play. Но после совершения покупки покупка НЕ ​​помещается в инвентарь, и IabHelper сообщает, что никакие предметы не принадлежат. Отладочные сообщения показывают, что покупка не удалась в результате покупки, хотя в окне Google Play объявляется "покупка прошла успешно".

У меня тоже была такая же проблема. Я опубликовал приложение в тестовом режиме, созданное с помощью React Native 59. Оно не было совместимо с определенным тестером. Сообщение не было ясным о том, почему приложение несовместимо, после того, как я понял, что ограничил доступность приложения только для определенной страны. в этом была проблема, но, как я уже сказал, сообщение было нечетким. в Play Store WebApp появляется сообщение: "Это приложение несовместимо с вашим устройством". в мобильном приложении появится сообщение "Это приложение недоступно в вашей стране"

Если вы находитесь здесь в 2020 году и считаете, что устройство, получающее сообщение об ошибке, должно быть совместимо:

С этим столкнулись несколько других крупных приложений, включая Instagram (более 1 млрд установок) и Clash of Clans (более 100 млн установок). Похоже, это проблема с операционной системой Google Android.

Чтобы исправить сообщение об ошибке "ваше устройство несовместимо с этой версией", попробуйте очистить кеш Google Play Store, а затем данные. Затем перезапустите Google Play Store и попробуйте снова установить приложение.

[https://support.getupside.com/hc/en-us/articles/226667067--Device-not-compatible-error-message-in-Google-Play-Store]

Вот ссылка на официальную страницу поддержки Google, на которую вы можете дать своим пользователям ссылку на то, как очистить кеш: https://support.google.com/googleplay/answer/7513003

В Android некоторые разрешения <uses-permission>будет означать <uses-feature>требования к приложению.

Например <uses-permission android:name="android.permission.BLUETOOTH" />
Будет означать <uses-feature android:name="android.hardware.bluetooth"/>

Вы можете проверить весь список здесь https://developer.android.com/guide/topics/manifest/uses-feature-element#permissions

У меня такая же проблема. Это было вызвано наличием разных кодов и номеров версий в моем манифесте и скрипте сборки Gradle. Я решил это, удалив код версии и номер версии из моего манифеста и позволив Gradle позаботиться об этом.

Другие вопросы по тегам