Sunday, December 19, 2010

Google Code Blog: Save the date for Google I/O 2011

Google Code Blog: Save the date for Google I/O 2011: "Google I/O just recently came to a close, but it won’t be long before we start gearing up for next year. And we’d like to make sure it’s on..."

Sunday, December 5, 2010

Non UI blocking network call / web request

Code snippet to fetche content(s) from the web without blocking the UI (runs in the background in a Thread). Once finished, it posts a Handler that is picked up by the UI as soon as possible.
It is widely used in most of commercial/production level apps

Code Snippet:-
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;

public class Iconic extends Activity {
    private String html = "";
    private Handler mHandler;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mHandler = new Handler();
        checkUpdate.start();
    }

    private Thread checkUpdate = new Thread() {
        public void run() {
            try {
                URL updateURL = new URL("http://iconic.4feets.com/update");
                URLConnection conn = updateURL.openConnection();
                InputStream is = conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                ByteArrayBuffer baf = new ByteArrayBuffer(50);

                int current = 0;
                while((current = bis.read()) != -1){
                    baf.append((byte)current);
                }

                /* Convert the Bytes read to a String. */
                html = new String(baf.toByteArray());
                mHandler.post(showUpdate);
            } catch (Exception e) {
            }
        }
    };

    private Runnable showUpdate = new Runnable(){
           public void run(){
            Toast.makeText(Iconic.this, "HTML Code: " + html, Toast.LENGTH_SHORT).show();
        }
    };
}

Check for Updates in background Once in two days - schedule a background updates checker

This code checks for updates of the Activity once in 2 days and in the background. If an update (higher version than current) is found, it opens a Dialog and asks the user to open the market. 

code-snippet:-
public class Test extends Activity {
    private Handler mHandler;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.front);
        mHandler = new Handler();
       
        /* Get Last Update Time from Preferences */
        SharedPreferences prefs = getPreferences(0);
        lastUpdateTime =  prefs.getLong("lastUpdateTime", 0);
       
        /* Should Activity Check for Updates Now? once in 2days */
        if ((lastUpdateTime + (2*24 * 60 * 60 * 1000)) < System.currentTimeMillis()) {

            /* Save current timestamp for next Check*/
            lastUpdateTime = System.currentTimeMillis();           
            SharedPreferences.Editor editor = getPreferences(0).edit();
            editor.putLong("lastUpdateTime", lastUpdateTime);
            editor.commit();       

            /* Start Update */           
            checkUpdate.start();
        }
    }
   
    /* This Thread checks for Updates in the Background */
    private Thread checkUpdate = new Thread() {
        public void run() {
            try {
                URL updateURL = new URL("http://abc.com/update");               
                URLConnection conn = updateURL.openConnection();
                InputStream is = conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                ByteArrayBuffer baf = new ByteArrayBuffer(50);
               
                int current = 0;
                while((current = bis.read()) != -1){
                     baf.append((byte)current);
                }

                /* Convert the Bytes read to a String. */
                final String s = new String(baf.toByteArray());        
               
                /* Get current Version Number */
                int curVersion = getPackageManager().getPackageInfo("your.application.id", 0).versionCode;
                int newVersion = Integer.valueOf(s);
               
                /* Is a higher version than the current already out? */
                if (newVersion > curVersion) {
                    /* Post a Handler for the UI to pick up and open the Dialog */
                    mHandler.post(showUpdate);
                }               
            } catch (Exception e) {
            }
        }
    };

    /* This Runnable creates a Dialog and asks the user to open the Market */
    private Runnable showUpdate = new Runnable(){
           public void run(){
            new AlertDialog.Builder(Test.this)
            .setIcon(R.drawable.icon)
            .setTitle("Update Available")
            .setMessage("An update for is available!\n\nOpen Android Market and see the details?")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                            /* User clicked OK so do some stuff */
                            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.application.id"));
                            startActivity(intent);
                    }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                            /* User clicked Cancel */
                    }
            })
            .show();
           }
    };   
}


To check if SD Card is present on android device via code

To check if SD Card is present on the device, we can use simple code
public static boolean isSdCardPresent(){
return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);  

 

Wednesday, November 10, 2010

Obtain IP Address for android device

Two ways to find the device ip:-

1. Method1:-  Open a socket to a known website/webserver like google.com or yahoo.com and get the ip using the technique shown below. It is straight forward(but not recommended)
String get_ip(){
java.net.Socket conn = null;
String ipAddress;

try {
conn = new java.net.Socket("www.google.com", 80);
} catch (UnknownHostException unknownhostexception) {
unknownhostexception.printStackTrace();
} catch (IOException ioexception) {
ioexception.printStackTrace();

ipAddress = conn.getLocalAddress().toString();
Toast.makeText(ip.this," Device IP --"+ipAddress,Toast.LENGTH_LONG).show();
return ipAddress;
}
2. Method2:- Iterate over all network interfaces and iterate there over all ip addresses. (Recommended way)

public String getLocalIpAddress() {

try {
for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration enumIpAddr = intf.getInetAddresses();
enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();}}}
} catch (SocketException exception) {
Log.e("We got Exception here", exception.toString());
}
return null;
}

Note:- This will give you simple way to get the ip address (For device on WiFi we need to access wifiManager class) and is independent of Android. This is generic java code and can be used on the laptop as well


Hope it helps!

Saturday, September 4, 2010

Harsha Bhogle at IIMA

Android figures

An overview about the Android SDK


1. The Android SDK was announced officially on November 12, 2007.

2. Table showing various Android versions and API levels

3.  The Latest version of Android SDK is 2.2 called as Froyo

4.  Android had a 2.8% share of the worldwide smartphone market. By the following quarter (Q3 2009),
     Android’s market share had grown to 3.5%.

5.  Android would become the world’s second most popular smartphone platform. while BlackBerry falls
    from 2nd to 5th place. iPhone remains in 3rd place. Microsoft’s Windows Mobile remains in 4th place.