I have been trying to get an app install on my phone. Its compatibility page http://www.goqii.com/devices.html doesn't specify my phone.
I wanted to know how this compatibility is locked to specific phones.
Trying to reverse engineer the apk (using simple apktool), I thought about modifying the minimum/target sdk versions. These two strings show that the apk is already above the Android version on device (4.2.2 or 19)
android:minSdkVersion="12"
android:targetSdkVersion="14"
As this isn't the problem, I am thinking about how to make it work. Any ideas if this compatibility is set elsewhere? I don't see any hardware differences between the compatible phones and mine (a chinese make called Gionee).
I think you should look into uses-feature tag in the manifest. If you go through the doc:
The purpose of a declaration is to inform any external entity of the set of hardware and software features on which your application depends. The element offers a required attribute that lets you specify whether your application requires and cannot function without the declared feature, or whether it prefers to have the feature but can function without it.
So it could be NFC or Bluetooth LE or Camera etc which is required for app to run and developer has made required=true for those features in manifest.
If you're trying to download the app from the Play Store, it is very likely that the developer has defined filters on that app (http://developer.android.com/google/play/filters.html). These filters are not part of the Android Manifest and so, they cant be changed. This has been answered here already: How to restrict android app to specific device make?
Related
My question is related to camera. When an application needs to use the system camera, we create an intent with ACTION_IMAGE_CAPTURE action and add a permission like this in the manifest file.
<uses-permission android:name="android.permission.CAMERA"/>
But besides that, there is one such
<uses-feature android:name="android.hardware.camera"/>
What is it for? I read that if this line is written, then if the phone does not have a camera the application will not install. Is it true? And besides this, why do we need this?
And for what the line <uses-feature/> is generally responsible in manifest file?
<uses-feature android:name="android.hardware.camera"/>
above line will use to check the device have camera hardware.
When you upload an app on play store they will filter your app based on the feature for the specific device,
if any device will search your app on play store and that device doesn't have camera hardware then they will not be allowed to install an app on that device.
but if your requirement is to force download the app if the device doesn't have camara hardware the you can use :
<uses-feature android:name="android.hardware.camera" android:required="false"/>
the android:required = "false" will allow you to install
hope you understand
Google documentation for <uses-feature> itself clearly states:
Google Play uses the <uses-feature> elements declared in your app
manifest to filter your app from devices that do not meet its hardware
and software feature requirements.
By specifying the features that your application requires, you enable
Google Play to present your application only to users whose devices
meet the application's feature requirements, rather than presenting it
to all users.
Some permissions in Android are connected to some hardware/software features of a device, like CAMERA. Since every Android device in the market differs in its hardware and software configuration, there's a greater possibility that some feature that you're trying to add in your app doesn't support all Android Devices. If you try to use the camera in a camera-less device (a superficial assumption), then your app will not behave as you expect.
In short, if you want your app to only be available for the set of devices having that particular capability, then you can add <uses-feature> tag inside the manifest with the desired capability.
This is just for filtering apps in Play Store based on device configuration and support.
You can define zero or more <uses-feature> capabilities based on your need.
Note: If you don't want your app to get filtered out just for the sake of a feature that doesn't impact the overall user experience of the app, you can smartly disable the particular feature if it's not available in your app.
For that, you have to write
<uses-feature android:name="YOUR_NON_COMPULSORY_FEATURE" android:required="false" />
For example, if your app uses CAMERA feature, but your app is not dependent on that feature, you can disable just the CAMERA feature to provide a non-buggy user experience.
<uses-feature/> is there to guide Google play store to filter out this application from devices which do not have Camera hardware.
As a developer - lets ask this Question to ourself with respect to your app.
What will user do with my app whose phone does not have Camera?
If the answer to Above is "Not much" - then what is the point allowing user to install your app on phone if user can't do much with it? It is waste of time & Internet bandwidth for the user.
Also if user is really frustrated by eventually learning that this app is not much of use, they may RATE your app poorly on Play Store.
Hence its there is <uses-feature/> option to protect both developers & users from above scenario.
This is very important part. Let suppose your application uses a particular hard ware and that is essential for your app that hardware must be available on a device to use your application. If that is defined, your app will be filtered out for those devices that have that specific hard ware.
NOTE: As it is well documented over Google Developer site
**Google Play uses the elements declared in your app manifest to filter your app from devices that do not meet its hardware and software feature requirements.
By specifying the features that your application requires, you enable Google Play to present your application only to users whose devices meet the application's feature requirements, rather than presenting it to all users.**
Refer this link for further reference guide
I am trying to clone my app for using multi-user accounts for the same app.
This is inbuilt feature for many manufacturer now. Some apps also support in doing so, like Cloneit, Parallel etc.
My issue is my app doesn't appear in the lists of applications that can be cloned. Neither in the manufacturer option nor with other cloning apps.
Is there any setting I am missing in my app? for it to be eligible for cloning
Thanks
----UPDATE----
My apologies, I did not read your question thorough enough. I thought you were asking about supporting mult-user accounts. That was not your question.
So let's chat a bit further, but I'll leave the multi-user stuff below if it helps anyone else.
So first of all, when you make an app, it is available to all users on the device unless you hide it from some users. That is default behavior as long as the device supports multiple users.
Parallels, Cloneit and other apps are doing something completely different though. They are "not using multi account" they are making you a virtual environment that runs in parallel to your active one, allowing you to make exact copies of the app, but in a whole new active directory.
---QUICK LESSON---
See the way Android works is each application has a package ID, this
basically it's unique username for your phone.
Android has various user-groups to access areas of the device,
folders, and administrative settings. We have come to know these
user-groups as "Permissions".
When you install an app, it will request to be added to each
respective Linux User Group (permission) so that it has the right and
ability to touch the respective ares of the Android OS and file
system. Post-Marshmallow, you have to be added to the permission (aka
user-groups) at run-time by requesting in code and allowing the OS to
get user feedback to add you to the group.
Parallels, basically clones all of this behavior and makes a new environment for apps to be installed again, but in a different space, so user-groups, permissions etc, would have to be reobtained and the new space which is just normal coding practice, nothing unique about that statement.
However, Parallels indexing process of finding apps that it can clone is based on it's current environment, settings, and support capabilities. So if you compiled your application with settings, SDK, or anything that is not currently supported in the parallel environment, then your app would not be available for install.
Think of it like this. If you go to the App store from a phone that is running OS 6.0, you would not see apps that are written for 7.0 or 8.0 as they are not compatible and therefore, they don't show up in the list to download and install.
Parallels, does not necessarily clone your exact OS, it may have it's own packaged OS that it spins up. I can't speak to how/what Parallels or any other device creates their virtual environments for installation and cloning.
So all of that to say, check your compile SDK, check your target SDK, and check your minimum support. There is likely something in your compiling settings that is not compatible with Parallels virtual environment.
Start by creating a dummy app, and target something older, and make it more compatible. See if it shows up. If it does, then move up your SDk target and other versions until you see that it no longer shows up, then you will know which values affects it and why.
Hope that helps, please do update us on what you find in terms of support in Parallels.
OLD DISCUSSION, LEFT FOR SHARED KNOWLEDGE, NOT RELATED TO ABOVE
---MULTI-USER DISCUSSION for OEM App Development---
As of 5.0 Android, multi-user is disabled by default so the manufacturer must modify.
frameworks/base/core/res/res/values/config.xml:
<!-- Maximum number of supported users -->
<integer name="config_multiuserMaximumUsers">1</integer>
<!-- Whether Multiuser UI should be shown -->
<bool name="config_enableMultiUserUI">false</bool>
https://source.android.com/devices/tech/admin/multi-user
to allow the device to support multi-users.
As for using the Cloning apps, they each have their own methods of indexing apps, and handling this cloning process. Some may only index on app startup, others may index at install, so I would say you should confirm the behaviors of the cloning app you wish to play with.
Now if you are certain the device you are using supports multi-user then let's continue.
If you are a system level app intending on managing users, you will need permissions to do so as shown below:
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature"/>
<uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"
android:protectionLevel="signatureOrSystem"/>
Here is a helpful link for setting up and handling switching between users in your application.
http://light-green-android.blogspot.com/2015/11/talking-between-user-android-profiles.html
https://source.android.com/devices/tech/admin/multiuser-apps
But again, this is only if you are building a system level app for an OEM.
Give latest appcloner a try. I'm pretty sure it allows you to do this thing. It can clone almost any app you like.
I want my Android app not to be visible in the Play Store to people using a tablet.
I've made the changes to the AndroidManifest that were described in the documentation, and I'm sure it'll work, but I cannot update the apk unless I'm a 100% sure that it does.
The thing is, there is apparently no other way to check than to update the current production version...
Is there anyway I could make sure my compatible-screen setting works well, without any disturbance for the application users ?
Have you taken a look at the compatible screens documentation?
They have this little excerpt here that may be helpful:
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 Google Play) 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 Google Play) should not provide the application to devices with such screens.
Does that help?
First, my english is not very well. I have a question:
"If i have an phone with Android 4.0 and i'm looking for a specific app. However, in the Android manifest of that app stands: maxsdkversion:"8". Will the app be displayed on thed android 4.0 phone?
No, it will not be displayed.
Per the docs http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
Google Play will continue to use the attribute as a filter, however,
when presenting users with applications available for download.
That's why, again per the docs:
Warning: Declaring this attribute is not recommended. First, there is
no need to set the attribute as means of blocking deployment of your
application onto new versions of the Android platform as they are
released.
Is there a way to prevent an app from being installed on Android Honeycomb?
I am looking for either a market filter or a manifest option.
According to this discussion on google groups (android-developers list), setting maxSdkVersion="10" will block Honeycomb; however it won't stop a device upgrading to Honeycomb (or force app uninstall) once your app is installed.
In your Android Manifest file, set the uses-sdk tag. Android 3.0 is level 11. Also note, however, that Google explicitly states that they make their code backwards compatible so you don't have to do this. If you have a good reason to, go ahead, but be aware that Google thinks most people should never have to.