Monday, August 9, 2010
Android OS Versions in the Wild
Image Source : http://developer.android.com/resources/dashboard/platform-versions.html
The above chart gives us an idea of the overall OS spread (August 2, 2010). 59.7% of the Android phones are now running on Android 2.1(Donut). Isn't that great. Nice. And we will definitely see the percentage for Android 2.2(Froyo) increase manifold when manufacturers push updates on the latest version. But, there is a substantial amount of phones still out there running on 1.5, though not a majority. But, if we talk about only numbers, 20.3% of the total Android phones is still a huge number. Now that's a problem.
With Android 1.6 and up, apps can be designed and developed for different density and screen resolutions. The cupcake update doesn't have this feature. There are a few workarounds which enable you to develop in 1.6 and up and still support devices on 1.5, but it's a pain. I am sure many developers will agree with this. Apart from this, there aren't major differences that would hinder developers in making apps to suit all platforms.
And with Android 3.0(Gingerbread), rumors say that it will bring support for tablet sized devices, I am not sure how to absorb this piece of news.
Saturday, July 17, 2010
Ongoing notifications in Android
I have blogged about is here. There's also a link to the source there which you can directly run.
Sunday, June 27, 2010
India get's Android 2.1 upgrade for HTC Hero
But, it seems that this is a two step upgrade process. The first one is the:
"Firmware over-the-air (FOTA) client update & YouTube player Update."
"Android 2.1 Platform Upgrade "
Thursday, June 17, 2010
Parcelable - How to do that in Android
Passing data between activities is quite easy. You would normally do that using the Bundle packed into an intent. But sometimes you need to pass complex objects from one activity to another. One workaround would be to keep a static instance of the object int your Activity and access it from you new Activity. This might help, but it's definitely not a good way to do this. To pass such objects directly through the Bundle, your class would need to implement the Parcelable interface.
For example you have a class called Student, which has three fields.
1. id
2. name
3. grade
You can create a POJO class for this, but you need to add some extra code to make it Parcelable. Have a look at the implementation.
1: public class Student implements Parcelable{
2: private String id;
3: private String name;
4: private String grade;
5:
6: // Constructor
7: public Student(String id, String name, String grade){
8: this.id = id;
9: this.name = name;
10: this.grade = grade;
11: }
12: // Getter and setter methods
13: .........
14: .........
15:
16: // Parcelling part
17: public Student(Parcel in){
18: String[] data = new String[3];
19:
20: in.readStringArray(data);
21: this.id = data[0];
22: this.name = data[1];
23: this.grade = data[2];
24: }
25:
26: @override
27: public int describeContents(){
28: return 0;
29: }
30:
31: @Override
32: public void writeToParcel(Parcel dest, int flags) {
33: dest.writeStringArray(new String[] {this.id,
34: this.name,
35: this.grade});
36: }
37: public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
38: public Student createFromParcel(Parcel in) {
39: return new Student(in);
40: }
41:
42: public Student[] newArray(int size) {
43: return new Student[size];
44: }
45: };
46: }
Once you have created this class, you can easily pass objects of this class through the Intent like this, and recover this object in the target activity.
1: intent.putExtra("student", new Student("1","Mike","6"));
Here, the student is the key which you would require to unparcel the data from the bundle.
1: Bundle data = getIntent().getExtras();
2: Student student = data.getParcelable("student");
This example shows only String types. But, you can parcel any kind of data you want. Try it out.
Tuesday, June 8, 2010
TextView with HTML content with Images
Say, if you have a TextView tv, and there's some HTML string with bold and italicized text, bringing it up on the TextView is pretty simple.
One line code for that:
tv.setText(Html.fromHtml(source));
where the source is actually your HTML string. This works perfectly. But how do we show images if there are any. Well, it's a bit tricky. You have to use the other method that takes in an ImageGetter and a TagHandler.
fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)
The tagHandler is for situations where you wish to handle specific tags differently. I didn't wish to do that, so I just passed null there.
Now comes the main task. How do you get the image on to the TextView!!!!
Implement the Html.ImageGetter's getDrawable method which handles downloading the image, or accessing it from the net, and then create a drawable and return that object.
static ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
drawable = Drawable.createFromPath(source); // Or fetch it from the URL
// Important
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
.getIntrinsicHeight());
return drawable;
}
};
and use the method on the TextView like this.
tv.setText(Html.fromHtml(source, imgGetter, null);
This will load the TextView with the image. But this call to the getDrawable method is not asynchronous. So, until and unless that method returns, you UI will be blocked. In my case, I am creating the drawable from a local image, so, it didn't take much time. But, if you want to fetch an image from the web, you have to make this call in a separate thread, so that the UI is not blocked.
So, check your HTML string if they contain any images that have to be downloaded. If you find any, create a thread that download that image, saves it somewhere and returns you the location of that file. Now, change the src tags to point to the local images, and call setText method on the TextView.
And that should do it. The important thing to remember is, you have to change the HTML to point it to the file that you have downloaded.
Sample Source code : http://code.google.com/p/myandroidwidgets/source/browse/#svn/trunk/TextViewHTML
This sample doesn't use threads. So, your UI will be blocked unitl the image here is downloaded. So, keep waiting. :)
