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
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
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.
来源:https://stackoverflow.com/questions/11691775/why-my-app-is-not-showing-up-on-tablets-in-google-play