我犹豫要不要问这个问题,因为它看起来好像 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 设备的人。)
我尝试了以下方法:
按照此答案的建议,将大型文件从 res/raw 目录中移出。里面唯一的文件是一个约 700 kB 的文本文件,但我把它移到 assets/ 没有明显变化。
添加以下两个功能断言:
将 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,这是我上传的最新版本。
handleSilentException
方法静默报告。它至少会告诉您该应用程序正在使用哪些硬件。
答案似乎仅与应用程序大小有关。我创建了一个简单的“hello world”应用程序,在清单文件中没有什么特别之处,将其上传到 Play 商店,据报告它与我的设备兼容。
除了在 res/drawable
目录中添加更多内容外,我在此应用程序中没有进行任何更改。当 .apk
大小达到大约 32 MB 时,Play 商店开始报告我的应用程序与我的手机不兼容。
我将尝试联系 Google 开发人员支持并要求澄清此限制的原因。
更新:这是谷歌开发者支持对此的回应:
谢谢你的注意。目前,上传到 Google Play 的应用程序的最大文件大小限制约为 50 MB。但是,某些设备的缓存分区可能小于 50 MB,导致用户无法下载该应用程序。例如,某些 HTC Wildfire 设备以拥有 35-40 MB 的缓存分区而闻名。如果 Google Play 能够识别没有足够大的缓存来存储应用程序的此类设备,它可能会过滤掉它,使其不显示给用户。
我最终通过将所有 PNG 文件转换为 JPG 来解决我的问题,质量损失很小。 .apk
文件现在为 28 MB,低于 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>
,如果您一直在从网络上进行一些复制粘贴,请再次检查。很可能您请求了一些您甚至没有使用的功能。
在为希望从他们的应用程序中获得离线视频的客户开发应用程序时,我也遇到了这个问题。我写了一篇博文,说明为什么我开发了几个月的应用程序没有出现在我的设备 (post can be found here) 的 Play 商店中。我发现与@Greg Hewgill 发现的相同:某些设备上的缓存分区限制。
我的旅程并没有在那里停止。客户希望在应用程序中包含这些视频,并且不希望降低视频质量。经过一些研究,我发现 using expansion files 是我们问题的完美解决方案。
为了与 Android 社区分享我的知识,我在 droidconNL 2012 举行了一次关于扩展文件的演讲。我创建了一个演示文稿和示例代码来说明开始使用扩展文件是多么容易。对于想要使用扩展文件来解决此问题的任何人,请随时查看 the post containing the presentation and the sample code
您可能想尝试设置 supports-screens 属性:
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true" >
</supports-screens>
Wildfire 的屏幕很小,根据文档,该属性在所有情况下都应默认为“true”,但不同手机上的 support-screens 设置存在已知问题,所以我还是会尝试一下。
此外——正如 David 所建议的——总是针对最新版本的 Android API 进行编译和定位,除非你有充分的理由不这样做。几乎每个 2.2 之前的 SDK 都有一些严重的问题或奇怪的行为;后一个 SDK 有助于解决或掩盖其中的很多(尽管不是全部)。在准备发布时,您可以(并且应该)使用 Lint 工具检查您的应用程序是否与 API 4 保持兼容。
Finlay,我在我的申请中遇到了同样的问题。我为 android:minSdkVersion="7" & android:targetSdkVersion="18"
开发了 Phone Gap 应用程序,它是最新版本的 android 平台。
我使用 Google Docs 发现了问题
可能的问题是我编写了一些适用于 KEY-CODE
的 JS 函数来仅验证 Alphabets &数字但键盘有不同的键码,专门用于电脑键盘和键盘。手机键盘。所以这是我的问题。
我不确定我的答案是否正确,并且可能对上述答案更微笑,但我会尝试列出一些在我们构建应用程序时应该注意的点。我希望你能按照这个来解决此类问题。
使用 android:minSdkVersion="?"根据您的要求 & android:targetSdkVersion="?"应该是您的应用将定位的最新版本。看更多
尝试仅添加将在您的应用程序中使用的权限,并删除所有不必要的权限。
通过应用程序检查支持的屏幕
可能是您实现了一些无法在某些设备或选项卡中运行的服装代码或服装小部件,因此在编写长代码之前首先尝试编写一些 beta 代码并测试您的代码是否可以在所有设备上运行.
我希望谷歌会发布一个工具,可以在上传应用程序之前验证你的代码,并且还说由于某些特定原因我们不允许在某些设备上运行你的应用程序,所以我们可以轻松解决它。
暗示功能要求的权限
例如,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
我有几个建议:
首先,您似乎使用 API 4 作为目标。 AFAIK,最好始终针对最新的 SDK 进行编译并相应地设置您的 android:minSdkVersion。考虑到这一点,请记住 android:required 属性是在 API 5 中添加的:
功能声明可以包含一个 android:required=["true" | "false"] 属性(如果您针对 API 级别 5 或更高级别进行编译),它允许您指定应用程序 (...)
因此,我建议您针对 SDK 15 进行编译,将 targetSdkVersion
也设置为 15,并提供该功能。
它还在 Play 网站上显示为与我拥有的任何设备不兼容(巧合?)姜饼(此处为 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 如何真正过滤应用程序的知识。
祝你好运。
<uses-feature>
标记,这是为了使其与更多设备而不是更少设备兼容。我将尝试更改 SDK 版本标签,这似乎是最有可能的方法。我应该补充一点,我使用了 minSdkVersion="4"
,因为该版本不再暗示我的应用程序不需要的某些权限(读取手机状态、修改 sd 卡)。
android:minSdkVersion="5" android:targetSdkVersion="15"
也无济于事。我已联系 Google Play 开发者支持,希望他们能告诉我原因。如果过滤的 原因 显示在 Play 应用页面上,那就太好了。
faketouch
设置为 required= false
?
<uses-feature>
标记,因为 Google 支持告诉我它对我的设备不可用的原因是因为 android.hardware.faketouch
功能。这看起来很荒谬,尤其是因为我以前的一个版本也没有 <uses-feature>
标签,但无论如何。我正在等待他们的回复,我不想通过上传另一个版本来混淆他们。如果有一种方法可以在不重复上传和发布新 APK 的情况下进行测试,那就太好了。
要为上述“此应用程序与您的...不兼容”问题提供额外的解决方案,让我分享我针对不同问题原因的解决方案。我尝试在低端三星 Galaxy Y (GT-S6350) 设备上安装应用程序并从 Play 商店收到此错误。为了测试各种 AndroidManifest 配置,我创建了一个帐户并按照 https://stackoverflow.com/a/5449397/372838 中所述的例程进行操作,直到我的设备出现在支持的设备列表中。
事实证明,当您使用相机权限时,很多设备变得不兼容:
<uses-permission android:name="android.permission.CAMERA" />
当我删除该特定权限时,该应用程序可用于 1180 台设备而不是 870 台。希望它可以帮助某人
典型的,绝望地发布这个问题后发现它;我正在寻找的工具是:
$ aapt dump badging <my_apk.apk>
尽管已经有很多答案,但我认为我的答案可能会帮助一些与我有完全相同问题的人。就我而言,问题是由根据广告网络的建议添加的以下权限引起的:
<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 试图通过检查清单文件中声明的其他元素,特别是元素来发现应用程序的隐含功能要求。”我的两个测试设备不具备上述功能,因此应用程序与它们不兼容。删除这些权限立即解决了问题。
我发现了另一种出现此问题的方法:我的 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 当然会过滤掉该应用。
我有同样的问题。这是由于我的清单和 gradle 构建脚本中有不同的版本代码和数字造成的。我通过从清单中删除版本代码和版本号并让 gradle 处理它来解决它。
我也有同样的问题。我发布了一个使用 React Native 59 创建的处于测试模式的应用程序。它与某些测试人员不兼容。在我发现我将应用程序限制为仅在某些国家/地区可用之后,该消息不清楚为什么该应用程序不兼容。这就是问题所在,但正如我所说,信息并不清楚。在 Play Store WebApp 中,消息是:“此应用与您的设备不兼容”。在移动应用程序中显示消息“此应用程序在您的国家/地区不可用”
如果您在 2020 年来到这里,并且您认为收到错误消息的设备应该是兼容的:
其他几个主要应用程序也遇到了这种情况,包括 Instagram(1B+ 安装)和 Clash of Clans(100M+ 安装)。这似乎是 Google 的 Android 操作系统的问题。要修复“您的设备与此版本不兼容”错误消息,请尝试清除 Google Play 商店缓存,然后清除数据。接下来,重新启动 Google Play 商店并尝试再次安装该应用程序。
这是一个指向 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