39

我刚刚发布了适用于手机和平板电脑的应用程序,但它没有出现在平板电脑的 Google Play 中。

检查 Nexus 7 和华硕 eeeePad

这就是我的清单文件中的内容

<compatible-screens>
    <!--no small size screens -->

    <!--Only hdpi and xhdpi for normal size screens -->
    <screen android:screenSize="normal" android:screenDensity="mdpi" />
    <screen android:screenSize="normal" android:screenDensity="hdpi" />
    <screen android:screenSize="normal" android:screenDensity="xhdpi" />

    <!-- all large size screens -->
    <screen android:screenSize="large" android:screenDensity="ldpi" />
    <screen android:screenSize="large" android:screenDensity="mdpi" />
    <screen android:screenSize="large" android:screenDensity="hdpi" />
    <screen android:screenSize="large" android:screenDensity="xhdpi" />

    <!-- all xlarge size screens -->
    <screen android:screenSize="xlarge" android:screenDensity="ldpi" />
    <screen android:screenSize="xlarge" android:screenDensity="mdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="hdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="xhdpi" />
</compatible-screens>

使用-sdk 标签

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11" />

权限

<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<permission android:name="com.myapp.something.permission.C2D_MESSAGE" android:protectionLevel="signature" />

在明确将 uses-feature 标签添加到 false 后,它开始出现在 Asus eeeePad 平板电脑上,但仍然没有出现在 nexus 7 上。这是我在开发者控制台中看到的

此应用程序仅适用于具有这些功能的设备,如您的应用程序清单中所定义。屏幕密度:LARGE,MDPI LARGE,HDPI LARGE,LDPI LARGE,XHDPI XLARGE,MDPI XLARGE,HDPI XLARGE,LDPI XLARGE,XHDPI NORMAL,MDPI NORMAL,HDPI NORMAL,XHDPI 所需的设备功能

android.hardware.screen.portrait
android.hardware.touchscreen
4

7 回答 7

40

<compatible-screens>最后为带有 in标签的 Nexus 7 添加一个特殊情况对我有用。由于 Nexus 7 具有 tvdpi 密度

<compatible-screens>
    <!--no small size screens -->


    <!--all normal size screens -->
    <screen android:screenSize="normal" android:screenDensity="ldpi" />
    <screen android:screenSize="normal" android:screenDensity="mdpi" />
    <screen android:screenSize="normal" android:screenDensity="hdpi" />
    <screen android:screenSize="normal" android:screenDensity="xhdpi" />

    <!-- all large size screens -->
    <screen android:screenSize="large" android:screenDensity="ldpi" />
    <screen android:screenSize="large" android:screenDensity="mdpi" />
    <screen android:screenSize="large" android:screenDensity="hdpi" />
    <screen android:screenSize="large" android:screenDensity="xhdpi" />

    <!-- all xlarge size screens -->
    <screen android:screenSize="xlarge" android:screenDensity="ldpi" />
    <screen android:screenSize="xlarge" android:screenDensity="mdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="hdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="xhdpi" />

    <!-- Special case for Nexus 7 -->
    <screen android:screenSize="large" android:screenDensity="213" />

</compatible-screens>

更新:

对于 xxhdpi 设备,您可以使用 480 作为 int 值

     <screen android:screenSize="normal" android:screenDensity="480" />
     <screen android:screenSize="large" android:screenDensity="480" />
     <screen android:screenSize="xlarge" android:screenDensity="480" />`
于 2012-07-31T17:09:20.450 回答
36

此页面确定您的问题。

当您使用<uses-feature>instead of 时<uses-permission>,您的应用程序不会被 Market 过滤掉,但希望您在代码级别处理不支持该功能的设备。

<uses-feature>对于上面该页面中的任何权限,您可以通过在元素中显式声明具有android:required="false"属性的隐含特征来禁用基于隐含特征的过滤。例如,要禁用任何基于 CAMERA 权限的过滤,您可以将此声明添加到清单文件中:

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

但是,当您指定 时<uses-permission>,将过滤所有无权访问该功能的设备。

于 2012-07-27T17:14:33.503 回答
19

我相信关键在于您的权限。通过说您的应用使用RECEIVE_SMS并且READ_PHONE_STATEGoogle Play 使用它来过滤出无法执行这些操作的设备(平板电脑),因为它认为您的应用需要使用这些权限才能工作。根据android开发者网站:

“为了防止这些应用程序无意中可用,Google Play 假定某些与硬件相关的权限表明默认情况下需要底层硬件功能。例如,使用蓝牙的应用程序必须在一个元素中请求 BLUETOOTH 权限——对于旧版应用程序,Google Play 假定权限声明意味着应用程序需要底层的 android.hardware.bluetooth 功能,并根据该功能设置过滤。”

另外,看看这个:

电话 CALL_PHONE android.hardware.telephony CALL_PRIVILEGED android.hardware.telephony MODIFY_PHONE_STATE android.hardware.telephony PROCESS_OUTGOING_CALLS android.hardware.telephony READ_SMS android.hardware.telephony WRITE_APN_SETTINGS android.hardware.telephony WRITE_SMS android.hardware.telephony

你有RECEIVE_SMSREAD_PHONE_STATE所以你自动拥有android.hardware.telephony。你可以通过这样做来解决这个问题

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

所有这些都在这里更深入地解释。

于 2012-07-27T17:04:07.350 回答
11

我必须做所有这三件事才能让它在 Nexus 7 上工作。一旦你上传了你的 apk,你可以通过首先激活新的 apk 来验证设置,转到产品详细信息并搜索支持的设备。如果在“由于您的清单设置而不受支持的设备”下未找到 Nexus 7,那么您很好。

注意:上传 apk 后,Google Play 会将 213 密度转换为 tvdpi。不知道为什么在 Eclipse 清单工具中不是一个选项...

<compatible-screens>
    ....
    <screen android:screenSize="large" android:screenDensity="213" />
</compatible-screens>

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
于 2012-10-17T00:15:38.843 回答
5

文档指示我们避免使用

<compatible-screens>


请参阅此处
,您应该使用

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


此页面上提供的许多其他答案也是有效的答案。我自己实现了它们。感谢大家。

于 2014-08-04T19:05:05.270 回答
4

根据developer.android.com

如果应用程序在清单中声明了 < compatible-screens > 元素,则该元素应包含指定应用程序支持的平板电脑屏幕的所有尺寸和密度组合的属性。

请注意,如果可能,您应该避免在应用程序中使用 < compatible-screens > 元素。


因此,我执行以下任务,

1-从清单中删除 < compatible-screens >

<compatible-screens>
    <!-- all small size screens -->
    <screen android:screenSize="small" android:screenDensity="ldpi" />
    <screen android:screenSize="small" android:screenDensity="mdpi" />
    <screen android:screenSize="small" android:screenDensity="hdpi" />
    <screen android:screenSize="small" android:screenDensity="xhdpi" />

    <!--all normal size screens -->
    <screen android:screenSize="normal" android:screenDensity="ldpi" />
    <screen android:screenSize="normal" android:screenDensity="mdpi" />
    <screen android:screenSize="normal" android:screenDensity="hdpi" />
    <screen android:screenSize="normal" android:screenDensity="xhdpi" />

    <!-- all large size screens -->
    <screen android:screenSize="large" android:screenDensity="ldpi" />
    <screen android:screenSize="large" android:screenDensity="mdpi" />
    <screen android:screenSize="large" android:screenDensity="hdpi" />
    <screen android:screenSize="large" android:screenDensity="xhdpi" />

    <!-- all xlarge size screens -->
    <screen android:screenSize="xlarge" android:screenDensity="ldpi" />
    <screen android:screenSize="xlarge" android:screenDensity="mdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="hdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="xhdpi" />

    <!-- Special case for Nexus 7 -->
    <screen android:screenSize="large" android:screenDensity="213" />

    <screen android:screenSize="normal" android:screenDensity="480" />
    <screen android:screenSize="large" android:screenDensity="480" />
    <screen android:screenSize="xlarge" android:screenDensity="480" />

</compatible-screens>

2-在清单中添加 < supports-screens > 属性

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

3-在清单中的 < uses-feature >中添加 android:required="false" 属性(根据我的应用程序要求)

<uses-feature android:name="android.hardware.telephony" android:required="false" />
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.location.gps" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.nfc" android:required="false"/>

有关隐含功能要求的权限的官方 Android 文档

ATTRIBUTES中有关于 android:required false 的更详细说明:android:required false

当您为某个功能声明 android:required="false" 时,这意味着如果设备上存在该功能,应用程序更喜欢使用该功能,但如果需要,它被设计为在没有指定功能的情况下运行(即电话权限平板电脑的情况下)。


通过进行上述更改,

支持的 Android 设备列表中添加了超过 2000 种设备

添加了 2000 多台设备

我希望这会有所帮助

于 2016-09-02T05:32:15.193 回答
0

我从回答这个问题中得到帮助。

如何使 android Phonegap 可用于平板电脑?

是的。问题出在权限上。我从 AndroidManifest.xml 中删除了所有权限,而不是测试应用程序并在缺少权限错误时一一添加权限。现在我的应用程序兼容安卓手机和平板电脑。

于 2013-11-20T07:08:35.560 回答