39

I just released my app for phones and tablets but it is not showing up in Google Play for tablets.

Checked on Nexus 7 and Asus eeeePad

This is what I have in my manifest file

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

uses-sdk tag

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

permissions

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

After explicitly adding uses-feature tag to false it started appearing for Asus eeeePad tablet but still not appearing for nexus 7. Here is what I see in developer console

This application is only available to devices with these features, as defined in your application manifest. Screen densities: LARGE,MDPI LARGE,HDPI LARGE,LDPI LARGE,XHDPI XLARGE,MDPI XLARGE,HDPI XLARGE,LDPI XLARGE,XHDPI NORMAL,MDPI NORMAL,HDPI NORMAL,XHDPI Required device features

android.hardware.screen.portrait
android.hardware.touchscreen
TNR
  • 6,014
  • 3
  • 30
  • 61
Saqib
  • 1,697
  • 2
  • 18
  • 30
  • 4
    There does not appear to be anything wrong with that portion of your manifest, so your problem lies elsewhere (e.g., [permissions implying hardware feature requirements](http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions)). – CommonsWare Jul 27 '12 at 16:22
  • 2
    How long ago did you release your app? If it was not that long ago, then wait some time and then check again, if the market says that your app is compatible it should work. – 0gravity Jul 27 '12 at 16:25
  • It has been more than 24 hours now – Saqib Jul 27 '12 at 16:31
  • check your uses-feature tags (e.g. if android.hardware.telephone, make sure to set required=false, and also ensure you have – CSmith Jul 27 '12 at 16:38
  • 1
    I don't have any uses feature tag in the manifest. tag is used so no point using – Saqib Jul 27 '12 at 16:39

7 Answers7

40

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" />`
Saqib
  • 1,697
  • 2
  • 18
  • 30
  • Thanks for this answer. I ran into this problem and could not figure out why my app was not available on the Nexus 7. Following links have more information. https://plus.google.com/106300001086744879268/posts/Wa9xtQjZHJx http://code.google.com/p/android/issues/detail?id=34076 – Sid Patel Aug 13 '12 at 20:48
  • 1
    I tried this, but it removes some of the default supported sizes. How can I just add support for the Nexus 7 while keeping all of the default sizes, or is there a way of adding all sizes (small+) to what was posted above? – Inator Feb 13 '13 at 19:52
  • 1
    @Inator I don't have small screen support in my app that is why I omitted those. you can add these tags i.e ` ` – Saqib Feb 19 '13 at 21:40
  • does the `compatible-screens` work instead of `supports-screens` or are both required? – wired00 Mar 11 '14 at 03:02
  • I think it should be – Frank Nguyen Aug 20 '14 at 08:15
35

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.

Erol
  • 6,302
  • 4
  • 39
  • 54
  • 1
    i had to make this change also to get my app available for nexus 7 – arjoan Sep 10 '12 at 07:02
  • 5
    This actually works! I had the same problem where I had used TELEPHONY permission and so google play would not show the app on tablets without a telephony radio. I added the uses-feature element with android:required="false" and now I can view the app on Google play on my tablet. – Vikram Gupta May 06 '13 at 10:55
19

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.

ninge
  • 1,534
  • 1
  • 19
  • 38
10

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" />
banachi
  • 107
  • 1
  • 3
5

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.

user2506891
  • 143
  • 2
  • 9
4

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

2000+ devices added

I hope that helps

Community
  • 1
  • 1
shanraisshan
  • 3,073
  • 1
  • 15
  • 39
0

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.

Community
  • 1
  • 1
Kirit Vaghela
  • 12,245
  • 4
  • 72
  • 79