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.
Related
The why is the main point of my question.
I know there's a filtering system using the requirements and features specified in the AndroidManifest.xml and that furthermore one can manually exclude devices.
But, is there a way to find out, which specific requirements or features lead to the exclusion?
In the Google Developer Console the devices just show up as "unsupported", but without any further information about why they are not supported. I'm sure they were rejected for a good reason. But how to find out for what reason? I would really prefer a more generic method, than comparing each requirement and feature with the manifest file.
This is just an example screen shot, and does not indicate the devices I wish to find out why they're excluded.
Any help is highly appreciated!
Thanks in advance.
There might be some methods in your app that don't meet up minimum requirements(Hardware or Software, ex. RAM,Processor, API Level or something else) with those devices.
In my case i was using some third party libraries that didn't support some devices(on API Level Basis).
There is (at least at the moment) no general method to find out, what exactly leads to an exclusion. So, one has to try and error to find it out.
Thanks go to Neal Ahluvalia for driving me in the right direction.
However, in my case the problem was that the devices did not match the android:screenDensity in <compatible-screens>. Which is really weird as I had everything from mdpi up to 640 in there, for any android:screenSize from normal to xlarge.
According to this page it looks like going from mdpi up to xxxhdpi (= 640) leaves no gap between the ranges covered by those.
But there is (at least) definitely one gap, where tvdpi comes in (which btw is considered for TV screens.. 0_o).
Somehow those devices fall under this weird tvdpi not mentioned on that page, until you scroll all the way down to a table where you can find it.
That's not yet the end of the story.. you'll have to add this tvdpi not by its name, but rather by its dpi value => android:screenDensity="213", like you also have to do for dpi values larger than xhdpi.
At this point there's a big "WTF" in my head. Thanks Google for creating the worst understandable system one can imagine of.
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.
I just published my app and I can't find it on android market. Title is Nine Board TicTacToe.
This is from my developer console:
Supported Devices:
This application is only available to devices with these features, as defined in your application manifest.
Screen layouts: NORMAL LARGE XLARGE
Required device features
android.hardware.wifi
android.hardware.telephony
android.hardware.touchscreen
This application is available to over 461 devices.
minSdkVersion is 1
package="alencaljkusic.nineboardtictactoe"
Any advice? Thanks
The best way to see your app instantly after publishing it is going to the Android Market online straight to your package:
https://market.android.com/details?id=alencaljkusic.nineboardtictactoe
If you published it correctly you have to wait some minutes to let the changes to be done by the Android Market system.
It is NOT instant :)
My app shows that it supports a screen layout of SMALL, as well as NORMAL LARGE XLARGE.
Screen layouts: SMALL NORMAL LARGE XLARGE
Did you manually set up the supports-screens element in your AndroidManifest XML? If not, then the problem might be because your minSdkVersion is set to 1. The supports-screens link above seems to suggest some of these features only came along in API version 4. I suggest you set your minSdkVersion to 4 and retry.
One other tip: use the Browser on your device to search for your app in the Market. Once you've logged in, it will explicitly tell you if the app is supported for your device.
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.
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.