Why my App is not showing up on tablets in Google Play?

拥有回忆 提交于 2019-11-26 11:19:22

At last adding a special case for Nexus 7 with in <compatible-screens> tag worked for me. As Nexus 7 has tvdpi density

<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>

UPDATE:

For xxhdpi devices you can use 480 as an int value

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

This page identifies your problem.

When you use <uses-feature> instead of <uses-permission>, your application won't be filtered out by Market but expects you handle devices not supporting that feature on code level.

For any of the permissions in that page above, you can disable filtering based on the implied feature by explicitly declaring the implied feature explicitly, in a <uses-feature> element, with an android:required="false" attribute. For example, to disable any filtering based on the CAMERA permission, you would add this declaration to the manifest file:

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

However, when you specify <uses-permission>, all devices who do not have access to that feature are filtered.

I belive the key is in your permissions. By saying that your app uses RECEIVE_SMS and READ_PHONE_STATE Google Play uses that to filter out devices that can't do those things (tablets) because it thinks that your app needs to use those permissions in order to work. According to the android developer site:

"To prevent those apps from being made available unintentionally, Google Play assumes that certain hardware-related permissions indicate that the underlying hardware features are required by default. For instance, applications that use Bluetooth must request the BLUETOOTH permission in a element — for legacy apps, Google Play assumes that the permission declaration means that the underlying android.hardware.bluetooth feature is required by the application and sets up filtering based on that feature."

Also, look at this:

Telephony 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 RECEIVE_SMS android.hardware.telephony RECEIVE_MMS android.hardware.telephony RECEIVE_WAP_PUSH android.hardware.telephony SEND_SMS android.hardware.telephony WRITE_APN_SETTINGS android.hardware.telephony WRITE_SMS android.hardware.telephony

You have RECEIVE_SMS and READ_PHONE_STATE so you automatically have android.hardware.telephony. You can fix this by doing

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

All of this is explained in more depth here.

I have to do all three of these things to get it to work for Nexus 7. Once you uploaded your apk, you can verify the setting by first activate the new apk, go to product detail and search for supported devices. If Nexus 7 is not found under "Unsupported devices due to your manifest settings" you are good.

Note: Once you upload your apk, Google Play will translates 213 density to tvdpi. Not sure why is not an option in eclipse manifest tool...

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

Documentation instructs us to avoid using

<compatible-screens>


see here
instead you should use

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


Many of the other answers provided on this page are also effective answers. I have implemented them myself. Thanks everyone.

According to developer.android.com

If the app declares a <compatible-screens> element in the manifest, the element should include attributes that specify all of the size and density combinations for tablet screens that the app supports.

Note that, if possible, you should avoid using the <compatible-screens> element in your app.


Therefore, I do following tasks,

1- REMOVED <compatible-screens> from the manifest

<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- ADDED <supports-screens> attribute in the manifest

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

3- ADDED android:required="false" attribute in <uses-feature> (as per my application requirement) in the manifest

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

Official Android documentation about Permissions that Imply Feature Requirements

A more detailed explanation about android:required false is present in ATTRIBUTES: android:required false

When you declare android:required="false" for a feature, it means that the application prefers to use the feature if present on the device, but that it is designed to function without the specified feature, if necessary (that is Telephony permission in case of tablets).


By doing the above changes,

MORE THAN 2000 DEVICES were added in the Supported Android Devices list

I hope that helps

Kirit Vaghela

I get help from answer this question.

How to make android Phonegap available for tablets?

Yes. The problem was with permissions. I remove all permissions from AndroidManifest.xml than test the app and add permission one by one when getting missing permission error. Now my app is compatible with android phones as well as tablets.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!