Writing ICS Android apps which are backwards compatible - android

I'm writing an app that adds calendar events.
For OS versions prior to ICS, I need to use contentResolver queries which are unsupported and subject to change.
With ICS the API to do this sort of thing is to use the CalendarContract provider. So I plan to detect the OS API version and use the appropriate methods for pre ICS OS and ICS.
In my manifest I have the following to support Android 2.1 to 4.x:
uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14"
But the CalendarContract isn't available to import unless I set the minSdkVersion to 14, which makes the app inaccessible to anyone running anything prior to ICS.
How do I support older versions of the OS while adding support for new OS features on phones with ICS?
Do I create two versions of the app and upload both to the marketplace? Will users see the appropriate version for their OS?

This is what you can do to make this work:
Have the minSDK version set to 2.1 and the target version to ICS.
Then, In properties of your project, build against ICS (android 4.0)..
This way, you are building against 4.0, which will include the functionality you need in ICS, yet you will still support android 2.1
As long as you don't call any ICS APIs when it is running on 2.1 (you will get classnotfound exception if you do), you will be fine.

Related

Which Android API to use for all device compatibility?

I have downloaded SDK for Android 4.4(API Level 19) and developed one android app.
But on some old devices it is crashed as they are using OS (Android 4.0 and lesser)
I have already specified below then also it is crashed on old OS devices
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19"/>
Is there any other setting I need to do to run my app on old devices?
Setting the minSdkVersion and TargetSDKVersion isn't enough. In every new Android release new API's and classes are introduced in the SDK. However older versions of Android don't have these new changes. This is the reason the Android team have introduced the Android Support Library, this enables backward compatibiliteit of new features on the older Android versions. My guess is that you're using API's and/or classes only available in the newer SDKs.
Please reffer to: Support Library | Android Developers

What factors are important in choosing target android OS for development

What do I need to consider before choosing the target android OS for app development?
This is my understanding of how to do it and any clarification would be appreciated:
Determine which OS version is currently in use the most. Look at distribution graphs etc.
Target that version.
that is what I read all the time, but I have some questions.
Suppose 4.0 is the version that is the most used among android phone consumers so I should target 4.0. Now, suppose that I don't use features that are unique to 4.0. will my app work with any version below 4.0 including 1.5, 2.3 etc.? Consider the reverse situation. If I target version 2.3 and if my app uses only features that are available to 2.3 will my app work on phones that are running version 4.0 even though I will not be using features that are unique to version 4.0?
thanks.
have a look at your AndroidManifest.xml
There is a targetSdkVersion and minSdkVersion if you want to support all devices running 2.2 and up then set minSdkVersion to api level 8 (android 2.2)
but in general, its a good practice to develop against the latest api as target (currently API 19, Android 4.4), so you can ensure it will work from your chosen min up to the newest OS api
so if you want to support at least Gingerbread up to KitKat do this in your manifest:
<uses-sdk android:minSdkVersion="9"
android:targetSdkVersion="19" />
and develop against api 19 :)
Suppose 4.0 is the version that is the most used among android phone consumers so I should target 4.0. Now, suppose that I don't use features that are new to 4.0. will my app work with any version below 4.0 including 1.5, 2.3 etc.?
Only if you don't use APIs that were introduced after the earliest version you want the app to run on.
If I target version 2.3 and if my app uses only features that are available to 2.3 will my app work on phones that are running version 4.0 even though I will not be using features that are unique to version 4.0?
Yes. Some functions get deprecated in newer OS versions, but most of them still work in newer releases for keeping compatibility.
I feel the thing to stress here is that Android is backwards compatible, so newer versions will almost be able to run apps developed for older OS versions.
The target version is the highest version you have tested it on. You should always target the absolute latest if you can. The min version is the lowest version that will be able to install the app.
So in the manifest, you would typically have something like this:
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" ...
Pick the minSdkVersion based on the features that are absolutely required for your app to function.
So you might wonder what the purpose of targetSdkVersion is. One reason is if your app has some optional features that are in later versions of the SDK. targetSdkVersion will allow you to use those later features, but you will need to protect those method calls with a check against the device's SDK with a call like
if (Build.VERSION.SDK_INT >= 11)
myMethodThatUsesFeaturesOnlyInHoneycombAndLater();
Another reason is that sometimes the Android team makes changes to some of the defaults in various settings on your classes, but to maintain compatibility for future versions on which you have not tested your app, they keep the old default if your app doesn't claim to target this later version.
For example, after Honeycomb, the menu is supposed to be integrated with the action bar. But old apps that were compiled with earlier SDKs have not been tested with Honeycomb or later, as proved by them having a targetSdkVersion of less than 11, so the OS knows to display the old style menu. Once this developer decides to test their app on a more recent targetSdkVersion, they update the value and the OS can trust that they have tested it on Honeycomb, so it can safely show the new style menu.

Relation between android version of device and version specified in the app

While creating a project using eclipse i have Minimum SDK required as Android 2.2(Froyo) and Target SDK as Android 4.2(Jelly Bean) compile with Android 4.3. I have used sqlitebrowser v2.ob1 for creating database. My app runs without any errors (few lines in red in logcat though) and meets my requirements when i run it in an emulator. I tried 3 different emulators and it works fine. But when i tried this app in a mobile device it shows force close whenever there is something to do with database. I mean to say that it shows force close when it has to retrieve from database or connect to database. By searching i learned that just the .apk file is enough for the app to run even if externally created database is used in it (copying to assets folder and then to the default location). My questions are
Shouldn't my app work fine in any device ranging from Android 2.2 to 4.2 ?
Should i try compiling the app with Android 4.2 instead?
Am not sure about the version of the device i tried it in but am sure its within 2.2 and 4.2 . (Probably gingerbread). Other than plugging the device to PC via USB and seeing logcat (bcoz i dont own an android mobile phone) what can i do to solve this?
How is the app's version, emulator and version of mobile or any other device related?
My app can run on what versions of devices?
This is my first android app so any help is appreciated. Thanks in advace
It's possible that you are using a feature in your application that isn't supported by a lower version of the SDK. It's difficult to tell you exactly what that might be without any source code or stacktrace, but I can clear up your understanding of minSdkVersion and targetSdkVersion.
Consider that with each new version of the Android SDK, additional features and APIs are introduced that did not exist in previous versions. Obviously, the older versions of Android don't support those features.
When you specify a targetSdkVersion you are specifying that you are using features that were introduced in that particular version of Android. You are also implying that you have tested your application at that particular API level, and that it works as it should.
When you specify a minSdkVersion that is lower than your targetSdkVersion, you are implying that your application will work properly on a lower API level because you have manually programmed tests or checks in your code to ensure that the current API level is compatible with a feature before running it.
For example, if I wanted to run a feature introduced in Jelly Bean but I want to retain support for a lower API level (e.g. Gingerbread), I might add the following check before I run the feature (see other version codes here):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
// run some code specific to API level 16
}
The Android SDK can automatically deal with code introduced in a lower API level, but it can't automatically deal with code specific to a higher API level.
So with that in mind, to answer your questions:
No, it's only guaranteed that your application will work properly on Android 4.2. It's up to you to ensure that it remains backwards compatible for earlier versions that you wish to support.
It shouldn't matter. Instead, you should first determine if your application runs on a device/emulator that is running the same API level as you are targeting (Android 4.2, API level 17), then run it on a device/emulator running a lower version and try to isolate the code that is causing it to crash (logcat will be helpful).
You can check the Android version of a device by going into Settings > About phone > Android version. If it is running Gingerbread, keep in mind that a lot of new features have been introduced since then and your application might be using some of those features. For the emulator, you can specify an API level when you create an emulator (you can download other versions to use from the SDK Manager).
I think my answer so far has made this relationship clear.
To reiterate, your application WILL run on any device running Android 2.2 or later, but it can crash if you are using features from a higher API level than the device is running.
If this is still not clear, you should read more about supporting multiple platform versions in the Android documentation: here.

Does Android APIs have compatibilty for its old versions?

I'm downloading Android SDK , and want to know if Android's APIs has compatibility with its
Previous versions ? i.e. if i installed Android API 16 can I use the application on
Android 4.0 (API 14) ?
You can run older API versions on newer systems, but not vice-versa. For example Android 4.0 can run programs made for Android 2.3.3, but Android 2.3.3 can't run Android 4.0 programs.
You have to define a minimum sdk level in your android manifest. Every version from this upwards supports the app. You can only use classes and language elements that are supported by this specified version.
This is controlled by the following in your manifest file:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
This means:
1) your app won't run on any Android whose version < 8.
Android OS whose version < 8 will not let your app be installed.
2) Your app is using Android API as of Android version 15.
In your code you can, however, check the Android version (using Build.VERSION.SDK_INT) and if it is < 15 then do not run certain code.
This is often done so the app can use newer features if run on newer Android versions yet it can run on older versions as well.
Not all components are backwards compatible, but for backwards stuff, look at the following
I found the most useful library out there for making an android app backwards compatible.
Its called Actionbarsherlock, it gives you all android 4.1+ functionality all the way back to 2.1 (what i am developing as a min version)
Its fairly simple to use, very well explained on their website:
http://actionbarsherlock.com/
Enjoy

How can I use PhoneGap 1.7 for deployment on Android 2.x devices?

I am currently using PhoneGap 1.7, just having created the HelloWorld app, per the instructions at their site. However, I believe it requires Android Revision 15 or higher (4.0.3). I will eventually be wrapping a jQuery Mobile app with PhoneGap and I need it to be runnable on Android 2.x. Android 1.x and 3.x would be nice but are not required. How can I create a deployable app that will work on 2.x and 4.x versions of Android (with 1.x and 3.x being optional)? I hope I don't have to have different versions of PhoneGap and thus different deployment app versions. I'd like to have one deployable app for all versions.
Thank you very much for any help.
I am not familiar at all with phonegap. But with native development the API levels are backward compatible. So you can build the application with API 15, but set the android:minSdkVersion in the manifest to something lower. I imagine this is how phonegap works also, so even though you are using the newest API level it should still be backward compatible.
i.e. in the manifest of a native app
<uses-sdk android:minSdkVersion="7"/>
would indicate that the application is able to run on any devices that are Android 2.1 or newer. Even though you've added the 4.0.3 android jar file to your project the system is smart enough to make sure that it still works on the older devices as long as you set this in the manifest.
It is also worth noting that if your app takes advantage of any newer API's then you'll have to come up with a way to ensure those features get turned off if the app detects that the OS version it is currently on is too old to support the feature.

Categories

Resources