What parts of the Android project makes devices incompatible?
My first project was released, and it's pretty simple. It only works on 6880 devices according do Google Play.
My girlfriend's phone is incompatible, although she always used this app when I installed direct through the .apk file.
The manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.project" android:installLocation="auto" android:versionCode="1" android:versionName="1.0">
<application android:label="AppName" android:icon="#drawable/icon" android:allowBackup="true" android:theme="#android:style/Theme.NoTitleBar.Fullscreen" android:hardwareAccelerated="true">
<activity android:name="my.project.AppName" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mnc|mcc|locale|fontScale|uiMode" android:label="Credito">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- Android 2.3.3 -->
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14" />
<!-- OpenGL ES 2.0 -->
<uses-feature android:glEsVersion="0x00020000" />
<!-- USB support -->
<uses-feature android:name="android.hardware.usb.host" />
<!-- Disable screen compatibility modes -->
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
Device compatibility described on here. In general it includes 3 sections:
* Device features;
* Platform version
* Screen configuration;
According to your manifest there are next possible problems:
"android.hardware.usb.host" - app need a device that guaranteed to support the USB host APIs. According to the official documentation:
Because not all Android-powered devices are guaranteed to support the USB host APIs, include a "uses-feature" element that declares that your application uses the android.hardware.usb.host feature.
this basically means that the app might even work on the phone (by direct install for example) till the moment when such API are called.
android:minSdkVersion="9" android:targetSdkVersion="14"
Does your girlfriend's phone have something earlier than Android 2.3.3 (like 2.2)? And again, this does not means that it won't work, it just means that it might fail on her phone if there is a call to any method that is not exists prior to the Android 2.3.
uses-feature android:glEsVersion="0x00020000"
This should not be a problem since:
OpenGL ES 2.0 - This API specification is supported by Android 2.2 (API level 8) and higher.
screen resolutions also should not be a problem since you have switched on all 4 possible major resolutions.
Related
I have an app on Google Play. Users with an Asus Transformer can't find the app for some reason. My manifest is really simple:
<manifest
package="com.me.test"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<application
... >
<activity>
...
</activity>
</application>
</manifest>
Do I need to explicitly declare for it to consider the app "compatible"? The Play store lists over 4k devices as compatible with my app, and all the asus tablet models appear on my end as "compatible".
Thanks
In one of my apps I have no screenshots for 7" or 10" tablets in Google Developer Console. I also have not declared <supports-screens> for any size, in my manifest. I have "Supported devices 6250" and "Excluded devices 0". I have a fairly standard app with a manifest similar to yours:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.app"
android:installLocation="auto"
android:versionCode="1234"
android:versionName="1234" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name" >
<activity
... >
</activity>
...
</application>
</manifest>
In optimization tips for the app under Google Developer Console I have the following points under "Design your app for tablets":
Your Production APK needs to meet the following criteria:
The minimum Android version and target Android version need to support tablets (check targetSdkVersion and minSdkVersion). Learn more
Your APK should support common tablet screen sizes (LARGE and XLARGE). Learn more
Upload tablet screenshots: Upload at least one screenshot for 7-inch and 10-inch tablets to the Store Listing. Learn more
I can however confirm that my app DOES appear in Google Play for a 10" tablet running 4.2 and another 10" tablet running 4.4, without the <supports-screens> tag. The difference I see in our manifests is the minSdkVersion and targetSdkVersion. It may be that higher values of this does in fact require those options to be set as initial support for tablet was added in API level 11. If not, I would suspect there to be some other aspect of your app that makes it ineligable for Asus Transformer.
I have a Samsung Galaxy SII (Sprint version Epic 4G Touch) running Cyanogen 9 (4.0.4 ICS). Screen density is at default. On the market it says my app is compatible with API 8-16+ and supports screens from small-xtra large. For some reason it is still not compatible with my phone. Does it have to do with my custom rom? or possibly the fact I'm running 4.0.4? All users that cannot install also seem to be running custom roms.
My Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.pwnsro.dayz"
android:versionCode="5"
android:versionName="1.0.4" >
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="15" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" >
</supports-screens>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name" >
<activity
android:name=".DayZActivity"
android:label="#string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Also my project.properties:
target=android-15
*Edit:
It seems only users of AOSP Roms on ICS are having compatibility issues. I switched to a Samsung 4.0.4 rom and I was able to install this from the market.
Do you happen to have copy protection set to ON in android developer console? Have a look at this page.
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.
Since you said this:
I switched to a Samsung 4.0.4 rom and I was able to install this from the market.
I guess that the problem is/was your custom ROM. Have you tried another custom ROM? Maybe it is a problem with that specific ROM or Google Play don't recognize it as a compatible SO.
I'm having a bit of trouble getting my app to show up in the market under GoogleTV. I've searched google's official documentation and I don't believe the manifest lists any elements which would invalidate the program; the only hardware requirement specified is landscape mode, wakelock and external storage(neither which should cause it to be filtered for GTV according to the documentation) and I set the uses touchscreen elements "required" attribute to false.
below is the AndroidManifest.xml for my project:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.whateversoft"
android:versionCode="2"
android:versionName="0.1" >
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="#drawable/ic_launcher"
android:label="Color Shafted"
android:theme="#style/Theme.NoBackground"
android:debuggable="false">
<activity
android:label="Color Shafted"
android:name=".colorshafted.ColorShafted"
android:configChanges = "keyboard|keyboardHidden|orientation"
android:screenOrientation = "landscape">
<!-- Set as the default run activity -->
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="Color Shafted Settings"
android:name=".colorshafted.Settings"
android:theme="#android:style/Theme"
android:configChanges = "keyboard|keyboardHidden">
<!-- -->
</activity>
</application>
<!-- DEFINE PERMISSIONS FOR CAPABILITIES -->
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WAKE_LOCK"/>
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<!-- END OF PERMISSIONS FOR CAPABILITIES -->
</manifest>
I'm about to start promoting the app after the next major release so its been kind of a bummer since I can't seem to get this to work. Any help would be appreciated, thanks in advance : )
If you enable forward locking for you app, it will not show up in Google Play on devices that allow root access.
The manifest looks good, as others said, there's a slight chance of subtle mistakes in the manifest tags.
you can inspect and verify the compiled APK by using the command:
aapt dump badging yourFileName.apk
Check the resulting output for any unexpected things like features pulled in implicitly by permissions.
(aapt is part of the regular Android SDK)
It looks okay to me. one things you might do is watch logcat carefully when you deploy. The ADT plugin doesn't enforce 100% correctness in the manifest. I've found where I've had subtle errors and the only way I noticed was by watching logcat when the app gets deployed.
Here is the official Google IO presentation on the topic,
http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en/us/events/io/2011/static/presofiles/developing_android_applications_for_google_tv.pdf
This page describes how the manifest features effect visibility to google TVs,
https://developers.google.com/tv/android/docs/gtv_androidmanifest
A couple things I have found that help ensure it shows up:
Your manifest should include not only a minSdkVersion but also a targetSdkVersion:
<uses-sdk android:minSdkVersion="8" />
<uses-sdk android:targetSdkVersion="14" />
and be sure you are building to a target of 14+
Also adding supports-screens helps:
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="false"
android:anyDensity="true"/>
and finally:
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<uses-feature android:name="com.google.android.tv" android:required="false"/>
if your app is not only for GTV but also other devices that is important.
we have developed and Android app, first time, great fun. Now we are giving it to friends and at first everything seems alright. But two guys with fairly modern phones (one is a Desire HD) claim, that the market greys out the app and says it wouldn't be compatible with the device.
That is odd to me, because I can install it from the market on very low-end devices (e.g., tested with Huawei U8650).
The relevant part of the Manifest.xml should be
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.android.app"
android:versionCode="4"
android:versionName="0.1" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-sdk
android:maxSdkVersion="15"
android:minSdkVersion="8"
android:targetSdkVersion="8" />
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>
<application
android:debuggable="true"
android:icon="#drawable/appicon"
android:label="#string/app_name" >
<activity>
...
</activity>
</application>
</manifest>
What am I missing?
Is there a website/feature/tool that let's me check out compatibility with existing devices (i.e., match known requested features of devices against my app)? I took a look with aapt which tells me nothing I didn't know from the Manifest.
Help highly appreciated!
Thanks!
You have a cool menu in your Android Market console:
Click on the show device link ...
I have developed an app using PhoneGap and tested the same in different version of emulator and also in my Motorola Photon. I have not faced any problem in testing.
But when I published the same in the market it says "This app is incompatible with all of your devices.". My devices are with different screen size, different OS version ranging from 2.1 to 2.4.
In publish home page, it says "This application is available to over 679 devices." It includes Motorola Photon 4g and all other devices which I have registered in the market download.
I have republished the code many times by updating manifest file and java file based on all the answers given through out the stackoverflow for this kind of issues. To list it,
Removing user-permission
Updating all combinations of supports-screens
Refreshing the save button in the publish page several times
Uninstalling the apps in my mobile (But I have few more devices where I have not tested my apps but still says incompatible)
Running aapt tool
Removing the jar files from lib folder and referring that externally in Eclipse
Few more changes that I cant recall
below is the manifest file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.myapps"
android:versionCode="5" android:versionName="1.4">
<uses-sdk android:minSdkVersion="7" />
<supports-screens android:largeScreens="true"
android:normalScreens="true" android:smallScreens="true"
android:resizeable="true" android:anyDensity="true" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<application android:icon="#drawable/app_icon" android:label="#string/app_name">
<activity android:name="com.test.myapps.HomePage" android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
</activity>
</application>
</manifest>
Please, help me in fixing the same. Thanks in advance....
Did you specifically run "aapt dump badging <.apkfile> ?
Android docs here.
I had a similar problem. Turns out I needed to use in my manifest the
android:required="false" for several uses-features, like:
< uses-feature android:name="android.hardware.telephony" android:required="false" >
Full manifest example here. The results of dump badging showed that the market had added several uses-features (a bit
further down in aapt output) that excluded mostly Samsung devices.
Check if there is any compatibility, you need to start with :
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
Are you sure that you were checking the latest version of APK , not the old one. you will need to activate it. not only upload it ..