Tuesday, April 3, 2012

Where am I? Finding your location

One of the coolest thing that you can do with your Android device, is find your location!
In Android there are location-based services to get the current location of device. There are two ways to get the physical location:

  • Network Provider
  • GPS Provider
By LocationManager object we can retrieve latitude and longitude of last known location.
Now with these information and using Geocoder we get the addresses in the neighbours. Here's the code snippet:
// max of adresses near you
int max_result = 1;
// you can decide if use a network or gps provider
String provider = LocationManager.NETWORK_PROVIDER;
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// get the last know location
Location location = locationManager.getLastKnownLocation(provider);
double latitude = location.getLatitude();
double longitude = location.getLongitude();
List<address> addresses = null;
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
     addresses = gc.getFromLocation(latitude, longitude, max_result);
} catch (IOException e) {}
// return the string information
Toast.makeText(this, addresses.get(0).toString(), Toast.LENGTH_LONG)
     .show();
This example assumes:

  •  that you have enabled the NETWORK_PROVIDER
  •  so you can add in the manifest file the ACCESS_FINE_LOCATION uses-permission


Wednesday, March 21, 2012

Resources based on localization

Hi all!,
Today I will show you a very powerful technique, which we can exploit through localization: resources based on localization.
With the location and the opportunity given by Android to create specific resources based on the localization this powerful technique is very easy to implement.
The example that I will show is to select a language, and display a text according to your choice.
First create many localized folders as many languages ​​we want to support , that is how many languages ​​we want to display our text.
In the example, are 3 languages​​: English (default), Italian and French.




Now we must create a resource file for each localized folder, where we will insert the text as a string resource.
Created our texts, we are going to implement graphically our selection language Activity:



    

    


The Activity has consisted of only one spinner, which allows the choice of language, and a button to start the Activity containing our text:

public class LocalizationUpdaterActivity extends Activity {

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  Spinner spinner = (Spinner) findViewById(R.id.spinner1);
  spinner.setPrompt("select language");

  ArrayAdapter adapter = new ArrayAdapter(this,
    android.R.layout.simple_spinner_item, languages);
  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  spinner.setAdapter(adapter);

  spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

   public void onItemSelected(AdapterView arg0, View arg1,
     int arg2, long arg3) {
    Configuration config = new Configuration();
    switch (arg2) {
    case 0:
     config.locale = Locale.ENGLISH;
     break;
    case 1:
     config.locale = Locale.ITALIAN;
     break;
    case 2:
     config.locale = Locale.FRENCH;
     break;
    default:
     config.locale = Locale.ENGLISH;
     break;
    }
    getResources().updateConfiguration(config, null);
   }

   public void onNothingSelected(AdapterView arg0) {
    // TODO Auto-generated method stub
    
   }
  });

 }
 
 public void onClick(View v){
  startActivity(new Intent(getBaseContext(), TextActivity.class));
 }
 private String[] languages = { "Inglese", "Italiano", "Francese" };
}


We can observe what happens when we click an element in spinner: depending on the item clickedc we understand wich Locale we must create, so then, we invoke the method updateConfiguration to update the resource configuration! WOW!
That is going to change all the values ​​of resources based on location.
The layout of the Activity that shows the text contains only a TextView that refers to our resource of type String, then by the choice of language made ​​we can see the different texts.

Here's a short video:




This is the link of source code

Monday, November 7, 2011

Android Snippet Code: Android ListView with fast scroll and alphabetical section index

Hi,
This small tutorial will show you how to create a ListView with fast scrolling and alphabetical section list that displays the letter as you quickly scroll the list.


We starting with the ListView example of HelloViews resources in the android tutorials and then apply my adapter that implements the alphabetical section indexer.

  1. Start a new project named QuicklySectionListView.
  2. Create an XML file named list_item.xml and save it inside the res/layout/ folder. This file defines the layout for each item that will be placed in the ListView. Insert the following:
     <?xml version="1.0" encoding="utf-8"?>  
     <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
       android:layout_width="fill_parent"  
       android:layout_height="fill_parent"  
       android:padding="10dp"  
       android:textSize="16sp" >  
     </TextView>  
    
  3. Starting from the ListView example I have added an inner class that extends ArrayAdapter and implements SectionIndexer. The code is as follow:
     
    
     package com.example.quicklyscrolllistview;  
       
     import java.util.ArrayList;  
     import java.util.Collections;  
     import java.util.HashMap;  
     import java.util.LinkedList;  
     import java.util.Set;  
       
     import android.app.ListActivity;  
     import android.content.Context;  
     import android.os.Bundle;  
     import android.view.View;  
     import android.widget.AdapterView;  
     import android.widget.AdapterView.OnItemClickListener;  
     import android.widget.ArrayAdapter;  
     import android.widget.ListView;  
     import android.widget.SectionIndexer;  
     import android.widget.TextView;  
     import android.widget.Toast;  
       
     public class QuicklyScrollListViewActivity extends ListActivity {  
          // Called when the activity is first created.  
          @Override  
          public void onCreate(Bundle savedInstanceState) {  
               super.onCreate(savedInstanceState);  
       
               LinkedList<String> mLinked = new LinkedList<String>();  
               for (int i = 0; i < COUNTRIES.length; i++) {  
                    mLinked.add(COUNTRIES[i]);  
               }  
       
               setListAdapter(new MyListAdaptor(this, mLinked));  
       
               ListView lv = getListView();  
               lv.setFastScrollEnabled(true);  
       
               lv.setOnItemClickListener(new OnItemClickListener() {  
                    public void onItemClick(AdapterView<?> parent, View view,  
                              int position, long id) {  
                         // When clicked, show a toast with the TextView text  
                         Toast.makeText(getApplicationContext(),  
                                   ((TextView) view).getText(), Toast.LENGTH_SHORT).show();  
                    }  
               });  
          }  
       
          static final String[] COUNTRIES = new String[] { "Afghanistan", "Albania",  
                    "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla",  
                    "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia",  
                    "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain",  
                    "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin",  
                    "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegovina",  
                    "Botswana", "Bouvet Island", "Brazil",  
                    "British Indian Ocean Territory", "British Virgin Islands",  
                    "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cote d'Ivoire",  
                    "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands",  
                    "Central African Republic", "Chad", "Chile", "China",  
                    "Christmas Island", "Cocos (Keeling) Islands", "Colombia",  
                    "Comoros", "Congo", "Cook Islands", "Costa Rica", "Croatia",  
                    "Cuba", "Cyprus", "Czech Republic",  
                    "Democratic Republic of the Congo", "Denmark", "Djibouti",  
                    "Dominica", "Dominican Republic", "East Timor", "Ecuador", "Egypt",  
                    "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia",  
                    "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji",  
                    "Finland", "Former Yugoslav Republic of Macedonia", "France",  
                    "French Guiana", "French Polynesia", "French Southern Territories",  
                    "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece",  
                    "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala",  
                    "Guinea", "Guinea-Bissau", "Guyana", "Haiti",  
                    "Heard Island and McDonald Islands", "Honduras", "Hong Kong",  
                    "Hungary", "Iceland", "India", "Indonesia", "Iran", "Iraq",  
                    "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jordan",  
                    "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos",  
                    "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya",  
                    "Liechtenstein", "Lithuania", "Luxembourg", "Macau", "Madagascar",  
                    "Malawi", "Malaysia", "Maldives", "Mali", "Malta",  
                    "Marshall Islands", "Martinique", "Mauritania", "Mauritius",  
                    "Mayotte", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia",  
                    "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia",  
                    "Nauru", "Nepal", "Netherlands", "Netherlands Antilles",  
                    "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria",  
                    "Niue", "Norfolk Island", "North Korea", "Northern Marianas",  
                    "Norway", "Oman", "Pakistan", "Palau", "Panama",  
                    "Papua New Guinea", "Paraguay", "Peru", "Philippines",  
                    "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar",  
                    "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe",  
                    "Saint Helena", "Saint Kitts and Nevis", "Saint Lucia",  
                    "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines",  
                    "Samoa", "San Marino", "Saudi Arabia", "Senegal", "Seychelles",  
                    "Sierra Leone", "Singapore", "Slovakia", "Slovenia",  
                    "Solomon Islands", "Somalia", "South Africa",  
                    "South Georgia and the South Sandwich Islands", "South Korea",  
                    "Spain", "Sri Lanka", "Sudan", "Suriname",  
                    "Svalbard and Jan Mayen", "Swaziland", "Sweden", "Switzerland",  
                    "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand",  
                    "The Bahamas", "The Gambia", "Togo", "Tokelau", "Tonga",  
                    "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan",  
                    "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",  
                    "Ukraine", "United Arab Emirates", "United Kingdom",  
                    "United States", "United States Minor Outlying Islands", "Uruguay",  
                    "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam",  
                    "Wallis and Futuna", "Western Sahara", "Yemen", "Yugoslavia",  
                    "Zambia", "Zimbabwe" };  
       
          /**  
           * The List row creator  
           */  
          class MyListAdaptor extends ArrayAdapter<String> implements  
                    SectionIndexer {  
       
               HashMap<String, Integer> alphaIndexer;  
               String[] sections;  
       
               public MyListAdaptor(Context context, LinkedList<String> items) {  
                    super(context, R.layout.list_item, items);  
       
                    alphaIndexer = new HashMap<String, Integer>();  
                    int size = items.size();  
       
                    for (int x = 0; x < size; x++) {  
                         String s = items.get(x);  
       
                         // get the first letter of the store  
                         String ch = s.substring(0, 1);  
                         // convert to uppercase otherwise lowercase a -z will be sorted  
                         // after upper A-Z  
                         ch = ch.toUpperCase();  
    
     
    // put only if the key does not exist  
                         if (!alphaIndexer.containsKey(ch))
    
    alphaIndexer.put(ch, x);
    } Set<String> sectionLetters = alphaIndexer.keySet(); // create a list from the set to sort ArrayList<String> sectionList = new ArrayList<String>( sectionLetters); Collections.sort(sectionList); sections = new String[sectionList.size()]; sectionList.toArray(sections); } public int getPositionForSection(int section) { return alphaIndexer.get(sections[section]); } public int getSectionForPosition(int position) { return 0; } public Object[] getSections() { return sections; } } }
MyListAdaptor get a LinkedList of strings and sort it out alphabetically. The indexes have the values of the keys in the LinkedList sorted alphabetically. 
I hope this is helpful.




You can find the source code here.