KEMBAR78
Getting started with android dev and test perspective | PPT
Getting started with  Gunjan Kumar
Agenda Overview of Android Features and Architecture Setup for development (SDK, ADT) Android Virtual Device Installing, using and installing applications Developing Android applications  Install / test on AVD Ideas for testing
OVERVIEW OF ANDROID
Overview Android is a software stack for mobile devices that includes an operating system, middleware and key applications Based on the Linux kernel Open Handset Alliance collaborated on Android's development and release More than 33% of market share today. 3.1 Honeycomb for Tablet and 2.3.4 Gingerbread for Phones App market with 200000+ apps, >3 billion downloads http://en.wikipedia.org/wiki/Android_%28operating_system%29
History Android Inc founded in 2003 by Andy Rubin and other members. Google acquired Android in August 2005. Open Handset Alliance formed on 5 November 2007 to develop open standards for mobile devices. Android unveiled as OHA’s first product. Updates launched to fix bugs / add new features The code names are in alphabetical order (Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, and the upcoming Ice Cream Sandwich).
Version history http://en.wikipedia.org/wiki/Android_version_history Version Name Release Date Beta 5 November 2007 1.0 23 September 2008 Android Market, Google account integration, maps … 1.1 9 February 2009 resolved issues, API changes … 1.5 Cupcake 30 April 2009 Widgets, upload to YouTube and Picasa … 1.6 Donut 15 September 2009 WVGA / CDMA support, Google navigation, Search enhancement … 2.0/2.1 Éclair 26 October 2009 / 12 January 2010 Live wallpaper, multiple screen resolutions, Camera flash … 2.2 Froyo 20 May 2010 Chrome’s V8 JavaScript engine, upload file in browser … 2.3 Gingerbread 6 December 2010 Voice and Video support in Gtalk … 3.0 / 3.1 Honeycomb 22 February 2011 / 10 May 2011 Released for tablets Ice Cream Sandwich Q4 2011 combination of Gingerbread and Honeycomb into a "cohesive whole"
Usage share / Market Share Source Year Symbian Android RIM iOS Microsoft Other OSs Gartner 2011 Q1 27.4% 36.0% 12.9% 16.8% 3.6% 3.3% Gartner 2010 37.6% 22.7% 16.0% 15.7% 4.2% 3.8% Gartner 2009 46.9% 3.9% 19.9% 14.4% 8.7% 6.1% Gartner 2008 52.4% 0.5% 16.6% 8.2% 11.8% 10.5% Gartner 2007 63.5% N/A 9.6% 2.7% 12.0% 12.1%
Features Application framework enabling reuse and replacement of components Dalvik virtual machine optimized for mobile devices Integrated browser based on the open source WebKit engine Optimized graphics powered by a custom 2D graphics library; 3D graphics based on the OpenGL ES 1.0 specification (hardware acceleration optional) SQLite for structured data storage Media support for common audio, video, and still image formats (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) GSM Telephony (hardware dependent) Bluetooth, EDGE, 3G, and WiFi (hardware dependent) Camera, GPS, compass, and accelerometer (hardware dependent) Rich development environment including a device emulator, tools for debugging, memory and performance profiling, and a plugin for the Eclipse IDE http://developer.android.com/guide/basics/what-is-android.html
Android architecture http://developer.android.com/images/system-architecture.jpg
SETUP FOR DEVELOPMENT
App development overview An open development platform, Android offers developers the ability to build extremely rich and innovative applications Underlying all applications is a set of services and systems, including: A rich and extensible set of Views that can be used to build an application, including lists, grids, text boxes, buttons, and even an embeddable web browser Content Providers that enable applications to access data from other applications (such as Contacts), or to share their own data A Resource Manager, providing access to non-code resources such as localized strings, graphics, and layout files A Notification Manager that enables all applications to display custom alerts in the status bar An Activity Manager that manages the lifecycle of applications and provides a common navigation backstack
App development : options http://appinventor.googlelabs.com/about/ SDK provided so you can use command line or IDE for app development  Eclipse based development for more elaborate development SDK + ADT (Android Developer Tool)  Set up Android Virtual Devices or hardware devices. Create an Android project. Build and run your application. Debug your application with the SDK debugging and logging tools. Test your application with the Testing and Instrumentation framework .
Step 1 : Install SDK System requirement :  http://developer.android.com/sdk/requirements.html So ensure you have JDK installed before you move to SDK installation Download from  http://developer.android.com/sdk/index.html Launch SDK Manager from the downloaded file to install platforms http://developer.android.com/sdk/installing.html
Step 1 : Install SDK- tips Ensure that JDK is installed.  http://java.sun.com/javase/downloads/index.jsp Once JDK is installed, you can either use Installer or download ZIP for Android SDK http://developer.android.com/sdk/index.html Once SDK is installed, you will see a SDK Manager executable in the folder. Launch this to download platforms that will get added to the  platforms  folder In office, you may have issues downloading from https so in the SDK manager, goto settings and check on the “ force HTTPS  to be fetched as HTTP ” checkbox If that doesn’t work out as well, try setting a proxy (say proxy-ne7.qintra.com port 8888 ) Alternatively, you can copy this folder from any existing installation
Step 2 : Eclipse plug-in – Why? ADT (Android Developer Tool) plug-in for Eclipse simplifies development in Eclipse by providing Android Project Wizard helps create new project Forms-based manifest, layout and resource editor Building, conversion to .DEX (Android Executable), package to .APK and install to Dalvik VM is automated AVD manager integrated with Eclipse for easy access to AVDs DDMS (Dalvik Debug Monitoring Services) assists in monitoring Debugging, breakpoints Log and console outputs
Step 2 : Eclipse plug-in : How? Help   Install new software Add the following URL http://dl.google.com/android/eclipse Select all from the Developer Tools Restart and update ADT Preference Window    Preference Mention the SDK Location
ANDROID VIRTUAL DEVICE
Development in Eclipse
Create AVD and launch Emulator (command line) Android Virtual Device (AVD) is an emulator configuration that lets you model an actual device by defining hardware and software options to be emulated by the Android Emulator. See list of targets  : android list targets id: 2 or &quot;android-4&quot;      Name: Android 1.6      Type: Platform      API level: 4      Revision: 3      Skins: QVGA, HVGA (default), WVGA800, WVGA854   Create AVD : android create avd -n my_avd -t 2 Run Emulator : emulator -avd <avd_name> http://developer.android.com/guide/developing/devices/managing-avds-cmdline.html http://developer.android.com/guide/developing/tools/emulator.html
Create AVD from SDK Manager
Create AVD from Eclipse
Specifying details for AVD SD Card must be at least 9MB or left blank Skin allows to choose resolution / form factor for the device you want to emulate Name the device and select the target (the version of Platform that you want to emulate. Note that the list will be pulled out from the list of platforms you have installed on your machine (you can see in <sdk>\ platforms folder)
Emulator
DEVELOPING ANDROID APPLICATIONS
Activities Presentation layer Activity is a screen – only one gets user inputs at a time An application can have more than one activities, each being a screen that the app can show to the user Each activity extends android.app.Activity onCreate method is overridden to create or set the view – the actual layout of controls on the screen
Services Run in background, with no visible UI Extend Service class Typically used to develop services that need to be running even if the screen is closed
Intent Message passing mechanism within and between applications Used for Starting a service or activity Broadcast that an event has occurred – Android broadcasts intents for system events like “incoming phone call” Declare your intent that an activity be started to perform an action with some data Intent browserIntent = new Intent(Intent. ACTION_VIEW, Uri.parse(URL));  startActivity(browserIntent);  Intent callIntent = new Intent(Intent. ACTION_CALL); callIntent.setData(Uri. parse(&quot;tel:&quot; + PhoneNumber)); startActivity(callIntent); void OpenHome(){ Intent myIntent = new Intent(QwestAvailabilityDetails.this, QwestHome.class); startActivity(myIntent); }
Content Provider Shareable data sources Native content stores exposed by Android – media store, contacts, call logs etc.
Create new app Specify the project name as it should appear in your workspace Specify the target platform – depending on the device you are expecting this to run on Application Name – as will appear on the device Create Activity – the first activity that will be launched when app starts
What is generated? Named as the Create Activity specified when creating the app, this extends android.app.Activity and serves as the “screen” that is shown to the user Auto generated file. DON’T MANIPULATE. Contains reference to all resources. Used in activities to access the resources Contains resources – layouts, images, values to be used in app – referenced via R Contains the icon which will be used on device for your app. Any more images that you use in the app must be added here. Add versions based on resolution to each of the folders Layouts specify the screens look and feel – think of it as HTML. Typically, you will have one layout for each activity. Main.xml is generated by default to correspond to the initial activity created by default Gives details like package, activity to be launched when app starts, permissions and intents – app configuration file of sorts Contains values specified as type, name and value. Can be of types other than string (say colors) Gives flexibility of configuring based on environment – one set for each environment Contains all the source code
AndroidManifest.xml Information for android to run your application like Package name / application name <manifest package= &quot;com.qwest.techfriday.android“  android:versionCode= &quot;1“  android:versionName= &quot;1.0&quot;> List of all components – activities, services etc. <activity android:name= &quot;.DemoViews&quot; android:label=&quot;@string/app_name&quot;> Identifies the activity which will be launched on app start <activity android:name= &quot;.QwestHome&quot; android:label=&quot;@string/app_name&quot;> <intent-filter> <action android:name= &quot;android.intent.action.MAIN&quot; /> <category android:name= &quot;android.intent.category.LAUNCHER&quot; /> </intent-filter> </activity> Permissions to access protected parts of the API and interact with other applications <uses-permission android:name= &quot;android.permission.INTERNET&quot; />  lists the libraries that the application must be linked against <uses-library android:name= &quot;com.google.android.maps&quot; /> http://developer.android.com/guide/topics/manifest/manifest-intro.html
UI concepts : View View – basic unit of UI expression Can be specified as XML in res/layout folder and then inflated in the activity setContentView(R.layout.alert); Can be dynamically created and added to activity – partly (from another layout) or fully (creating and adding controls) //We set a view to be shown on the page – this serves as outer shell setContentView(R.layout.materpage);  //To this shell, we inflate another view  which is present in another XML TableLayout tlContainer = (TableLayout) findViewById(R.id.containerForIndividualLayout); LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);  View itemView = inflater.inflate(R.layout.viewbill, null);  tlContainer.addView(itemView, new TableLayout.LayoutParams(  LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
UI Concepts : View Dynamically creating views and adding to layout View mainPanel = CreateView(); setContentView(R.layout. materpage);  TableLayout tlContainer = (TableLayout) findViewById(R.id. containerForIndividualLayout); tlContainer.addView(mainPanel); private ViewGroup CreateView()  { LinearLayout panel = new LinearLayout(this); panel.setLayoutParams(new LayoutParams(LayoutParams. FILL_PARENT, LayoutParams.FILL_PARENT)); panel.setOrientation(LinearLayout. VERTICAL); panel.setPadding(10, 0,0,0); panel.setBackgroundColor(Color. TRANSPARENT); TextView txtHeader = new TextView(getApplicationContext()); txtHeader.setText(&quot;Congratulations! You qualify for the following products.&quot;); txtHeader.setTextSize(20);
UI Concepts : Layout  Layout – type of layout architectures telling how the children are aligned LinearLayout : aligns all children in a single direction — vertically or horizontally RelativeLayout : child views specify their position relative to the parent view or to each other  TableLayout : positions its children into rows and columns FrameLayout : Blank space where children are pinned to top left corner http://developer.android.com/guide/topics/ui/layout-objects.html
UI Concepts: Widgets and events Inherit from android.widget Serves as an interface for interaction with the user Buttons, text views (editable / read only), date picker etc. Once View / Widgets defined, you want to know of user interactions – do use events Define an event listener and register it with the View btnAlert.setOnClickListener(this); OR alertDialog.setButton(&quot;Btn1&quot;, new DialogInterface.OnClickListener() {   public void onClick(DialogInterface dialog, int which) {   showToast(message + &quot;. You pressed Btn1 : &quot; + which, getApplicationContext());  View class gives multiple callback methods by default onClick / onLongClick / onFocusChange / onTouch etc. http://developer.android.com/guide/topics/ui/ui-events.html
UI Concepts: Options Menu This is shown when Menu button of phone is pressed Create a view under res/menu/ for look and feel Define appearance for the menu (onCreateOptionsMenu) either from view OR dynamically Respond to user selection (onOptionsItemSelected) For submenu, add menu as child to item in the view. http://developer.android.com/guide/topics/ui/menus.html
UI Concepts: Options Menu http://developer.android.com/guide/topics/ui/menus.html @Override public boolean onCreateOptionsMenu(Menu menu) {  MenuInflater inflater = getMenuInflater();  inflater.inflate(R.menu. main_menu, menu);  return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {  // Handle item selection  switch (item.getItemId())  {  case R.id. menu_item_alerts:  //todo return true;  case R.id. menu_item_views: //todo  return true;  default:  return super.onOptionsItemSelected(item);  } } resource main_menu is defined with items like :  <item android:id= &quot;@+id/menu_item_alerts&quot;  android:icon= &quot;@drawable/icon_menu_alert&quot;  android:title= &quot;Alerts Demo&quot; />
UI Concepts: Context Menu This is shown when a control is pressed for long Similar to the “right click” on PC Create it for any view Create a view under res/menu/ for look and feel Register that view for a context menu (registerForContextMenu) Define appearance for the menu (onCreateContextMenu) either from view OR dynamically Respond to user selection (onContextItemSelected)
UI Concepts: Context Menu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  super.onCreateContextMenu(menu, v, menuInfo);  MenuInflater inflater = getMenuInflater();  inflater.inflate(R.menu. context_menu, menu); } @Override public boolean onContextItemSelected(MenuItem item) {  AdapterContextMenuInfo  info = (AdapterContextMenuInfo) item.getMenuInfo();  switch (item.getItemId()) {  case R.id. ctx_menu_item_option_1:  showToast(&quot;context menu option 1 selected&quot;, getApplicationContext()); return true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState  setContentView(R.layout.alert); txtAlertName = (EditText)findViewById(R.id.txtAlertName); registerForContextMenu(txtAlertName);
UI Concepts: Alerts / Dialogs Toast AlertDialog ProgressDialog DatePickerDialog TimePickerDialog
UI Concepts: Alerts / Dialogs int duration = Toast. LENGTH_SHORT; Toast toast = Toast. makeText(appContext, message, duration); toast.show(); TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //TODO : When user selects time }}; TimePickerDialog timePicker = new TimePickerDialog(this,  mTimeSetListener, mHour, mMinute, true); timePicker.show(); DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //TODO : when user selects Date }}; DatePickerDialog datePicker = new DatePickerDialog(this,  mDateSetListener,  cyear, cmonth, cday); datePicker.show(); Toast DatePickerDialog TimePickerDialog
UI Concepts: Alerts / Dialogs ProgressDialog dialog = new ProgressDialog( DemoAlerts.this); dialog.setMessage(&quot;This is the content you want to show - like please wait while we fetch your account details...&quot;); dialog.setProgressStyle(ProgressDialog. STYLE_SPINNER); // dialog.setProgressStyle(ProgressDialog. STYLE_HORIZONTAL);// this gives progress bar dialog.show(); AlertDialog alertDialog = new AlertDialog.Builder(this).create(); alertDialog.setTitle(&quot;This is the title for the window&quot;); alertDialog.setMessage(&quot;The dialog message goes here. This can be any text and as per the length, it will wrap this.&quot;); alertDialog.setButton(&quot;Btn1&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {//TODO on button click } }); alertDialog.setButton2(&quot;Btn2&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {//TODO on button click } }); alertDialog.setButton3(&quot;Btn3&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {//TODO on button click } }); alertDialog.setIcon(R.drawable. icon); alertDialog.show(); ProgressDialog AlertDialog
UI Concepts: Status Bar Notification Primarily for services to notify the user Get a reference to the NotificationManager Instantiate the Notification Define the Notification's expanded message and Intent Pass the Notification to the NotificationManager http://developer.android.com/guide/topics/ui/notifiers/notifications.html
SESSION 2 : Agenda Quick recap of last session and any open questions Sensors Location based services Geocoding / reverse geocoding Maps Console  Testing ideas
Sensors SensorManager lets you access device sensors Like other system services, you need to get a reference to it getSystemService( SENSOR_SERVICE) Determine the sensor you want to listen to (accelerometer, orientation, temperature etc.) private static final int  sensorToListenFor = SensorManager.SENSOR_ORIENTATION; Since services work in a publish-subscribe mode, implement a listener and override the onSensorChanged One of the values you get is “ float[] values ” and this will contain values depending on the type of sensor you are listening to  http://developer.android.com/reference/android/hardware/SensorEvent.html#values Since sensors involve lot of processing to get the data, register and unregister to save battery and processing power http://developer.android.com/reference/android/hardware/SensorManager.html
Sensors Example - orientation Get an instance by calling Context.getSystemService sensorManager = (SensorManager)getSystemService( SENSOR_SERVICE); Determine the sensors you want to get data from private static final int  sensorToListenFor = SensorManager.SENSOR_ORIENTATION; Implement a listener and override onSensorChanged Register and unregister listener to this in the resume and pause http://developer.android.com/reference/android/hardware/SensorManager.html @Override public void onResume() / onPause() { super.onResume(); sensorManager.registerListener / unregisterListener (this,  sensorToListenFor); } public void onSensorChanged(int sensor, float[] values) { if(sensor ==  sensorToListenFor) { float azimuth = Math. round(values[0]); float pitch = Math. round(values[1]); float roll = Math. round(values[2]);
Sensors Example - orientation values[0]: Azimuth, angle between the magnetic north direction and the y-axis, around the z-axis (0 to 359). 0=North, 90=East, 180=South, 270=West  values[1]: Pitch, rotation around x-axis (-180 to 180), with positive values when the z-axis moves toward the y-axis.  values[2]: Roll, rotation around y-axis (-90 to 90), with positive values when the x-axis moves toward the z-axis.
Sensors - testing Almost all sensors require a physical device to test Emulator OR console DO NOT offer commands to simulate sensor values Few open source options like  http://code.google.com/p/openintents/wiki/SensorSimulator  which can simulate sensors
Sensor testing : snapshots from phone Azimuth around 0 – phone is pointing in the North direction Azimuth around 90 – phone is pointing in the East direction Azimuth around 180 – phone is pointing in the South direction Azimuth around 270 – phone is pointing in the West direction Pitch around 0 – phone is “lying flat” Pitch around -90 – phone is “standing”  Pitch around 90 – phone is “standing on its head” Roll around 0 – phone is “lying flat” Roll around -90 – phone is  “standing on its side”
Location Based Services Location services of the device are accessible through android.location LocationManager is a system service that provides APIs for access to device location There are multiple location providers (GPS, Network etc.) and we need to select the provider to use Request an instance of LocationManager  lm = (LocationManager)getSystemService(Context. LOCATION_SERVICE) Get last known location Location lastKnown = lm.getLastKnownLocation(LocationManager. GPS_PROVIDER) Add a hook to listen to location updates (implement LocationListener) lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener) Request permission in Manifest <uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /> http://developer.android.com/guide/topics/location/obtaining-user-location.html
Location Listener and Manager requestLocationUpdates provider: The name of the provider with which you register  minTime: The minimum time interval for notifications, in milliseconds.  minDistance: The minimum distance interval for notifications, in meters.  listener: An object whose onLocationChanged() method will be called for each location update.  LocationListener  onLocationChanged(Location location): This method is called when the location has changed.  onProviderDisabled(String provider): This method is called when the provider is disabled by the user.  onProviderEnabled(String provider): This method is called when the provider is enabled by the user.  onStatusChanged(String provider, int status, Bundle extras): This method is called when the provider status changes Location .getLatitude() and .getLongitude() used to get latitude and longitude http://www.devx.com/wireless/Article/39239/1954
Location : Testing Location can be sent as individual co-ordinate OR KML (refer to  http://code.google.com/apis/kml/documentation/kml_tut.html ) You can also use console are given in next slide To get a KML for a route, you can use a URL like below to get the path in KML format http://maps.google.co.in/maps?f=d&hl=en&saddr=12.958528,77.704747&daddr=12.93625,77.690073&ie=UTF8&0&om=0&output=kml
Location : Testing : Sending location from console Open console : telnet localhost <emulator number> telnet localhost 5554 Background : geocoding allows you to get geo location from an address If you try a URL like :  http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Glenarm+place,+Denver,+CO&sensor=true <geometry><location><lat>39.7442190</lat><lng>-104.9894830</lng></location> In applications that use device’s current location  we can test by sending different locations from console http://developer.android.com/guide/developing/devices/emulator.html
Geocoding Geocoding is the process of relating location and other geographic data like address, zip code etc Forward geocoding  also referred to as simply Geocoding Process of getting location from geographic data Using Google Map API WS, you can just enter a URL like below to get an XML (you can also get JSON by using  geocode/JSON?   instead of  geocode/xml?   http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Glenarm+place,+Denver,+CO&sensor=true Reverse geocoding Process of getting geographic data like Address / Postal Code from location Using Google Map API WS, you can use a URL like below to get the address in XML / JSON format. Note that this can be approximate match PLUS can return more than one address http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor= true_or_false   http://code.google.com/apis/maps/documentation/geocoding/index.html
Geocoding support in Android Geocoder has methods getFromLocation and getFromLocationName for forward and reverse geocode Geocoder geoCoder = new Geocoder(appContext , Locale. getDefault()); try { List<Address> addresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(), 10); for(Address currentAddress : addresses) { lblShowLocation.append(&quot;\n&quot; + currentAddress.getAddressLine(0)); } }  catch (IOException e) {e.printStackTrace(); } http://developer.android.com/reference/android/location/Geocoder.html try { List<Address> locations= geocoder.getFromLocationName(“1600 Glenarm Place, Denver, CO”, 10); for(Address currentLocation: locations) { lblShowLocation.append(&quot;\n&quot; + currentLocation .getLatitude()); } }  catch (IOException e) {e.printStackTrace(); }
Maps Google Maps is an external library Download the api (Requires Android SDK 1.5 or above) http://code.google.com/android/add-ons/google-apis/installing.html Register api key  http://code.google.com/android/add-ons/google-apis/mapkey.html MapView  is the Map View control MapActivity  is the base class you extend in your activity Overlay  is used to annotate your maps You can use a canvas to draw MapController  used to center location, zoom etc. ItemizedOverlays  and  OverlayItems  used to create layer of map markers http://developer.android.com/guide/tutorials/views/hello-mapview.html
Maps : register API key Run the following to get your MD5 cert keytool -list -alias androiddebugkey -keystore <path_to_debug_keystore>.keystore -storepass android -keypass android Goto :  http://code.google.com/android/maps-api-signup.html Enter the MD5 signature Use the key in MapView C:\>keytool -list -alias androiddebugkey -keystore &quot;C:\Documents and Settings\gxkumar\.android\debug.keystore&quot; -storepass android -keypass android androiddebugkey, Jun 22, 2011, PrivateKeyEntry, Certificate fingerprint (MD5):  32:E4:29:6C:2B:98:9C:33:41:5F:7F:43:CA:04:C7:33 http://code.google.com/android/add-ons/google-apis/mapkey.html
Maps : how to show map? Create activity that extends MapActivity isRouteDisplayed needs to be overridden mandatorily Add MapView to your layout along with the apiKey <com.google.android.maps.MapView  … android:apiKey= “Maps_ApiKey_String“/> Add uses-library to manifest <uses-library android:name=&quot;com.google.android.maps&quot; />  Add permission to manifest <uses-permission android:name=&quot;android.permission.INTERNET&quot; /> When location changes, the map will NOT center to it by default. We need to handle that via MapController.setCenter(GeoPoint point) http://developer.android.com/guide/tutorials/views/hello-mapview.html
Maps : respond to location update To add zoom controls: mapView = (MapView)findViewById(R.id. mapview); mapView.setBuiltInZoomControls(true);  To show the location on map In the onCreate method  : MapController mc = mapView.getController(); In listener :  public void onLocationChanged(Location loc) { … … GeoPoint p = new GeoPoint( (int) (loc.getLatitude() * 1E6),  (int) (loc.getLongitude() * 1E6)); mc.animateTo(p); mc.setZoom(13); To set view of map mapView.setSatellite(true); mapView.setStreetView(true); http://mobiforge.com/developing/story/using-google-maps-android
Maps : overlays Overlays are layers added one over other on top of map They are inherently transparent Mostly used to add markers / draw on the map Overlay is providing a canvas to draw on Two options to ad overlays to map Implement a class that extends Overlay Override draw method to allow you to draw on the canvas Use projections to translate geo points to canvas points Override onTap to do some action when a geo point is tapped by the user Implement a class that extends ItemizedOverlay<OverlayItem> Each overlay item is defined by GeoPoint, Text and Snippet Override draw to allow to draw on canvas – say connect locations
Maps : add marker Add Markers //get the overlays and clear it List<Overlay> mapOverlays = mapView.getOverlays(); mapOverlays.clear(); //first we need to define the  drawable using one of the icons Drawable drawable = this.getResources().getDrawable(R.drawable. icon_map_marker); //initialize the itemized overlay using the current marker CustomItemizedOverlay mapOverlay = new CustomItemizedOverlay(drawable); GeoPoint point = new GeoPoint((int) (( loc.getLatitude())  * 1E6), (int) ((loc.getLongitude())  * 1E6)); OverlayItem overlayitem = new OverlayItem(point, &quot;title&quot;, &quot;snippet&quot;); mapOverlay.addOverlay(overlayitem);  mapOverlays.add(mapOverlay);  mapView.invalidate(); class CustomItemizedOverlay extends ItemizedOverlay
Maps : keep adding markers public void AddLocationToMap(Location loc) {  //get the overlays and clear it List<Overlay> mapOverlays = mapView.getOverlays(); mapOverlays.clear();  GeoPoint point = new GeoPoint((int) (( loc.getLatitude())  * 1E6),  (int) ((loc.getLongitude())  * 1E6)); String addressForPoint =  &quot;&quot;; addressForPoint = GetAddressFromPoint(point, getApplicationContext()); lblAddress.setText(addressForPoint); //create an overlay items OverlayItem overlayitem = new OverlayItem(point, &quot;Address : &quot;  + addressForPoint, &quot;snippet&quot;); //add it to the our customized overlay item list itemizedOverlay.addOverlay(overlayitem);  //add the current list to mapOverlays mapOverlays.add(itemizedOverlay);  //invalidate will force to redraw the map mapView.invalidate(); }
Caution while listening for location change This is the screen capture from my cell after 500m of walking.  Current setting was “locationManager.requestLocationUpdates(LocationManager. GPS_PROVIDER , 1000, 1” Also keep in mind that the location fixed by GPS can keep varying so be sure you are not using less accurate points Depending on your application’s need, alter the frequency of check and distance change when listener should report a change. Remember – GPS will consume battery and data so use it wisely
Maps : sample app for tracking your path Few key things to note Since the app used to un-register from Location Listening onPause, the area where cell phone screen was off – there were no locations captured So depending on your app, decide whether you want to listen always or not Frequency of listening is very critical Listen more frequently – and you end up showing lot of points Listen less frequently and your path is not plotted correctly
INSTALL / TEST ON AVD
Installing and running the app The executable is a .APK file which can be installed on device or run on emulator SDK includes a virtual mobile device emulator Create AVD with required configuration and run on emulator Controls in emulator for most functionality. Each emulator instance provides a control console the you can connect to, to issue commands that are specific to that instance. http://developer.android.com/guide/developing/devices/emulator.html
Install APK to AVD Ensure that AVD is created and emulator is running Place .apk file in /tools folder on SDK On the command prompt, goto android SDK /tools folder:  adb install my_android_app.apk The apk file can be located anywhere – you just need the path when running this command Once this is complete, you can see the app installed in your home / app  http://www.android.pk/blog/general/how-to-install-apk-files-on-android-emulator/
Console Each running emulator instance includes a console facility that lets you dynamically query and control the simulated device environment telnet localhost <console-port>. Console Port starts with 5554 Once console is launched, you can use commands to send events, location change etc to the device http://developer.android.com/guide/developing/devices/emulator.html
Example : Sending geocode from console Background : geocoding allows you to get geo location from an address If you try a URL like :  http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Glenarm+place,+Denver,+CO&sensor=true <geometry><location><lat>39.7442190</lat><lng>-104.9894830</lng></location> In applications that use device’s current location, we can test by sending different locations from console http://developer.android.com/guide/developing/devices/emulator.html
Available console commands
IDEAS FOR TESTING
Mobile testing types Functional Testing : basic functionality of app is working Emulator testing will cover this Usability Testing : after stable basic app is ready Say scrolling to bottom of screen is not easy in non-touch devices Performance Testing : across devices, carriers, location http://c0954852.cdn.cloudfiles.rackspacecloud.com/uTest_eBook_Mobile_Testing.pdf
Mobile testing methods Emulator / Simulator In House : setup lab Out sourcing : Device ready :  http://www.deviceready.com/test-android-apps-on-multiple-devices/ Droid Cloud :  http://www.perfectomobile.com/portal/cms/android.html uTest : http://www.utest.com/android-app-testing
Ideas for Testing When launching emulator / creating AVD, we can select resolution – try to test on multiple resolutions / screen sizes android create avd -n <name> -t <targetID> --skin WVGA800 If you were launching from Eclipse, you can select as shown If you launch SDK Manager, you can add new AVD from there and select the resolution http://developer.android.com/guide/developing/devices/managing-avds-cmdline.html
Ideas for testing Flow of application  Screen transitions – upon clicks / slide if permitted When doing processing, does it show a progress bar? Is it responsive? Simulate a call when app is running to see if it hangs http://developer.android.com/guide/topics/testing/what_to_test.html
Ideas for testing Orientation change To ensure that the app responds well in both orientation CTRL+F11 / F12
References http://en.wikipedia.org/wiki/Android_(operating_system) http://www.android.com/ http://developer.android.com/index.html http://developer.android.com/guide/developing/devices/index.html http://developer.android.com/guide/developing/devices/emulator.html http://www.android.pk/blog/general/how-to-install-apk-files-on-android-emulator/ http://developer.android.com/guide/developing/testing/index.html http://developer.android.com/guide/topics/testing/what_to_test.html http://developer.android.com/sdk/installing.html http://en.wikipedia.org/wiki/Dalvik_%28software%29 http://code.google.com/p/robotium/  : Robotium is a test framework created to make it easy to write powerful and robust automatic black-box test cases for Android applications. With the support of Robotium, test case developers can write function, system and acceptance test scenarios, spanning multiple Android activities.  http://c0954852.cdn.cloudfiles.rackspacecloud.com/uTest_eBook_Mobile_Testing.pdf
Q and A ?
Thank You   [email_address] [email_address]

Getting started with android dev and test perspective

  • 1.
    Getting started with Gunjan Kumar
  • 2.
    Agenda Overview ofAndroid Features and Architecture Setup for development (SDK, ADT) Android Virtual Device Installing, using and installing applications Developing Android applications Install / test on AVD Ideas for testing
  • 3.
  • 4.
    Overview Android isa software stack for mobile devices that includes an operating system, middleware and key applications Based on the Linux kernel Open Handset Alliance collaborated on Android's development and release More than 33% of market share today. 3.1 Honeycomb for Tablet and 2.3.4 Gingerbread for Phones App market with 200000+ apps, >3 billion downloads http://en.wikipedia.org/wiki/Android_%28operating_system%29
  • 5.
    History Android Incfounded in 2003 by Andy Rubin and other members. Google acquired Android in August 2005. Open Handset Alliance formed on 5 November 2007 to develop open standards for mobile devices. Android unveiled as OHA’s first product. Updates launched to fix bugs / add new features The code names are in alphabetical order (Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, and the upcoming Ice Cream Sandwich).
  • 6.
    Version history http://en.wikipedia.org/wiki/Android_version_historyVersion Name Release Date Beta 5 November 2007 1.0 23 September 2008 Android Market, Google account integration, maps … 1.1 9 February 2009 resolved issues, API changes … 1.5 Cupcake 30 April 2009 Widgets, upload to YouTube and Picasa … 1.6 Donut 15 September 2009 WVGA / CDMA support, Google navigation, Search enhancement … 2.0/2.1 Éclair 26 October 2009 / 12 January 2010 Live wallpaper, multiple screen resolutions, Camera flash … 2.2 Froyo 20 May 2010 Chrome’s V8 JavaScript engine, upload file in browser … 2.3 Gingerbread 6 December 2010 Voice and Video support in Gtalk … 3.0 / 3.1 Honeycomb 22 February 2011 / 10 May 2011 Released for tablets Ice Cream Sandwich Q4 2011 combination of Gingerbread and Honeycomb into a &quot;cohesive whole&quot;
  • 7.
    Usage share /Market Share Source Year Symbian Android RIM iOS Microsoft Other OSs Gartner 2011 Q1 27.4% 36.0% 12.9% 16.8% 3.6% 3.3% Gartner 2010 37.6% 22.7% 16.0% 15.7% 4.2% 3.8% Gartner 2009 46.9% 3.9% 19.9% 14.4% 8.7% 6.1% Gartner 2008 52.4% 0.5% 16.6% 8.2% 11.8% 10.5% Gartner 2007 63.5% N/A 9.6% 2.7% 12.0% 12.1%
  • 8.
    Features Application frameworkenabling reuse and replacement of components Dalvik virtual machine optimized for mobile devices Integrated browser based on the open source WebKit engine Optimized graphics powered by a custom 2D graphics library; 3D graphics based on the OpenGL ES 1.0 specification (hardware acceleration optional) SQLite for structured data storage Media support for common audio, video, and still image formats (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) GSM Telephony (hardware dependent) Bluetooth, EDGE, 3G, and WiFi (hardware dependent) Camera, GPS, compass, and accelerometer (hardware dependent) Rich development environment including a device emulator, tools for debugging, memory and performance profiling, and a plugin for the Eclipse IDE http://developer.android.com/guide/basics/what-is-android.html
  • 9.
  • 10.
  • 11.
    App development overviewAn open development platform, Android offers developers the ability to build extremely rich and innovative applications Underlying all applications is a set of services and systems, including: A rich and extensible set of Views that can be used to build an application, including lists, grids, text boxes, buttons, and even an embeddable web browser Content Providers that enable applications to access data from other applications (such as Contacts), or to share their own data A Resource Manager, providing access to non-code resources such as localized strings, graphics, and layout files A Notification Manager that enables all applications to display custom alerts in the status bar An Activity Manager that manages the lifecycle of applications and provides a common navigation backstack
  • 12.
    App development :options http://appinventor.googlelabs.com/about/ SDK provided so you can use command line or IDE for app development Eclipse based development for more elaborate development SDK + ADT (Android Developer Tool) Set up Android Virtual Devices or hardware devices. Create an Android project. Build and run your application. Debug your application with the SDK debugging and logging tools. Test your application with the Testing and Instrumentation framework .
  • 13.
    Step 1 :Install SDK System requirement : http://developer.android.com/sdk/requirements.html So ensure you have JDK installed before you move to SDK installation Download from http://developer.android.com/sdk/index.html Launch SDK Manager from the downloaded file to install platforms http://developer.android.com/sdk/installing.html
  • 14.
    Step 1 :Install SDK- tips Ensure that JDK is installed. http://java.sun.com/javase/downloads/index.jsp Once JDK is installed, you can either use Installer or download ZIP for Android SDK http://developer.android.com/sdk/index.html Once SDK is installed, you will see a SDK Manager executable in the folder. Launch this to download platforms that will get added to the platforms folder In office, you may have issues downloading from https so in the SDK manager, goto settings and check on the “ force HTTPS to be fetched as HTTP ” checkbox If that doesn’t work out as well, try setting a proxy (say proxy-ne7.qintra.com port 8888 ) Alternatively, you can copy this folder from any existing installation
  • 15.
    Step 2 :Eclipse plug-in – Why? ADT (Android Developer Tool) plug-in for Eclipse simplifies development in Eclipse by providing Android Project Wizard helps create new project Forms-based manifest, layout and resource editor Building, conversion to .DEX (Android Executable), package to .APK and install to Dalvik VM is automated AVD manager integrated with Eclipse for easy access to AVDs DDMS (Dalvik Debug Monitoring Services) assists in monitoring Debugging, breakpoints Log and console outputs
  • 16.
    Step 2 :Eclipse plug-in : How? Help  Install new software Add the following URL http://dl.google.com/android/eclipse Select all from the Developer Tools Restart and update ADT Preference Window  Preference Mention the SDK Location
  • 17.
  • 18.
  • 19.
    Create AVD andlaunch Emulator (command line) Android Virtual Device (AVD) is an emulator configuration that lets you model an actual device by defining hardware and software options to be emulated by the Android Emulator. See list of targets : android list targets id: 2 or &quot;android-4&quot;      Name: Android 1.6      Type: Platform      API level: 4      Revision: 3      Skins: QVGA, HVGA (default), WVGA800, WVGA854 Create AVD : android create avd -n my_avd -t 2 Run Emulator : emulator -avd <avd_name> http://developer.android.com/guide/developing/devices/managing-avds-cmdline.html http://developer.android.com/guide/developing/tools/emulator.html
  • 20.
    Create AVD fromSDK Manager
  • 21.
  • 22.
    Specifying details forAVD SD Card must be at least 9MB or left blank Skin allows to choose resolution / form factor for the device you want to emulate Name the device and select the target (the version of Platform that you want to emulate. Note that the list will be pulled out from the list of platforms you have installed on your machine (you can see in <sdk>\ platforms folder)
  • 23.
  • 24.
  • 25.
    Activities Presentation layerActivity is a screen – only one gets user inputs at a time An application can have more than one activities, each being a screen that the app can show to the user Each activity extends android.app.Activity onCreate method is overridden to create or set the view – the actual layout of controls on the screen
  • 26.
    Services Run inbackground, with no visible UI Extend Service class Typically used to develop services that need to be running even if the screen is closed
  • 27.
    Intent Message passingmechanism within and between applications Used for Starting a service or activity Broadcast that an event has occurred – Android broadcasts intents for system events like “incoming phone call” Declare your intent that an activity be started to perform an action with some data Intent browserIntent = new Intent(Intent. ACTION_VIEW, Uri.parse(URL)); startActivity(browserIntent); Intent callIntent = new Intent(Intent. ACTION_CALL); callIntent.setData(Uri. parse(&quot;tel:&quot; + PhoneNumber)); startActivity(callIntent); void OpenHome(){ Intent myIntent = new Intent(QwestAvailabilityDetails.this, QwestHome.class); startActivity(myIntent); }
  • 28.
    Content Provider Shareabledata sources Native content stores exposed by Android – media store, contacts, call logs etc.
  • 29.
    Create new appSpecify the project name as it should appear in your workspace Specify the target platform – depending on the device you are expecting this to run on Application Name – as will appear on the device Create Activity – the first activity that will be launched when app starts
  • 30.
    What is generated?Named as the Create Activity specified when creating the app, this extends android.app.Activity and serves as the “screen” that is shown to the user Auto generated file. DON’T MANIPULATE. Contains reference to all resources. Used in activities to access the resources Contains resources – layouts, images, values to be used in app – referenced via R Contains the icon which will be used on device for your app. Any more images that you use in the app must be added here. Add versions based on resolution to each of the folders Layouts specify the screens look and feel – think of it as HTML. Typically, you will have one layout for each activity. Main.xml is generated by default to correspond to the initial activity created by default Gives details like package, activity to be launched when app starts, permissions and intents – app configuration file of sorts Contains values specified as type, name and value. Can be of types other than string (say colors) Gives flexibility of configuring based on environment – one set for each environment Contains all the source code
  • 31.
    AndroidManifest.xml Information forandroid to run your application like Package name / application name <manifest package= &quot;com.qwest.techfriday.android“ android:versionCode= &quot;1“ android:versionName= &quot;1.0&quot;> List of all components – activities, services etc. <activity android:name= &quot;.DemoViews&quot; android:label=&quot;@string/app_name&quot;> Identifies the activity which will be launched on app start <activity android:name= &quot;.QwestHome&quot; android:label=&quot;@string/app_name&quot;> <intent-filter> <action android:name= &quot;android.intent.action.MAIN&quot; /> <category android:name= &quot;android.intent.category.LAUNCHER&quot; /> </intent-filter> </activity> Permissions to access protected parts of the API and interact with other applications <uses-permission android:name= &quot;android.permission.INTERNET&quot; /> lists the libraries that the application must be linked against <uses-library android:name= &quot;com.google.android.maps&quot; /> http://developer.android.com/guide/topics/manifest/manifest-intro.html
  • 32.
    UI concepts :View View – basic unit of UI expression Can be specified as XML in res/layout folder and then inflated in the activity setContentView(R.layout.alert); Can be dynamically created and added to activity – partly (from another layout) or fully (creating and adding controls) //We set a view to be shown on the page – this serves as outer shell setContentView(R.layout.materpage); //To this shell, we inflate another view which is present in another XML TableLayout tlContainer = (TableLayout) findViewById(R.id.containerForIndividualLayout); LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); View itemView = inflater.inflate(R.layout.viewbill, null); tlContainer.addView(itemView, new TableLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  • 33.
    UI Concepts :View Dynamically creating views and adding to layout View mainPanel = CreateView(); setContentView(R.layout. materpage); TableLayout tlContainer = (TableLayout) findViewById(R.id. containerForIndividualLayout); tlContainer.addView(mainPanel); private ViewGroup CreateView() { LinearLayout panel = new LinearLayout(this); panel.setLayoutParams(new LayoutParams(LayoutParams. FILL_PARENT, LayoutParams.FILL_PARENT)); panel.setOrientation(LinearLayout. VERTICAL); panel.setPadding(10, 0,0,0); panel.setBackgroundColor(Color. TRANSPARENT); TextView txtHeader = new TextView(getApplicationContext()); txtHeader.setText(&quot;Congratulations! You qualify for the following products.&quot;); txtHeader.setTextSize(20);
  • 34.
    UI Concepts :Layout Layout – type of layout architectures telling how the children are aligned LinearLayout : aligns all children in a single direction — vertically or horizontally RelativeLayout : child views specify their position relative to the parent view or to each other TableLayout : positions its children into rows and columns FrameLayout : Blank space where children are pinned to top left corner http://developer.android.com/guide/topics/ui/layout-objects.html
  • 35.
    UI Concepts: Widgetsand events Inherit from android.widget Serves as an interface for interaction with the user Buttons, text views (editable / read only), date picker etc. Once View / Widgets defined, you want to know of user interactions – do use events Define an event listener and register it with the View btnAlert.setOnClickListener(this); OR alertDialog.setButton(&quot;Btn1&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { showToast(message + &quot;. You pressed Btn1 : &quot; + which, getApplicationContext()); View class gives multiple callback methods by default onClick / onLongClick / onFocusChange / onTouch etc. http://developer.android.com/guide/topics/ui/ui-events.html
  • 36.
    UI Concepts: OptionsMenu This is shown when Menu button of phone is pressed Create a view under res/menu/ for look and feel Define appearance for the menu (onCreateOptionsMenu) either from view OR dynamically Respond to user selection (onOptionsItemSelected) For submenu, add menu as child to item in the view. http://developer.android.com/guide/topics/ui/menus.html
  • 37.
    UI Concepts: OptionsMenu http://developer.android.com/guide/topics/ui/menus.html @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu. main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id. menu_item_alerts: //todo return true; case R.id. menu_item_views: //todo return true; default: return super.onOptionsItemSelected(item); } } resource main_menu is defined with items like : <item android:id= &quot;@+id/menu_item_alerts&quot; android:icon= &quot;@drawable/icon_menu_alert&quot; android:title= &quot;Alerts Demo&quot; />
  • 38.
    UI Concepts: ContextMenu This is shown when a control is pressed for long Similar to the “right click” on PC Create it for any view Create a view under res/menu/ for look and feel Register that view for a context menu (registerForContextMenu) Define appearance for the menu (onCreateContextMenu) either from view OR dynamically Respond to user selection (onContextItemSelected)
  • 39.
    UI Concepts: ContextMenu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu. context_menu, menu); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id. ctx_menu_item_option_1: showToast(&quot;context menu option 1 selected&quot;, getApplicationContext()); return true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState setContentView(R.layout.alert); txtAlertName = (EditText)findViewById(R.id.txtAlertName); registerForContextMenu(txtAlertName);
  • 40.
    UI Concepts: Alerts/ Dialogs Toast AlertDialog ProgressDialog DatePickerDialog TimePickerDialog
  • 41.
    UI Concepts: Alerts/ Dialogs int duration = Toast. LENGTH_SHORT; Toast toast = Toast. makeText(appContext, message, duration); toast.show(); TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //TODO : When user selects time }}; TimePickerDialog timePicker = new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, true); timePicker.show(); DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //TODO : when user selects Date }}; DatePickerDialog datePicker = new DatePickerDialog(this, mDateSetListener, cyear, cmonth, cday); datePicker.show(); Toast DatePickerDialog TimePickerDialog
  • 42.
    UI Concepts: Alerts/ Dialogs ProgressDialog dialog = new ProgressDialog( DemoAlerts.this); dialog.setMessage(&quot;This is the content you want to show - like please wait while we fetch your account details...&quot;); dialog.setProgressStyle(ProgressDialog. STYLE_SPINNER); // dialog.setProgressStyle(ProgressDialog. STYLE_HORIZONTAL);// this gives progress bar dialog.show(); AlertDialog alertDialog = new AlertDialog.Builder(this).create(); alertDialog.setTitle(&quot;This is the title for the window&quot;); alertDialog.setMessage(&quot;The dialog message goes here. This can be any text and as per the length, it will wrap this.&quot;); alertDialog.setButton(&quot;Btn1&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {//TODO on button click } }); alertDialog.setButton2(&quot;Btn2&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {//TODO on button click } }); alertDialog.setButton3(&quot;Btn3&quot;, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {//TODO on button click } }); alertDialog.setIcon(R.drawable. icon); alertDialog.show(); ProgressDialog AlertDialog
  • 43.
    UI Concepts: StatusBar Notification Primarily for services to notify the user Get a reference to the NotificationManager Instantiate the Notification Define the Notification's expanded message and Intent Pass the Notification to the NotificationManager http://developer.android.com/guide/topics/ui/notifiers/notifications.html
  • 44.
    SESSION 2 :Agenda Quick recap of last session and any open questions Sensors Location based services Geocoding / reverse geocoding Maps Console Testing ideas
  • 45.
    Sensors SensorManager letsyou access device sensors Like other system services, you need to get a reference to it getSystemService( SENSOR_SERVICE) Determine the sensor you want to listen to (accelerometer, orientation, temperature etc.) private static final int sensorToListenFor = SensorManager.SENSOR_ORIENTATION; Since services work in a publish-subscribe mode, implement a listener and override the onSensorChanged One of the values you get is “ float[] values ” and this will contain values depending on the type of sensor you are listening to http://developer.android.com/reference/android/hardware/SensorEvent.html#values Since sensors involve lot of processing to get the data, register and unregister to save battery and processing power http://developer.android.com/reference/android/hardware/SensorManager.html
  • 46.
    Sensors Example -orientation Get an instance by calling Context.getSystemService sensorManager = (SensorManager)getSystemService( SENSOR_SERVICE); Determine the sensors you want to get data from private static final int sensorToListenFor = SensorManager.SENSOR_ORIENTATION; Implement a listener and override onSensorChanged Register and unregister listener to this in the resume and pause http://developer.android.com/reference/android/hardware/SensorManager.html @Override public void onResume() / onPause() { super.onResume(); sensorManager.registerListener / unregisterListener (this, sensorToListenFor); } public void onSensorChanged(int sensor, float[] values) { if(sensor == sensorToListenFor) { float azimuth = Math. round(values[0]); float pitch = Math. round(values[1]); float roll = Math. round(values[2]);
  • 47.
    Sensors Example -orientation values[0]: Azimuth, angle between the magnetic north direction and the y-axis, around the z-axis (0 to 359). 0=North, 90=East, 180=South, 270=West values[1]: Pitch, rotation around x-axis (-180 to 180), with positive values when the z-axis moves toward the y-axis. values[2]: Roll, rotation around y-axis (-90 to 90), with positive values when the x-axis moves toward the z-axis.
  • 48.
    Sensors - testingAlmost all sensors require a physical device to test Emulator OR console DO NOT offer commands to simulate sensor values Few open source options like http://code.google.com/p/openintents/wiki/SensorSimulator which can simulate sensors
  • 49.
    Sensor testing :snapshots from phone Azimuth around 0 – phone is pointing in the North direction Azimuth around 90 – phone is pointing in the East direction Azimuth around 180 – phone is pointing in the South direction Azimuth around 270 – phone is pointing in the West direction Pitch around 0 – phone is “lying flat” Pitch around -90 – phone is “standing” Pitch around 90 – phone is “standing on its head” Roll around 0 – phone is “lying flat” Roll around -90 – phone is “standing on its side”
  • 50.
    Location Based ServicesLocation services of the device are accessible through android.location LocationManager is a system service that provides APIs for access to device location There are multiple location providers (GPS, Network etc.) and we need to select the provider to use Request an instance of LocationManager lm = (LocationManager)getSystemService(Context. LOCATION_SERVICE) Get last known location Location lastKnown = lm.getLastKnownLocation(LocationManager. GPS_PROVIDER) Add a hook to listen to location updates (implement LocationListener) lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener) Request permission in Manifest <uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /> http://developer.android.com/guide/topics/location/obtaining-user-location.html
  • 51.
    Location Listener andManager requestLocationUpdates provider: The name of the provider with which you register minTime: The minimum time interval for notifications, in milliseconds. minDistance: The minimum distance interval for notifications, in meters. listener: An object whose onLocationChanged() method will be called for each location update. LocationListener onLocationChanged(Location location): This method is called when the location has changed. onProviderDisabled(String provider): This method is called when the provider is disabled by the user. onProviderEnabled(String provider): This method is called when the provider is enabled by the user. onStatusChanged(String provider, int status, Bundle extras): This method is called when the provider status changes Location .getLatitude() and .getLongitude() used to get latitude and longitude http://www.devx.com/wireless/Article/39239/1954
  • 52.
    Location : TestingLocation can be sent as individual co-ordinate OR KML (refer to http://code.google.com/apis/kml/documentation/kml_tut.html ) You can also use console are given in next slide To get a KML for a route, you can use a URL like below to get the path in KML format http://maps.google.co.in/maps?f=d&hl=en&saddr=12.958528,77.704747&daddr=12.93625,77.690073&ie=UTF8&0&om=0&output=kml
  • 53.
    Location : Testing: Sending location from console Open console : telnet localhost <emulator number> telnet localhost 5554 Background : geocoding allows you to get geo location from an address If you try a URL like : http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Glenarm+place,+Denver,+CO&sensor=true <geometry><location><lat>39.7442190</lat><lng>-104.9894830</lng></location> In applications that use device’s current location we can test by sending different locations from console http://developer.android.com/guide/developing/devices/emulator.html
  • 54.
    Geocoding Geocoding isthe process of relating location and other geographic data like address, zip code etc Forward geocoding also referred to as simply Geocoding Process of getting location from geographic data Using Google Map API WS, you can just enter a URL like below to get an XML (you can also get JSON by using geocode/JSON? instead of geocode/xml? http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Glenarm+place,+Denver,+CO&sensor=true Reverse geocoding Process of getting geographic data like Address / Postal Code from location Using Google Map API WS, you can use a URL like below to get the address in XML / JSON format. Note that this can be approximate match PLUS can return more than one address http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor= true_or_false http://code.google.com/apis/maps/documentation/geocoding/index.html
  • 55.
    Geocoding support inAndroid Geocoder has methods getFromLocation and getFromLocationName for forward and reverse geocode Geocoder geoCoder = new Geocoder(appContext , Locale. getDefault()); try { List<Address> addresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(), 10); for(Address currentAddress : addresses) { lblShowLocation.append(&quot;\n&quot; + currentAddress.getAddressLine(0)); } } catch (IOException e) {e.printStackTrace(); } http://developer.android.com/reference/android/location/Geocoder.html try { List<Address> locations= geocoder.getFromLocationName(“1600 Glenarm Place, Denver, CO”, 10); for(Address currentLocation: locations) { lblShowLocation.append(&quot;\n&quot; + currentLocation .getLatitude()); } } catch (IOException e) {e.printStackTrace(); }
  • 56.
    Maps Google Mapsis an external library Download the api (Requires Android SDK 1.5 or above) http://code.google.com/android/add-ons/google-apis/installing.html Register api key http://code.google.com/android/add-ons/google-apis/mapkey.html MapView is the Map View control MapActivity is the base class you extend in your activity Overlay is used to annotate your maps You can use a canvas to draw MapController used to center location, zoom etc. ItemizedOverlays and OverlayItems used to create layer of map markers http://developer.android.com/guide/tutorials/views/hello-mapview.html
  • 57.
    Maps : registerAPI key Run the following to get your MD5 cert keytool -list -alias androiddebugkey -keystore <path_to_debug_keystore>.keystore -storepass android -keypass android Goto : http://code.google.com/android/maps-api-signup.html Enter the MD5 signature Use the key in MapView C:\>keytool -list -alias androiddebugkey -keystore &quot;C:\Documents and Settings\gxkumar\.android\debug.keystore&quot; -storepass android -keypass android androiddebugkey, Jun 22, 2011, PrivateKeyEntry, Certificate fingerprint (MD5): 32:E4:29:6C:2B:98:9C:33:41:5F:7F:43:CA:04:C7:33 http://code.google.com/android/add-ons/google-apis/mapkey.html
  • 58.
    Maps : howto show map? Create activity that extends MapActivity isRouteDisplayed needs to be overridden mandatorily Add MapView to your layout along with the apiKey <com.google.android.maps.MapView … android:apiKey= “Maps_ApiKey_String“/> Add uses-library to manifest <uses-library android:name=&quot;com.google.android.maps&quot; /> Add permission to manifest <uses-permission android:name=&quot;android.permission.INTERNET&quot; /> When location changes, the map will NOT center to it by default. We need to handle that via MapController.setCenter(GeoPoint point) http://developer.android.com/guide/tutorials/views/hello-mapview.html
  • 59.
    Maps : respondto location update To add zoom controls: mapView = (MapView)findViewById(R.id. mapview); mapView.setBuiltInZoomControls(true); To show the location on map In the onCreate method : MapController mc = mapView.getController(); In listener : public void onLocationChanged(Location loc) { … … GeoPoint p = new GeoPoint( (int) (loc.getLatitude() * 1E6), (int) (loc.getLongitude() * 1E6)); mc.animateTo(p); mc.setZoom(13); To set view of map mapView.setSatellite(true); mapView.setStreetView(true); http://mobiforge.com/developing/story/using-google-maps-android
  • 60.
    Maps : overlaysOverlays are layers added one over other on top of map They are inherently transparent Mostly used to add markers / draw on the map Overlay is providing a canvas to draw on Two options to ad overlays to map Implement a class that extends Overlay Override draw method to allow you to draw on the canvas Use projections to translate geo points to canvas points Override onTap to do some action when a geo point is tapped by the user Implement a class that extends ItemizedOverlay<OverlayItem> Each overlay item is defined by GeoPoint, Text and Snippet Override draw to allow to draw on canvas – say connect locations
  • 61.
    Maps : addmarker Add Markers //get the overlays and clear it List<Overlay> mapOverlays = mapView.getOverlays(); mapOverlays.clear(); //first we need to define the drawable using one of the icons Drawable drawable = this.getResources().getDrawable(R.drawable. icon_map_marker); //initialize the itemized overlay using the current marker CustomItemizedOverlay mapOverlay = new CustomItemizedOverlay(drawable); GeoPoint point = new GeoPoint((int) (( loc.getLatitude()) * 1E6), (int) ((loc.getLongitude()) * 1E6)); OverlayItem overlayitem = new OverlayItem(point, &quot;title&quot;, &quot;snippet&quot;); mapOverlay.addOverlay(overlayitem); mapOverlays.add(mapOverlay); mapView.invalidate(); class CustomItemizedOverlay extends ItemizedOverlay
  • 62.
    Maps : keepadding markers public void AddLocationToMap(Location loc) { //get the overlays and clear it List<Overlay> mapOverlays = mapView.getOverlays(); mapOverlays.clear(); GeoPoint point = new GeoPoint((int) (( loc.getLatitude()) * 1E6), (int) ((loc.getLongitude()) * 1E6)); String addressForPoint = &quot;&quot;; addressForPoint = GetAddressFromPoint(point, getApplicationContext()); lblAddress.setText(addressForPoint); //create an overlay items OverlayItem overlayitem = new OverlayItem(point, &quot;Address : &quot; + addressForPoint, &quot;snippet&quot;); //add it to the our customized overlay item list itemizedOverlay.addOverlay(overlayitem); //add the current list to mapOverlays mapOverlays.add(itemizedOverlay); //invalidate will force to redraw the map mapView.invalidate(); }
  • 63.
    Caution while listeningfor location change This is the screen capture from my cell after 500m of walking. Current setting was “locationManager.requestLocationUpdates(LocationManager. GPS_PROVIDER , 1000, 1” Also keep in mind that the location fixed by GPS can keep varying so be sure you are not using less accurate points Depending on your application’s need, alter the frequency of check and distance change when listener should report a change. Remember – GPS will consume battery and data so use it wisely
  • 64.
    Maps : sampleapp for tracking your path Few key things to note Since the app used to un-register from Location Listening onPause, the area where cell phone screen was off – there were no locations captured So depending on your app, decide whether you want to listen always or not Frequency of listening is very critical Listen more frequently – and you end up showing lot of points Listen less frequently and your path is not plotted correctly
  • 65.
  • 66.
    Installing and runningthe app The executable is a .APK file which can be installed on device or run on emulator SDK includes a virtual mobile device emulator Create AVD with required configuration and run on emulator Controls in emulator for most functionality. Each emulator instance provides a control console the you can connect to, to issue commands that are specific to that instance. http://developer.android.com/guide/developing/devices/emulator.html
  • 67.
    Install APK toAVD Ensure that AVD is created and emulator is running Place .apk file in /tools folder on SDK On the command prompt, goto android SDK /tools folder: adb install my_android_app.apk The apk file can be located anywhere – you just need the path when running this command Once this is complete, you can see the app installed in your home / app http://www.android.pk/blog/general/how-to-install-apk-files-on-android-emulator/
  • 68.
    Console Each runningemulator instance includes a console facility that lets you dynamically query and control the simulated device environment telnet localhost <console-port>. Console Port starts with 5554 Once console is launched, you can use commands to send events, location change etc to the device http://developer.android.com/guide/developing/devices/emulator.html
  • 69.
    Example : Sendinggeocode from console Background : geocoding allows you to get geo location from an address If you try a URL like : http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Glenarm+place,+Denver,+CO&sensor=true <geometry><location><lat>39.7442190</lat><lng>-104.9894830</lng></location> In applications that use device’s current location, we can test by sending different locations from console http://developer.android.com/guide/developing/devices/emulator.html
  • 70.
  • 71.
  • 72.
    Mobile testing typesFunctional Testing : basic functionality of app is working Emulator testing will cover this Usability Testing : after stable basic app is ready Say scrolling to bottom of screen is not easy in non-touch devices Performance Testing : across devices, carriers, location http://c0954852.cdn.cloudfiles.rackspacecloud.com/uTest_eBook_Mobile_Testing.pdf
  • 73.
    Mobile testing methodsEmulator / Simulator In House : setup lab Out sourcing : Device ready : http://www.deviceready.com/test-android-apps-on-multiple-devices/ Droid Cloud : http://www.perfectomobile.com/portal/cms/android.html uTest : http://www.utest.com/android-app-testing
  • 74.
    Ideas for TestingWhen launching emulator / creating AVD, we can select resolution – try to test on multiple resolutions / screen sizes android create avd -n <name> -t <targetID> --skin WVGA800 If you were launching from Eclipse, you can select as shown If you launch SDK Manager, you can add new AVD from there and select the resolution http://developer.android.com/guide/developing/devices/managing-avds-cmdline.html
  • 75.
    Ideas for testingFlow of application Screen transitions – upon clicks / slide if permitted When doing processing, does it show a progress bar? Is it responsive? Simulate a call when app is running to see if it hangs http://developer.android.com/guide/topics/testing/what_to_test.html
  • 76.
    Ideas for testingOrientation change To ensure that the app responds well in both orientation CTRL+F11 / F12
  • 77.
    References http://en.wikipedia.org/wiki/Android_(operating_system) http://www.android.com/http://developer.android.com/index.html http://developer.android.com/guide/developing/devices/index.html http://developer.android.com/guide/developing/devices/emulator.html http://www.android.pk/blog/general/how-to-install-apk-files-on-android-emulator/ http://developer.android.com/guide/developing/testing/index.html http://developer.android.com/guide/topics/testing/what_to_test.html http://developer.android.com/sdk/installing.html http://en.wikipedia.org/wiki/Dalvik_%28software%29 http://code.google.com/p/robotium/ : Robotium is a test framework created to make it easy to write powerful and robust automatic black-box test cases for Android applications. With the support of Robotium, test case developers can write function, system and acceptance test scenarios, spanning multiple Android activities. http://c0954852.cdn.cloudfiles.rackspacecloud.com/uTest_eBook_Mobile_Testing.pdf
  • 78.
  • 79.
    Thank You  [email_address] [email_address]