Reputation: 381
I developed and tested my app using various phones and tablets emulators, and 4 real devices : Samsung Galaxy Ace (GT-I8160P) , Samsung Galaxy Tab 2 (GT-P5110 and GT-P3110) and a Storex M977. After 5 months of work and tests, the App works fine on all these devices. So I uploaded it on Google Play. But Google Play indicates that it's not compatible with my tablets. I can't install it using Google Play on my Galaxy Tabs...
I can't figure out what is the problem. I added support-screens section without success. I was a bit desperate so I also added these uses-features with required="false" : GPS, NETWORK, TELEPHONY, WIFI, LOCATION, TOUCHSCREEN even if the app worked fine without these uses-features. Same result. I also removed "TargetSdk". Google Play says that my app is compatible with 2339 devices including some Galaxy Tabs, but not with my tabs. Only the Galaxy Ace can install it from Google Play.
Here is my manifest file (I just replaced package original package name by fr.test.app for confidentiality reasons). What I'm doing wrong ?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.test.app"
android:versionCode="7"
android:versionName="1.2" >
<uses-sdk
android:minSdkVersion="8"
/>
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<uses-feature android:name="android.hardware.WIFI" android:required="false" />
<uses-feature android:name="android.hardware.GPS" android:required="false" />
<uses-feature android:name="android.hardware.TELEPHONY" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-feature android:name="android.hardware.LOCATION" android:required="false" />
<uses-feature android:name="android.hardware.NETWORK" android:required="false" />
<uses-feature android:name="android.hardware.TOUCHSCREEN" android:required="false" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CAMERA.FRONT"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<permission android:name="fr.test.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="fr.test.app.permission.C2D_MESSAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="fr.test.app" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />
<receiver
android:name=".OnBootReceiver"
android:enabled="true"
android:exported="false" android:label="OnBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</receiver>
<receiver
android:process=":remote"
android:name="fr.test.app.Alarm">
</receiver>
<receiver
android:process=":remote"
android:name="fr.test.app.CamAlarm">
</receiver>
<receiver android:name=".MyAdmin" android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data android:name="android.app.device_admin" android:resource="@layout/policies">
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED">
</action>
</intent-filter>
</meta-data>
</receiver>
<service
android:name=".BbSvc" android:enabled="true"
android:exported="false"
/>
<service
android:name=".WpsLoc" android:enabled="true"
android:exported="false"
/>
<service
android:name=".Cam" android:enabled="true"
android:exported="false"
/>
<service
android:name=".MniRec" android:enabled="true"
android:exported="false"
/>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".reminder"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" /> -->
</intent-filter>
</activity>
<provider android:name="fr.test.app.AndroidProvider"
android:authorities="fr.test.app.AndroidProvider"
android:exported="false"/>
</application>
Upvotes: 6
Views: 2788
Reputation: 28199
In some cases Google Play
will tell you why the device is not compatible:
Install
buttonUpvotes: 0
Reputation: 8598
<uses-feature>
attributes are case-sensitive, you need to write them with small letters. In addition to what you already have, I would add:
<uses-feature android:name="android.hardware.telephony.cdma" android:required="false"/>
<uses-feature android:name="android.hardware.telephony.gsm" android:required="false"/>
<uses-feature android:name="android.hardware.location.gps" android:required="false"/>
<uses-feature android:name="android.hardware.location.network" android:required="false"/>
Upvotes: 1
Reputation: 7376
I think the problem is vibrate permission.Are you sure your device has vibrate ?
Upvotes: 0
Reputation: 527
For future reference to anyone stumbling upon this, Android has a great guide on permissions and filtering. This includes a complete list of implied hardware features when using certain permissions. (It's at the bottom.)
http://developer.android.com/guide/topics/manifest/uses-feature-element.html
This is either a new addition to the documentation or just really hard to find. XD
Upvotes: 1