App not compatible with the device I use to develop it?

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>

Answers


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


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

I think the problem is vibrate permission.Are you sure your device has vibrate ?


In some cases Google Play will tell you why the device is not compatible:

  1. Open Google Play on your desktop computer: https://play.google.com/store
  2. Navigate to your app, and click the Install button
  3. Open the dropdown of devices, and see if there's a summary below the incompatible device:


Need Your Help

How to sign a request for Image upload to Amazon S3 in javascript

ruby-on-rails amazon-web-services

I have been following railscast #383 which involves a web app that uploads an image to an amazon bucket - this all works fine. I would like to upload to S3 via a remote javascript client.

jQuery - Class does not really change on click (it changes only once)

jquery html css

I'm coding a simple html page with some jQuery. I have two links and I want to change the style of them when one is clicked. In particular, I want to make the clicked one with a border and the uncl...