【问题标题】:<compatible-screens> in AndroidAndroid 中的 <compatible-screens>
【发布时间】:2016-10-03 15:11:53
【问题描述】:

您好,我正在尝试将屏幕尺寸限制为仅适用于 Google Play 中的手机(即平板电脑)。在我找到这个article 之后,我将它添加到我的清单文件中:

<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" />
</compatible-screens>

但现在使用 5.5++ 英寸手机的用户似乎无法安装我的应用程序。接下来我还找到了这个article并在里面放了图片:

我的第一个问题 - 是否可以通过特定的英寸值来限制屏幕尺寸,或者我只能使用小、正常、大和 xlarge 等标签?

在某个时候,我决定通过像这样更新清单将支持英寸大小增加到 7:

<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" />
</compatible-screens>

但是5.5寸甚至5.2寸手机的用户仍然无法安装应用。

所以我的第二个问题 - 我做错了什么或不明白?

老实说,我阅读了有关 stackoverflow 的所有类似问题以及 android 文档中的文章,但没有找到正确的答案。谢谢。

【问题讨论】:

    标签: android google-play screen-size


    【解决方案1】:

    编辑 (2016-12-21)

    在 Bryan 建议使用构建工具 25.0.1 之后,我的解决方案不再出现构建错误:

    <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" />
    <screen android:screenSize="small" android:screenDensity="xxhdpi" />
    <screen android:screenSize="small" android:screenDensity="xxxhdpi" />
    <!-- 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" />
    <screen android:screenSize="normal" android:screenDensity="xxhdpi" />
    <screen android:screenSize="normal" android:screenDensity="xxxhdpi" />
    

    但是... 在新版本中,一些设备未出现在受支持的设备列表(Google Play 控制台)中:Google Pixel、Nexus 5x、Google Pixel XL、Nexus 6、Nexus 6P。

    这就是为什么我的新解决方案看起来像这样:

    <!-- just handsets allowed-->
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" /> <!-- 120 -->
        <screen android:screenSize="small" android:screenDensity="mdpi" /> <!-- 160 -->
        <screen android:screenSize="small" android:screenDensity="hdpi" /> <!-- 240 -->
        <screen android:screenSize="small" android:screenDensity="280" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="xhdpi" /> <!-- 320 -->
        <screen android:screenSize="small" android:screenDensity="360" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="420" /> <!-- Workaround Google Pixel, Nexus 5x -->
        <screen android:screenSize="small" android:screenDensity="xxhdpi" /> <!-- 480 -->
        <screen android:screenSize="small" android:screenDensity="560" /> <!-- Workaround Google Pixel XL, Nexus 6, Nexus 6P -->
        <screen android:screenSize="small" android:screenDensity="xxxhdpi" />  <!-- 640 -->
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" /> <!-- 120 -->
        <screen android:screenSize="normal" android:screenDensity="mdpi" /> <!-- 160 -->
        <screen android:screenSize="normal" android:screenDensity="hdpi" /> <!-- 240 -->
        <screen android:screenSize="normal" android:screenDensity="280" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />  <!-- 320 -->
        <screen android:screenSize="normal" android:screenDensity="360" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="420" /> <!-- Workaround Google Pixel, Nexus 5x -->
        <screen android:screenSize="normal" android:screenDensity="xxhdpi" /> <!-- 480 -->
        <screen android:screenSize="normal" android:screenDensity="560" /> <!-- Workaround Google Pixel XL, Nexus 6, Nexus 6P -->
        <screen android:screenSize="normal" android:screenDensity="xxxhdpi" /> <!-- 640 -->
    </compatible-screens>
    

    旧:

    根据 Bryan 的回答,我的清单 sn-p 如下所示:

     <!-- just handsets allowed-->
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" /> <!-- approximately 120 dpi -->
        <screen android:screenSize="small" android:screenDensity="mdpi" /> <!-- approximately 160 dpi -->
        <screen android:screenSize="small" android:screenDensity="hdpi" /> <!-- approximately 240 dpi -->
        <screen android:screenSize="small" android:screenDensity="280" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="xhdpi"/> <!-- approximately 320 dpi -->
        <screen android:screenSize="small" android:screenDensity="360" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="420" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="480" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="560" /> <!-- Workaround -->
        <screen android:screenSize="small" android:screenDensity="640" /> <!-- Workaround -->
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" /> <!-- approximately 120 dpi -->
        <screen android:screenSize="normal" android:screenDensity="mdpi" /> <!-- approximately 160 dpi -->
        <screen android:screenSize="normal" android:screenDensity="hdpi" /> <!-- approximately 240 dpi -->
        <screen android:screenSize="normal" android:screenDensity="280" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="xhdpi"/> <!-- approximately 320 dpi -->
        <screen android:screenSize="normal" android:screenDensity="360" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="420" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="480" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="560" /> <!-- Workaround -->
        <screen android:screenSize="normal" android:screenDensity="640" /> <!-- Workaround -->
    </compatible-screens>
    

    无法使用 Bryan 的解决方案,因为我遇到了编译错误:“AAPT: String types not allowed (at 'screenDensity' with value 'xxxhdpi')”

    它适用于(较新的)设备,例如 Google Pixel (2.6 * 160 dp = 416 dp -> 420dp -> explanation:) / Pixel XL (3.5 * 160 dp = 560 dp) 或三星 Galaxy S6 (4.0 * 160 dp = 640 dp)。 dp 值在此处描述:https://material.io/devices/

    我认为这是可行的,因为我上面提到的设备出现在 Google Play 控制台的“支持的设备”列表中。

    【讨论】:

    • 现在是 2020 年,这仍然是一个问题。官方文档没有提到关于 280、320、480 和 640 的任何内容,但如果您不包括它们,这些设备将无法使用像你说的那样安装它们!
    • 列表需要更新,从那时起 Google Pixel 3、4 和 5 都出局了。需要添加额外的两个密度:Pixel 3a XL 为 400,Pixel 3/3a/4/4a/5 为 440。我只检查了 Pixel 线和 Nexus 线,所以不确定是否还有其他具有特殊密度的新设备:(
    • 更新我上面的评论:似乎兼容屏幕中不支持 400 和 440 值(如果您尝试上传,Google Play 会抛出错误)并且根据stackoverflow.com/questions/57852700/… 没有解决方法,所以如果您完全指定了兼容屏幕,像素 3,4,5 用户将无法安装该应用程序:(
    【解决方案2】:

    您似乎正试图将屏幕尺寸限制为仅限手机,而不是平板电脑。很难从您的问题中辨别出来,但无论哪种方式,我都认为我可以消除混乱。

    当您在清单中声明 &lt;compatible-screens&gt; 时,您必须声明每个您希望您的应用兼容的屏幕配置:

    您必须声明其中的每一项;尺寸和任意组合 您未指定的密度被视为屏幕配置 与您的应用程序不兼容。

    我怀疑你提到的5.5+英寸手机的密度比xhdpi高;例如xxhdpixxxhdpi。文档中省略了这些密度(因为文档已过时或不完整),但仍然相关;它们记录在&lt;compatible-screens&gt; 页面上。

    因此,如果您希望您的应用与更高密度的设备兼容,则必须在 &lt;compatible-screens&gt; 元素中包含这些密度。但更简单的方法是改用&lt;supports-screens&gt; 元素。根据文档,&lt;supports-screens&gt; 元素不考虑密度:

    注意:虽然您也可以将&lt;compatible-screens&gt; 元素用于相反的场景(当您的应用程序与 较小的屏幕),如果您改为使用 &lt;supports-screens&gt; 将在下一节中讨论,因为它 不需要您指定应用程序的每个屏幕密度 支持。

    有了这个,您只需在清单中指定以下内容:

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

    largestWidthLimitDp 属性应该不是必需的,但根据 density breakpoints 的 Material Design 文档,840dp 对于手机来说似乎是一个很好的限制。

    否则,如果您希望更精细地控制您的应用与哪些设备兼容,您仍然可以使用&lt;compatible-screens&gt; 标签:

    <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" />
        <screen android:screenSize="small" android:screenDensity="xxhdpi" />
        <screen android:screenSize="small" android:screenDensity="xxxhdpi" />
        <!-- 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" />
        <screen android:screenSize="normal" android:screenDensity="xxhdpi" />
        <screen android:screenSize="normal" android:screenDensity="xxxhdpi" />
    </compatible-screens>
    

    【讨论】:

    • 是的,对不起我的英语,但你理解正确。谢谢!
    • @Bryan: 你提供的解决方案 不会被编译:“AAPT: String types not allowed (at 'screenDensity' with value 'xxxhdpi')”。我知道这个解决方案是由谷歌自己提供的(developer.android.com/guide/topics/manifest/…)——真是个笑话……
    • @user2281606 嗯,对我来说似乎编译得很好。我知道有一个issue previously,但它似乎已修复。
    • @Bryan:谢谢,你反对什么?这是我的 gradle 信息:compileSdkVersion 23;构建工具版本“23.0.3”。在清单中:
    • 根据谷歌的说法,你不能使用 support-screens 来排除更大的屏幕:“注意:如果你使用 元素用于相反的场景(当你的应用程序不兼容大屏幕)并将大屏幕尺寸属性设置为“false”,则 Google Play 等外部服务不应用过滤”。见:developer.android.com/guide/practices/screens-distribution.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多