Почему в магазине 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 (opal)", независимо от того, находятся. На самом деле я вижу, что оба "Wildfire S (marvel)" и "Wildfire S A515c (marvelc)" перечислены как поддерживаемые, но мой "Wildfire S A510b" конкретно не упоминается. Может ли такой тип подмодельного идентификатора иметь значение? Мне удалось без проблем загрузить несколько других приложений из Google Play на телефон.

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

Ответ 1

Ответ, похоже, связан только с размером приложения. Я создал простое приложение "привет мир", ничего особенного в файле манифеста, не загрузил его в магазин 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" />

Ответ 2

Я тоже столкнулся с этим - я сделал все свои разработки на 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>, и если вы снова делаете копию-вставку с веб-проверки. Коэффициенты вы запросили некоторую функцию, которую вы даже не используете.

Ответ 3

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

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

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

Ответ 4

Возможно, вы захотите попробовать установить атрибут поддерживающих экранов:

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

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

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

Ответ 5

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

Я нашел проблему, используя Документы Google

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

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

  • Используйте 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 опубликует инструмент, который может подтвердить ваш код перед загрузкой приложения, а также говорит, что по какой-то определенной причине мы не можем запускать ваше приложение на каком-либо устройстве, чтобы мы могли легко его решить.

Ответ 6

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

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

  • Помните, что в API 5 был добавлен атрибут android:required :

Объявление функции может включать атрибут 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 действительно фильтрует приложения.

Удачи.

Ответ 7

Чтобы дать дополнительное решение вышеприведенному "Это приложение несовместимо с вашим...", позвольте мне поделиться своим решением по другой причине. Я попытался установить приложение на устройстве Samsung Galaxy Y (GT-S6350) с низким уровнем обслуживания и получил эту ошибку в магазине Play. Чтобы протестировать различные конфигурации AndroidManifest, я создал учетную запись и выполнил процедуру, описанную в fooobar.com/questions/70688/..., пока не появится мое устройство в списке поддерживаемых устройств.

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

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

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

Ответ 8

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

Например, функция Android 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 = "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#permissions

Ответ 9

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

$ aapt dump badging <my_apk.apk>

Ответ 10

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

<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 пытается обнаружить приложения, связанные с требованиями к функциям, изучая другие элементы, объявленные в файле манифеста, в частности, элементы". У двух моих тестовых устройств нет указанных выше функций, поэтому приложение стало несовместимым с ними. Удаление этих разрешений немедленно устранило проблему.

Ответ 11

Я нашел дополнительный способ, с помощью которого возникает эта проблема:
Моя оригинальная ОС телефона 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 объявляется "покупка успешной".

Ответ 12

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

Ответ 13

Номер службы поддержки клиентов Google pe/9102248411/7545824899/Номер службы поддержки клиентов Google pe/9102248411/7545824899/Номер службы поддержки клиентов Google pe/9102248411/7545824899GG Номер службы поддержки клиентов Google pe/9102248411/7545824899/Номер службы поддержки клиентов Google pe/91022484 7545824899/Google pe номер службы поддержки /9102248411/7545824899Google pe номер службы поддержки /9102248411/7545824899//