Google Play商店为什么说我的Android应用与我的设备不兼容?
我很犹豫要问这个问题,因为看起来好像很多人有类似的问题 ,但是我没有find解决scheme来解决我的具体问题。
我开发了一个Android应用程序( 链接到实际的应用程序 ),并将其上传到Play商店。 Play商店说
"This app is incompatible with your XT Mobile Network HTC HTC Wildfire S A510b."
当然,这是我开发的应用程序的手机,所以它应该是兼容的。 有些用其他设备的人说它报告兼容,有人说它报告不兼容,但我没有发现任何趋势。 (显然我不知道很多人使用Android设备。)
我已经尝试了以下内容:
-
按照这个答案的build议将一个大的ish文件移出
res/raw
目录。 那里唯一的文件是一个〜700 kB的文本文件,但我把它移到assets/
没有明显的变化。 -
添加以下两个function断言:
<uses-feature android:name="android.hardware.faketouch" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
认为也许我的手机不声称支持通常的
android.hardware.touchscreen
function,但再次,没有明显的变化。
将APK上传到Play商店时,唯一的filter是android.hardware.faketouch
function。
以下是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(鳟鱼)”和“Touch Viva(蛋白石)”以外,所有HTC设备(包括Wildfire S)都受支持。 其实我看到“野火S(奇迹)”和“野火S A515C(奇迹)”被列为支持,但我的“野火S A510b”没有具体提到。 这种types的子模型标识符可以重要吗? 我已经能够从Google Play下载其他几个应用程序到我的手机,没有任何问题。
我现在唯一没有做的事情就是在上传最新版本之后等待4-6个小时( 如此评论 ),看看它是否仍然表示与我的手机不兼容。 然而,Play商店页面目前显示1.0.2这是我上传的最新版本。
答案似乎只与应用程序大小有关。 我在清单文件中创build了一个简单的“hello world”应用程序,并将其上传到Play商店,并将其报告为与我的设备兼容。
除了向res/drawable
目录中添加更多的内容,我在这个应用程序中没有任何改变。 当.apk
大小达到32 MB时,Play商店开始报告我的应用程序与我的手机不兼容。
我将尝试联系Google开发者支持,并要求澄清此限制的原因。
更新 :这是谷歌开发者支持对此的回应:
谢谢你的提示。 目前,上传到Google Play的应用上传的文件大小上限大约为50 MB。
但是,有些设备可能具有小于50 MB的caching分区,导致用户无法下载应用程序。 例如,一些HTC Wildfire设备因拥有35-40 MBcaching分区而闻名。 如果Google Play能够识别没有足够大的caching来存储该应用的设备,则可能会将其过滤掉以防止其显示给用户。
我最终通过将所有PNG文件转换为JPG来解决我的问题,质量损失很小。 .apk
文件现在是28 MB,低于Google Play为我的手机执行的阈值。
我也删除了所有的<uses-feature>
东西,现在只是这样:
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
我也遇到了这个问题 – 我在联想IdeaTab A2107A-F上完成了所有的开发工作,并且可以开发基于它的开发版本,甚至可以发布已签名的APK(安装了adb install
),没有任何问题。 一旦在Alphatesting模式下发布并在Google Play上提供,我收到“与您的设备不兼容”错误消息。
事实certificate,我已经从教程中放置了我的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 ,在缺点:缺乏自动对焦相机)了解到。 无论我是否使用该function,Google Play都会说不。 一旦删除,我重build我的APK,上传到谷歌播放,果然我的IdeaTab现在在兼容的设备列表。
所以,仔细检查每个<uses-feature>
,如果你一直在做一些从网上复制粘贴再次检查。 赔率是你要求的一些function,你甚至没有使用。
我也遇到了这个问题,同时开发一个客户的应用程序,希望从他们的应用程序可以脱机的video。 我写了一篇关于为什么我几个月工作的应用程序不会出现在我的设备的Play商店( post可以在这里find )的博客post 。 我发现与@Greg Hewgill发现一样: 在某些设备上caching分区限制 。
那里的旅程并没有停止。 客户想要在应用程序中使用这些video,并且不希望video质量下降。 经过一番研究,我发现使用扩展文件是解决我们问题的最佳scheme。
为了与Android社区分享我的知识,我在droidconNL 2012上进行了一次关于扩展文件的讨论。 我创build了一个演示文稿和示例代码来说明开始使用扩展文件是多么容易。 对于你们任何人想要使用扩展文件来解决这个问题,随时查看包含演示文稿和示例代码的post
芬莱,我在我的申请中遇到了同样的问题。 我开发了android:minSdkVersion="7" & android:targetSdkVersion="18"
这是Android平台的最新版本的Phone Gap应用程序。
我发现使用Google文档的问题
可能是问题是我写了一些工作在KEY-CODE
上的JS函数来validation只有字母和数字,但键盘有专为电脑键盘和手机键盘不同的键码。 所以这是我的问题。
我不确定我的答案是否正确,可能可能是上面的回答,但我会尝试列出一些应该在build设应用程序时应该小心点。我希望你跟着这个解决这类问题。
-
使用
android:minSdkVersion="?"
按照您的要求和android:targetSdkVersion="?"
应该是您的应用定位到的最新版本。 查看更多 -
尝试只添加将在您的应用程序中使用的权限,并删除所有不必要的权限。
-
通过应用程序检查支持的屏幕
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true"/>
-
可能是你已经实现了一些服装代码或服装部件,无法在某些设备或选项卡中运行,所以在编写长代码之前,首先尝试编写一些testing代码并testing代码是否可以在所有设备上运行。
-
我希望Google会发布一个可以在上传应用程序之前validation您的代码的工具,同时也表示由于某些特定的原因,我们不允许在某些设备上运行您的应用程序,所以我们可以轻松解决这个问题。
我有几个build议:
-
首先,你似乎正在使用API 4作为你的目标。 AFAIK,这是一个很好的做法,始终编译对付最新的SDK,并相应地设置你的
android:minSdkVersion
。 -
考虑到这一点,请记住在API 5中添加了
android:required
属性:
function声明可以包含一个
android:required=["true" | "false"]
android:required=["true" | "false"]
属性(如果您正在编译API级别5或更高),它允许您指定是否应用程序(…)
因此,我build议你编译SDK 15,同时设置targetSdkVersion
为15,并提供该function。
这里还显示,在Play网站上,与任何设备都不兼容 (巧合?) 姜饼 (Galaxy Ace和Galaxy Y在这里)。 但它显示与我的Galaxy Tab 10.1( 蜂窝 ),Nexus S和Galaxy Nexus(都在ICS上 ) 兼容 。
这也让我想知道,这是一个非常疯狂的猜测,但由于android.hardware.faketouch
是API11 + ,为什么不尝试删除它只是为了看看它的工作? 或者也许这是所有相关的,因为你正在尝试使用function( faketouch
)和API 4中不可用的required
属性。在这种情况下,你应该编译对最新的API。
我会首先尝试,并删除faketouch
要求只作为最后的手段(当然)—因为它的工作原理开发时,我说这只是编译的应用程序不识别function的问题(由于SDK的要求),从而在Play上留下意外的过滤问题。
对不起,如果这个猜测没有回答你的问题,但是很难诊断那些types的问题,并且在没有实际testing的情况下找出解决scheme。 或者至less对我来说,如果没有关于Play如何过滤应用程序的正确知识。
祝你好运。
您可能想尝试设置supports-screens属性:
<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" > </supports-screens>
Wildfire有一个小屏幕,根据文档,这个属性在所有情况下都应该默认为“true”,但是在不同的手机上支持屏幕设置存在已知的问题,所以我会试试这个。
另外 – 正如大卫所说 – 除非你有充分的理由不要,否则一定要编译并针对最新版本的Android API。 几乎每个2.2之前的SDK都有一些严重的问题或怪异的行为; 后者的SDK有助于解决或掩盖很多(虽然不是全部)。 准备发布时,您可以(也应该)使用Lint工具检查您的应用是否与API 4兼容。
为了给上述“这个应用程序与您的问题不兼容”的额外解决scheme,让我分享一个不同的问题原因我的解决scheme。 我试图在低端三星Galaxy Y(GT-S6350)设备上安装一个应用程序,并从Play商店得到这个错误。 为了testing各种AndroidManifestconfiguration,我创build了一个帐户,并遵循https://stackoverflow.com/a/5449397/372838中所述的例程,直到我的设备显示在受支持的设备列表中。;
事实certificate,当您使用相机权限时,许多设备变得不兼容:
<uses-permission android:name="android.permission.CAMERA" />
当我删除了特定的权限,该应用程序可用于1180设备而不是870.希望它可以帮助某人
暗含function要求的权限
例如,在Android 2.2(API级别8)中添加了android.hardware.bluetoothfunction,但在Android 2.0(API级别5)中添加了指向的蓝牙API。 正因为如此,有些应用程序才能够使用API,然后才能通过系统声明他们需要API。
为了防止这些应用程序无意中出现,Google Play假定某些与硬件相关的权限表示默认情况下需要使用底层硬件function。 例如,使用蓝牙的应用程序必须向某个元素请求BLUETOOTH权限 – 对于旧版应用程序,Google Play假定该权限声明意味着应用程序需要底层的android.hardware.bluetoothfunction,并根据该function设置过滤。
下表列出了暗示与元素中声明的function要求相同的权限。 请注意,声明(包括任何已声明的android:required属性)始终优先于下面权限所隐含的function。
对于下面的任何权限,您可以通过在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
典型的,在绝望中发布这个问题后发现它正确; 我正在寻找的工具是:
$ aapt dump badging <my_apk.apk>
虽然已经有不less答案了,但是我觉得我的答案可能会帮助一些和我一样的问题。 就我而言,问题是由于根据广告networking的build议添加了以下权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
上述权限的结果是自动添加以下function:
android.hardware.LOCATION android.hardware.location.GPS android.hardware.location.NETWORK
原因是“Google Play试图通过检查清单文件中声明的其他元素(特别是元素)来发现应用程序的隐含function要求。 我的两个testing设备没有上述function,所以应用程序与它们不兼容。 删除这些权限立即解决了这个问题。
我发现了另外一个出现这个问题的方法:
我的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当然会过滤掉应用程序。
另外的兴趣:
该应用使用应用内结算V3。 第一次通过IabHelper允许应用程序通过Google Play服务进行购买。 但是,购买后,购买不会被放入库存和IabHelper报告没有项目拥有。 即使Google Play窗口宣布“购买成功”,debugging消息也会显示购买“购买失败”的结果。
我有同样的问题。 这是由我的清单和gradle构build脚本中有不同的版本代码和数字引起的。 我通过从清单中删除版本代码和版本号来解决它,并让Gradle来处理它。