为啥 Google Play 商店说我的 Android 应用与我自己的设备不兼容?

Posted

技术标签:

【中文标题】为啥 Google Play 商店说我的 Android 应用与我自己的设备不兼容?【英文标题】:Why does the Google Play store say my Android app is incompatible with my own device?为什么 Google Play 商店说我的 Android 应用与我自己的设备不兼容? 【发布时间】:2012-05-07 02:18:50 【问题描述】:

我很犹豫要不要问这个问题,因为它看起来好像many people have a similar problem,但我没有找到可以解决我的特定实例的解决方案。

我开发了一个 android 应用 (link to the actual app) 并将其上传到 Play 商店。 Play 商店说

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

当然,那是我开发应用程序的手机,所以它应该兼容。其他设备有人说兼容,有人说不兼容,但我找不到趋势。 (显然我不知道有多少人使用 Android 设备。)

我尝试了以下方法:

按照this answer 的建议将大文件从res/raw 目录中移出。里面唯一的文件是一个大约 700 kB 的文本文件,但我把它移到了assets/,没有明显变化。

添加以下两个功能断言:

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

认为我的手机可能不支持通常的android.hardware.touchscreen 功能,但同样没有明显变化。

将 APK 上传到 Play 商店时,它报告为活动的唯一过滤器是 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 商店的“设备可用性”部分,我可以看到除了“G1 (trout)”和“Touch Viva (opal)”之外的所有 HTC 设备,包括 Wildfire S,都受支持,无论是那些是。实际上我看到“Wildfire S (marvel)”和“Wildfire S A515c (marvelc)”都被列为支持,但我的“Wildfire S A510b”没有特别提到。这种子模型标识符有那么重要吗?我已经能够从 Google Play 将其他几个应用下载到我的手机上,没有任何问题。

此时我没有做的唯一一件事是在上传最新版本(如this comment)后等待 4-6 小时,看看它是否仍然说它与我的手机不兼容.但是,Play 商店页面目前显示的是 1.0.2,这是我上传的最新版本。

【问题讨论】:

设置 ACRA:code.google.com/p/acra 我在第一次启动应用程序时运行它以获取手机的完整规格,并使用 handleSilentException静默报告的方法。它至少会告诉您该应用正在使用的硬件。 @GavinMiller:谢谢,但是当 Play 商店完全拒绝交付应用程序时,我不确定这是否会有所帮助。 也许我误解了你的评论:“有些人用其他设备说它报告兼容,其他人说它报告不兼容,但我找不到趋势。”如果很多不认识的人都可以下载安装应用,可以收集更大的硬件数据池来尝试形成趋势。从而缓解“我不认识很多人使用Android设备”。问题。 @GavinMiller:但是,这只会告诉我 Google Play 认为它可以安装在哪些设备上,而不会提供有关 Google Play 相信哪些设备的信息无法安装。此外,即使确定哪些设备正常,哪些不正常,也不能真正帮助我解决这个问题。 检查这个解决方案它对我有用***.com/a/14020303/3392323 【参考方案1】:

答案似乎仅与应用程序大小有关。我创建了一个简单的“hello world”应用,在清单文件中没有什么特别之处,将其上传到 Play 商店,据报告它与我的设备兼容。

除了在res/drawable 目录中添加更多内容外,我在此应用中没有进行任何更改。当.apk 大小达到大约 32 MB 时,Play 商店开始报告我的应用与我的手机不兼容。

我将尝试联系 Google 开发人员支持并要求澄清此限制的原因。

更新:以下是 Google 开发者支持对此的回应:

感谢您的来信。目前,将应用上传到 Google Play 的最大文件大小限制约为 50 MB。

但是,某些设备的缓存分区可能小于 50 MB,因此用户无法下载该应用。例如,某些 HTC Wildfire 设备以拥有 35-40 MB 的缓存分区而闻名。如果 Google Play 能够识别出此类设备没有足够大的缓存来存储应用程序,它可能会过滤掉它,使其不显示给用户。

我最终通过将所有 PNG 文件转换为 JPG 来解决我的问题,但质量损失很小。 .apk 文件现在为 28 MB,低于 Google Play 对我的手机实施的任何阈值。

我还删除了所有 &lt;uses-feature&gt; 的东西,现在只有这个:

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

【讨论】:

非常有趣和有价值的信息。太烦人了,这在任何地方都没有记录。 确实,如果我没有 Wildfire 手机,我什至都不会知道这个问题。 我有 3 款游戏:32MB、35MB 和 44MB 大小。我自己的 HTC bravo 看到前两个游戏,但在商店里没有看到第三个。我朋友的HTC渴望S只看到第一场比赛。因此,显然游戏的大小应该小于 33MB 左右,才能对大多数(?)设备可见。不幸的是,我看到这个回复太晚了,几个月来都不知道这个问题......我确信这取决于设备的处理器类型、支持的 OpenGL 版本、清单中设置的限制或其他东西。叹息.. Google 没有在 Play 商店中列出不兼容的原因真是太疯狂了。我一直认为至少应用程序开发人员会收到这些信息,并且会有意识地选择不支持我的设备。这种情况怎么会持续这么久? @GregHewgill 你好,格雷格。我已经就类似的问题联系了谷歌支持。由于我的应用程序大小只有 5 MB,我正在研究为什么 Google Play 在特定设备上过滤我的应用程序的不同选项。自从我联系他们以来已经 72 小时了,他们没有回来提供任何解释。除了正常的“联系我们”之外,我还有其他方式可以联系 Google 支持吗?【参考方案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" />

好吧,联想 IdeaTab A2107A-F 上没有自动对焦摄像头(我从 http://www.phonearena.com/phones/Lenovo-IdeaTab-A2107_id7611 那里了解到,在缺点:缺少自动对焦摄像头)。不管我是否使用该功能,Google Play 都拒绝了。删除之后,我重建了我的 APK,将其上传到 Google Play,果然我的 IdeaTab 现在在兼容设备列表中。

因此,请仔细检查每个 &lt;uses-feature&gt;,如果您一直在从网络上进行一些复制粘贴,请再次检查。很可能您请求了一些您甚至没有使用的功能。

【讨论】:

谢谢!我正在使用另一个 正因为如此,我有零兼容设备。我删除了该行,现在有 10000 个。 你可以设置它仍然使用它,但不需要它: 使我的应用程序不兼容,因此我无法在 Playstore 上找到该应用程序。拯救我的生命【参考方案3】:

我在为希望从他们的应用程序中获取离线视频的客户开发应用程序时也遇到了这个问题。我写了一篇博文,说明为什么我开发了几个月的应用程序不会出现在我设备的 Play 商店中 (post can be found here)。我发现与@Greg Hewgill 发现的相同:某些设备上的缓存分区限制

我的旅程并没有就此停止。客户希望在应用程序中包含这些视频,并且不希望降低视频质量。经过一番研究,我发现using expansion files 是我们问题的完美解决方案。

为了与 Android 社​​区分享我的知识,我在droidconNL 2012 进行了一次关于扩展文件的演讲。我创建了一个演示文稿和示例代码来说明开始使用扩展文件是多么容易。对于想要使用扩展文件来解决此问题的任何人,请随时查看the post containing the presentation and the sample code

【讨论】:

您帖子中提到的 Google 支持链接现已过时,新链接为 support.google.com/googleplay/android-developer/answer/…。希望你用最新的链接更新文章,顺便说一句,好帖子。!!【参考方案4】:

您可能想尝试设置 support-screens 属性:

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

Wildfire 的屏幕很小,根据文档,此属性在所有情况下都应默认为“true”,但不同手机上的支持屏幕设置存在已知问题,所以无论如何我都会尝试这个。

此外,正如 David 所建议的那样,始终针对最新版本的 Android API 进行编译和定位,除非您有充分的理由不这样做。几乎每个 2.2 之前的 SDK 都有一些严重的问题或奇怪的行为;后一个 SDK 有助于解决或掩盖其中的很多(尽管不是全部)。在准备发布时,您可以(并且应该)使用 Lint 工具检查您的应用是否与 API 4 保持兼容。

【讨论】:

谢谢,我正在等待 Google 开发人员支持部门对我最新的支持请求的回复。我会在收到他们的回复后尝试这个(我不想通过上传另一个 APK 来混淆他们)。会让你知道结果如何。 希望您不必等待太久。他们并不完全以快速反应着称。 :-) 我已经和他们来来回回了几次,但我最近的问题在 22 小时后没有得到答复。不得不等待令人沮丧,但至少这不是关键任务或其他任何事情。 只是想让您知道我发现了这个问题,请参阅我对这个问题的回答。感谢您的帮助。【参考方案5】:

Finlay,我在申请中遇到了同样的问题。我开发了 Phone Gap 应用程序 android:minSdkVersion="7" &amp; android:targetSdkVersion="18" 是安卓平台的最新版本。

我使用Google Docs 发现了问题

可能的问题是我编写了一些适用于KEY-CODE 的 JS 函数以仅验证字母和数字,但键盘具有不同的键码,专门用于计算机键盘和移动键盘。所以这是我的问题。

我不确定我的答案是否正确,可能对上述答案更满意,但我会尝试列出一些在我们构建应用程序时应该注意的点。希望你按照这个来解决这类问题。

根据您的要求使用android:minSdkVersion="?",并且android:targetSdkVersion="?" 应该是您的应用程序所针对的最新版本。 see more

尝试仅添加将在您的应用程序中使用的权限,并删除所有不必要的权限。

查看应用支持的屏幕

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

可能是您实现了一些无法在某些设备或选项卡中运行的服装代码或服装小部件,因此在编写长代码之前首先尝试编写一些 beta 代码并测试您的代码是否会是否在所有设备上运行。

我希望 Google 会发布一个工具,可以在上传应用程序之前验证您的代码,并表示由于某些特定原因我们不允许在某些设备上运行您的应用程序,因此我们可以轻松解决它.

【讨论】:

【参考方案6】:

暗示功能要求的权限

例如,android.hardware.bluetooth 功能是在 Android 2.2(API 级别 8)中添加的,但它所指的蓝牙 API 是在 Android 2.0(API 级别 5)中添加的。因此,一些应用程序在能够通过系统声明它们需要 API 之前就能够使用 API。

为防止这些应用无意中可用,Google Play 假定某些与硬件相关的权限表明默认情况下需要底层硬件功能。例如,使用蓝牙的应用程序必须在一个元素中请求 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#permissions

【讨论】:

谢谢!我不知道使用权限默认为所需的功能。【参考方案7】:

我有几个建议:

    首先,您似乎使用 API 4 作为您的目标。 AFAIK,最好始终针对最新的 SDK 进行编译并相应地设置您的 android:minSdkVersion

    记住这一点,记住android:required属性was added in API 5:

功能声明可以包含android:required=["true" | "false"] 属性(如果您针对 API 级别 5 或更高级别进行编译),它可以让您指定应用程序是否 (...)

因此,我建议您针对 SDK 15 进行编译,将 targetSdkVersion 也设置为 15,并提供该功能。

它还在 Play 网站上显示为 不兼容 与我拥有的任何设备(巧合?)姜饼 em>(此处为 Galaxy Ace 和 Galaxy Y)。但它与我的 Galaxy Tab 10.1 (Honeycomb)、Nexus S 和 Galaxy Nexus(均在ICS)。

这也让我感到疑惑,这是一个非常疯狂的猜测,但既然android.hardware.faketouch is API11+,你为什么不尝试删除它只是看看它是否有效?或许这一切都相关,因为您尝试使用 API 4 中不可用的功能 (faketouch) 和 required 属性。在这种情况下,您应该针对最新的 API 进行编译。

我会首先尝试,并且仅作为最后的手段(当然)删除 faketouch 要求 --- 因为它在开发时有效,我想说这只是编译的应用程序无法识别该功能的问题(由于 SDK 要求),因此会在 Play 上留下意外的过滤问题。

很抱歉,如果这个猜测不能回答您的问题,但如果不进行实际测试,很难诊断出这类问题并确定解决方案。或者至少对我来说,不知道 Play 是如何真正过滤应用的。

祝你好运。

【讨论】:

谢谢,这给了我一些具体的想法。最初我根本没有任何&lt;uses-feature&gt; 标签,这是为了让它与更多而不是更少的设备兼容。我将尝试更改 SDK 版本标签,这似乎是最有可能的方法。我应该补充一点,我使用了minSdkVersion="4",因为该版本不再暗示我的应用不需要的某些权限(读取手机状态、修改 sd 卡)。 将 SDK 版本更改为 android:minSdkVersion="5" android:targetSdkVersion="15" 也无济于事。我已联系 Google Play 开发者支持,希望他们能告诉我原因。如果在 Play 应用页面上显示过滤的原因,那就太好了。 是的,那太好了。同时,您是否尝试将faketouch 设置为required= false 最新版本删除了所有 &lt;uses-feature&gt; 标签,因为 Google 支持人员告诉我,它对我的​​设备不可用的原因是 android.hardware.faketouch 功能。这似乎很荒谬,特别是因为我以前的版本之一也没有&lt;uses-feature&gt; 标签,但无论如何。我正在等待他们的回复,我不想通过上传另一个版本来混淆他们。如果有一种方法可以在不重复上传和发布新 APK 的情况下进行测试,那就太好了。 我不会说荒谬,因为它是在以后的 sdk 版本(api 11)上添加的标志,因此我建议针对 api15 进行编译和定位(请记住更改您的 project.properties,而不仅仅是清单)。我仍然对将它设置为 required = false 感到惊讶,但它不起作用。【参考方案8】:

要为上述“此应用程序与您的...不兼容”问题提供额外的解决方案,让我分享我针对不同问题原因的解决方案。我尝试在低端三星 Galaxy Y (GT-S6350) 设备上安装应用程序并从 Play 商店收到此错误。为了测试各种 AndroidManifest 配置,我创建了一个帐户并按照https://***.com/a/5449397/372838 中所述的例程进行操作,直到我的设备出现在支持的设备列表中。

原来很多设备在你使用相机权限时变得不兼容:

&lt;uses-permission android:name="android.permission.CAMERA" /&gt;

当我删除该特定权限时,该应用程序可用于 1180 台设备而不是 870 台设备。希望它对某人有所帮助

【讨论】:

也许,这会有所帮助:【参考方案9】:

典型的,在绝望地发布这个问题后发现它;我正在寻找的工具是:

$ aapt dump badging <my_apk.apk>

【讨论】:

您似乎打算在 ***.com/questions/16145927/… 上发布此答案。【参考方案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 构建脚本中有不同的版本代码和数字造成的。我通过从清单中删除版本代码和版本号并让 gradle 处理它来解决它。

【讨论】:

【参考方案13】:

我也遇到了同样的问题。我发布了一个使用 React Native 59 创建的处于测试模式的应用程序。它与某些测​​试人员不兼容。 在我发现我将应用程序限制为仅适用于某些国家/地区之后,该消息不清楚为什么该应用程序不兼容。这就是问题所在,但正如我所说,信息并不清楚。 在 Play Store WebApp 中,消息是:“此应用与您的设备不兼容”。 在移动应用中显示“此应用在您的国家/地区不可用”的消息

【讨论】:

【参考方案14】:

如果您在 2020 年来到这里,并且您认为收到错误消息的设备应该是兼容的:

其他几个主要应用程序也遇到了这种情况,包括 Instagram(1B+ 安装)和 *** of Clans(100M+ 安装)。这似乎是 Google 的 Android 操作系统的问题。

要修复“您的设备与此版本不兼容”错误消息,请尝试清除 Google Play 商店缓存,然后清除数据。接下来,重新启动 Google Play 商店并尝试再次安装该应用程序。

[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

【讨论】:

【参考方案15】:

在 Android 中,某些权限 &lt;uses-permission&gt; 将暗示应用程序需要 &lt;uses-feature&gt;

例如&lt;uses-permission android:name="android.permission.BLUETOOTH" /&gt; 会暗示&lt;uses-feature android:name="android.hardware.bluetooth"/&gt;

你可以在这里查看整个列表https://developer.android.com/guide/topics/manifest/uses-feature-element#permissions

【讨论】:

以上是关于为啥 Google Play 商店说我的 Android 应用与我自己的设备不兼容?的主要内容,如果未能解决你的问题,请参考以下文章

语言更改在上传到 Google Play 商店之前有效,但在上传到 Play 商店后无效。为啥?

为啥我的应用在某些设备上安装时在 Google Play 商店中抛出错误 - 504?

为啥谷歌播放商店稳定性报告说我的应用程序在一台设备上崩溃了[重复]

使用来自 Visual Studio (Xamarin) 的 Google Play 商店签名始终收到“无效客户端”错误

为啥我用谷歌账号登陆play商店他说与google服务器通信出现问题啊?

为啥我在 Google Play 商店找不到官方的 Github 移动应用? [关闭]