14

I have an app which has been deployed to Play and is compatible with any device running 2.1 or later; no special restrictions or requirements defined in AndroidManifest.xml.

There have been several complaints from users trying to install the app via Google Play but getting messages that it is not compatible. In all of these cases sideloading the app works perfectly.

Digging a little deeper into the problem it appears that in all cases, the people reporting the problem are using a device that did not ship with Google Play installed. IE. the device probably failed Google's CTS.

Having said that, they are able to install other apps via Google Play but not ours. Again, sideloading our app onto these devices works fine. Does anybody know why this might be? I assume it must be something I am doing incorrectly in AndroidManifest.xml but I see nothing suspicious.

EDIT: Here's the AndroidManifest.xml, altered to protect the names of the innocent:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.foo.bar"
      android:versionCode="1"
      android:versionName="@string/global_app_version">
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="10"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:label="@string/global_app_short_name" android:icon="@drawable/app">
        <activity android:name=".HomeActivity"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity android:name=".AActivity"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

        <activity android:name=".BActivity"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

        <activity android:name=".CActivity"
                  android:launchMode="singleTask"
                  android:theme="@android:style/Theme.Black.NoTitleBar"
                  android:windowSoftInputMode="stateHidden">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

        <activity android:name=".DActivity"
                  android:launchMode="singleTask"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

        <activity android:name=".EActivity"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

        <activity android:name=".FActivity"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

        <!-- This activity is invoked whenever an xxx is opened -->
        <activity android:name=".GActivity"
                  android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter android:label="@string/global_app_short_name">
                <action android:name="android.intent.action.VIEW"/>
                <action android:name="android.intent.action.EDIT"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:mimeType="application/xxx"/>
                <data android:mimeType="application/yyy"/>
                <data android:mimeType="application/zzz"/>
                <data android:mimeType="application/aaa"/>
                <data android:mimeType="application/bbb"/>
            </intent-filter>
        </activity>
    </application>
</manifest> 
MPelletier
  • 16,256
  • 15
  • 86
  • 137
Nick
  • 8,181
  • 4
  • 38
  • 63
  • I am having the same problem and don't know what to tell the consumers... – Mark Jun 22 '12 at 15:05
  • Do you use anything Play Store related, e.g. In-app purchases or the LVL licensing package? Something like this would be the most likely culprit. – Alex Curran Jun 22 '12 at 15:21
  • Nope, in fact the only permission we use is storage - ie. sdcard etc. if one exists. It's a free app as well. – Nick Jun 22 '12 at 15:27
  • 1
    I too suspect that the answer may be found in your Manifest -- please post it! – Darshan Rivka Whittle Jun 25 '12 at 05:29
  • posted per your request! – Nick Jun 26 '12 at 14:39
  • Potentialy a silly question/statement, but you mention in one of the comments further down that they can see it in the web market place. I have seen this happen when they have content filtering turned on on their phone (hide X rated apps etc). They cant see on phone and play says it is incompatable if they try to install (incomptable with their content settings). You can see it on the site however, but when you try to install you get the same message. – melodiouscode Jun 26 '12 at 15:10
  • @jamesakadamingo - While I'd be surprised if our app is being filtered in that way since its just a productivity app, it's definitely worth checking into. I'll let you know what we find out. – Nick Jun 26 '12 at 15:13
  • @nick I have seen some weird filters caused by those settings. Even Google+ gets blocked if you disable "Mature" applications! – melodiouscode Jun 26 '12 at 15:27

4 Answers4

8

I found the culprit - Copy Protection was enabled. From Google's notes on the setting: http://developer.android.com/guide/google/play/filters.html

To copy protect an application, set copy protection to "On" when you configure publishing options for your application. Google Play will not show copy-protected applications on developer devices or unreleased devices.

In other words, having to side-load Google Play is just a side effect of being an "unreleased device" / device that fails the Google CTS. In any case, disabling copy protection resolved the issue.

Nick
  • 8,181
  • 4
  • 38
  • 63
0

Maybe the hardware they are running is not compatible with your app? Maybe you require a touch screen and they don't have it; maybe you require telephony and they don't have it?

Note that depending on your target api you might get some implicit hardware requirements.

Anyway, trying to get a log from them would be most helpful!

Pedro Loureiro
  • 11,436
  • 2
  • 31
  • 37
  • If it were any of the above then sideloading would not have worked. Which log would I get from them? No app install = no log created. – Nick Jun 22 '12 at 15:13
  • you can see the log of the device saying what was the problem (i.e. PackageManager would say something like "Failed to install application due to incompatible XXX"). This is not you app's log but the system log telling something. – Pedro Loureiro Jun 22 '12 at 16:16
  • The app does not appear in google play on the device (because play thinks its not compatible), the only way we have found so far to even attempt to install via Play is to go to play.google.com, find the app and click install and then select the device to send the app to, which then presents the error, but does not result in log messages from the package mgr. – Nick Jun 22 '12 at 16:24
  • oh, I understood your problem wrong for the first (and second) time. Sorry – Pedro Loureiro Jun 22 '12 at 16:43
0

Maybe the affected users can try and reset the Google Play Store app on their devices:

Menu --> Settings --> Apps --> Google Play Store

Then click "Force close" and "Clear data"

Then start Google Play Store again, login, and try to install your app again.

ramdroid
  • 6,738
  • 1
  • 16
  • 14
0

If you have any in-app products or if you are selling the application for money then Google Play automatically filters you out of certain countries it doesn't support billing for. You can email Google to ask here.