Is it possible to restrict sales of an app on the Android Market by specific devices, or by features of a device (screen resolution, processor, diskspace etc..)?
I know that I'm going to be bombarded by people saying that if you design your app well, it should be able to run on any size device. That's all fine and well, but there are reasons that you might still want to restrict by feature set.
One reason that comes readily to mind is screen resolution. Clearly, not all apps work on all screen sizes, especially if you have a lot of images that have been crafted to take full advantage of a larger screen resolution. To belabor the point, imagine that tomorrow a new Android device comes out with a screen resolution of 100x100. Clearly there are apps that will not work optimally on this device. As a developer, I want to ensure that my application runs only on devices that have the features I require to support the best possible experience.
I don't want to sell it to users with certain devices to prevent negative ratings and reviews that I frequently see on other apps. I'd rather ship a perfect experience on a smaller number of devices than allow imperfect experiences on all of them.
Does Android Market offer any means of dealing with this?
I think you can do what you need in your AndroidManifest file. For example, you can choose to only support extra large screens resolution like this:
<supports-screens android:resizeable="false"
android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="false"
android:xlargeScreens="true"
android:anyDensity="true" />
These sizes are defined in the link below, for example "normal" is HVGA at medium density. Read the link below for more details.
http://developer.android.com/guide/topics/manifest/supports-screens-element.html
"If your application does not support small screens, then there isn't much the system can do to make the application work well on a smaller screen, so external services (such as Android Market) should not allow users to install the application on such screens."
You may also need to set the element, although I've not tried that myself, it seems to be in-line with what you want:
http://developer.android.com/guide/topics/manifest/compatible-screens-element.html
"The Android system does not read the manifest element (neither at install-time nor at runtime). This element is informational only and may be used by external services (such as Android Market) to better understand the application's compatibility with specific screen configurations and enable filtering for users. Any screen configuration that is not declared in this element is a screen with which the application is not compatible. Thus, external services (such as Android Market) should not provide the application to devices with such screens."
You'll want to read up more here as well to see what the Market does with all this info:
http://developer.android.com/guide/appendix/market-filters.html
Since I've not tried this, it's not clear to me whether your app should use both the elements I mentioned above, but the market filter page probably explains which to use.
This is covered fairly well in the developer documentation, particularly the pages linked to in the "See Also" box.
Related
I have an application that just designed for handsets. I want this application be visible to just handsets in Play market. Based on my research I found that it's impossible. So the solution that I found is adding <support-screen> into manifest.
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15"/>
<supports-screens
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="false"
android:requiresSmallestWidthDp="320"
android:largestWidthLimitDp="360"/>
Based on what supports-screens says for largestWidthLimitDp:
This attribute allows you to force-enable screen compatibility mode by
specifying the maximum "smallest screen width" for which your
application is designed. If the smallest side of a device's available
screen is greater than your value here, the application runs in screen
compatibility mode with no way for the user to disable it.
Since size of GS3 is 720*1080px then I found 720px = 360dp.
However, the problem is Note from document:
Note: Currently, screen compatibility mode emulates only handset
screens with a 320dp width, so screen compatibility mode is not
applied if your value for android:largestWidthLimitDp is larger than
320.
Therefore it shows android:largestWidthLimitDp is useless at the moment.
I think I have two ways:
1- Filter out phablet/tablets from Play console which is not easy (it says your app is compatible with 3030 devices).
2- Displaying gentle apologies! - to say sorry we don't support your device at the moment - in run time. I think this is horrible and brings us 1 starts :(
What you think?
Any suggestion would be appreciated.
Thanks
When you list your apk in the play store (developer console, you don't have to publish it yet) you can select what devices your app is compatible with. It may be a pain, but you can run through that list and only select the phones you'd like. This is the best way for what you are trying to do.
Otherwise you'd have to resort to options that you listed above such as telling the user "Hey, we don't support your screen size". And no one wants to see that.
Hey i have few apps in the top places on some list (music\games) on the android market but when i look with galaxy tab 10 i they don't appear.
does anyone know what is the reason? should i need to add somthing in my manifest?
tnx
Yes, the Android Market indeed employs a filtering mechanism that (among other things like SIM card country) inspects your application Manifest and decides whether or not to make your application available to certain devices. You could, for instance, decide to make your application only available to devices that specify a certain screen size.
Have a look at the Android Compatibility docs, particularly the Market Filters bit.
I am asking because i can install the app on a device with a small screen via the file system.
Thanks for Help.
“Supporting Multiple Screens” is pretty clear about this:
Assume that you declare smallScreens="false" normalScreens="false" largeScreens="true" xlargeScreens="true" in your application's manifest.
Android Market filters the application from users of devices with small and normal size screens. In effect, this prevents such users from installing the application.
If the device is larger than the app supports, compatibility features are applied. If the device is smaller than the app supports, it is hidden from the Market.
Those settings determine what devices see what apps in the market. So yes if you do smallScreens=false, devices which are considered to have small screens will not see the app in the market.
I want to publish an application that specifically runs only on 800x480 or higher screens.
I don't want users with 480x320, 320x240 etc devices to get it from Android Market. How do I configure it?
Market Filters seems to have the answer but I still don't get it.
Unfortunately, in the current state of the Market, you aren't able to do this. According to the <supports-screens> reference doc - you can only filter by the "screen size", and as you noted, the WVGA/FWVGA resolutions are "normal."
You can have your app detect it programatically using the DisplayMetrics class using heightPixels and widthPixels but that's only after it's been purchased/installed, which is what I assume you want to avoid.
I havent tried this on Android but I think this should work:
Make your app a trial app, so that it is free to download but not free say after one day.
Now in your app do one of the two things, on app start either detect the screen size and just display a generic message saying this screen resolution is not supported and display the exit button. Another way to do this is is to have layout-480x320 folder display the same message and provide an exit button to exit the app. This way you can have all non supported screen sizes display this message and have no functionality. The default layout folder will have the UI for your supported screen sizes of course. This way on non supported devices you can also say what all handsets are supported in the message.
Dont forget to have <supports-screens android:anyDensity="false" /> in your manifest file.
Now when user downloads your app on non supported devices he/she will not be charged because of one day trial and also will be clearly shown that his/her device is not supported and can exit and uninstall the app.
This wont make your app invisible on non supported resolutions but allows for clean and simple mechanism to communicate to user.
after hitting google hard i found as manifest config:
<compatible-screens>
<screen android:screenSize=["small" | "normal" | "large" | "xlarge"]
android:screenDensity=["ldpi" | "mdpi" | "hdpi" | "xhdpi"] />
...
like described here.
in your case you can reduce downloads to the following sizes:
WVGA800 (480x800)
WVGA854 (480x854)
600x1024
those screens have 71% share of the market.
scroll down on the following links to find market shares and resolution "names".
market share
scroll down to find resolution names
Hope that's helpin' out. Cheers
UPDATE: This does not work (see comments below)
In your manifest:
<supports-screens
android:largeScreens="true"
android:normalScreens="false"
android:smallScreens="false"/>
As far as an android app is concerned, I'm not sure. Good question.
However if you're writing a browser app in HTML/Javascript, you can check in Javascript using a combination of the screen.width/height, document.documentElement.clientWidth/Height, and a few other methods. If you really wanted to, this would be a way of blocking your site from low-res machines.
You can also specify CSS to react differently according to the screen size using media queries, although that would be less about blocking and more about adapting to suit the environment.
The Quirksmode website has a good article about the intricacies of dtermining screen size and other attributes in a mobile browser environment.
I have a G1 and an HTC Hero handset. All the applications that I've written were tested only on these devices; come new SDK and Android handsets with (support for) different screen resolutions, densities and capabilities I have been asked to estimate the efforts required to port some of the application to new Android handsets such as Droid, Nexus One etc.
I know that making such an estimation would depend a lot on the application that is being ported, what device capabilities it uses and assumes and the way it is written.
This question is an effort to highlight all the things that a developer needs to consider(in general) when making such estimates. Please help.
Thanks.
In general, you're going to want to consider the following issues:
Resolution - different resolutions will cause your UI to look different than the original.
Input methods - not all phones have keyboards, some might be missing some other keys, etc. Think about the different possible configurations and how the user would interact with your application in each of them.
Performance - on some devices you might have performance issues that you do not see on the G1.
Device specific bugs/issues - this isn't really something you can "estimate", but it's definitely something to consider.
Of course, some of these may not be relevant for your application or the devices you intend to target, or you may decide that they aren't important enough to change.
EDIT: Another thing I forgot - if you're using native code in your application (don't remember what it was called, NDK?) it may not run on all devices.