2008年8月25日 星期一

Android 0.9 SDK beta

Google released a beta SDK (Android 0.9 SDK beta) in 2008.08.16
此版為較穩定的版本,已近於2008年第四季真正上市所使用的1.0版!

Download the Android SDK


若你使用Eclipse開發要安裝ADT
*注意Eclipse要3.3版以上

Installing the Eclipse Plugin (ADT)

2008年3月13日 星期四

Android DEMO

Google's Andy Rubin gives BBC News a tour of Android

Mobile SDK compare


Apple iPhone SDKToolchainWindows MobileS60Android
Cost
Free Free Free; could be more depending on tools used Free; could be more depending on tools used Free
Wide-scale app availability
June Now Now Now Depends on device availability
Native development
Yes
Yes Yes Yes Yes
Languages suppoted for native development
Objective-C Objective-C C++, C#, VB.NET
C++ Java
Digital certificates
Required for distribution No Available, required for some phones Available, required for some phones No
Retail support
Full; 30 percent Apple revenue share; free apps allowable No Limited Limited No, but Android Developer Challenge offers money and publicity
Platform maturity
Immature Immature Mature Mature Immature
First-party support
Yes No Yes Yes Yes
Community support
Just getting started!
Excellent Excellent Excellent Excellent
App installation method
Direct (App Store), iTunes Installer.app, custom Direct, ActiveSync Direct, PC Suite Unknown; installation on emulator is not reflective of production devices
Emulator available
Yes No Yes Yes Yes
Remote debugging
Yes No Yes Yes Yes
Target device variety
Poor Poor Excellent Good Poor (that will change, though)
Touchscreen support
Multi-touch
Multi-touch Single touch Umm... soon? Single touch
App availability and variety
Poor (that will change, though) Good Excellent Excellent Poor (that will change, though)
Underlying architecture
Cocoa Touch / Mac OS X
Mac OS X
Windows Symbian Linux
Flash availability
No No Yes Yes No
Java availability
No In development Yes Yes Yes

2008年3月2日 星期日

2008年2月28日 星期四

Google releases new version of Android SDK m5-rc14

Android SDK m5-rc14 now available!

1. user interface - As I mentioned when we introduced the m3 version of the Android SDK, we're continuing to refine the UI that's available for Android. m5-rc14 replaces the previous placeholder with a new UI, but as before, work on it is still in-progress.

2. Layout animations - Developers can now create layout animations for their applications using the capabilities introduced in the android.view.animation package. Check out the LayoutAnimation*.java files in the APIDemos sample code for examples of how this works.

3. Geo-coding - android.location.Geocoder enables developers to forward and reverse geo-code (i.e. translate an address into a coordinate and vice-versa), and also search for businesses.

4. New media codecs - The MediaPlayer class has added support for the OGG Vorbis, MIDI, XMF, iMelody, RTTL/RTX, and OTA audio file formats.

5. Updated Eclipse plug-in - A new version of ADT is available and provides improvements to the Android developer experience. In particular, check out the new Android Manifest editor.

1. 新的使用者介面
2. 可建立Layout animations
3. 地址查詢經緯支援
4. 新的媒體編碼格式
5. 新的Eclipse plug-in

MapActivity in Android 4 - GPS

You can use GPS in Android. Here is a demo for driving around Google by using GPS.

MapActivity亦可使用GPS定位Google map,不過目前透過內部模擬在Google附近開車的GPS資料進行模擬。

1. mapdemo.java:再將上一篇的程式碼主要加上籃色部份,透過LocationManager使用GPS定位,選單增加GPS項目,P為定位、G為到選單。



package com.test.demo;

import java.util.List;
import com.google.android.maps.MapActivity;
import android.app.Activity;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;

public class mapdemo extends MapActivity{
/** Called when the activity is first created. */
public static final int change = 3000;
private MapView mapView;
private MapController mapConrtoller;
private Spinner s1;
private LocationManager locMan;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

s1 = (Spinner) findViewById(R.id.spinner1);
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this, R.array.city, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);
//It seems a bug for LocationManager,we can't get location in first time.
getLocation();
mapView =(MapView) findViewById(R.id.my_map);
mapConrtoller = mapView.getController();
mapConrtoller.zoomTo(17);
updateView();
}

private void getLocation(){
Location loc;
LocationProvider locPro;
List proList;
locMan = (LocationManager)this.getSystemService(Activity.LOCATION_SERVICE);
proList = locMan.getProviders();
locPro = proList.get(0);
loc = locMan.getCurrentLocation("gps");

Double lat = 0.0;
Double lon = 0.0;
lat = (Double)loc.getLatitude()*1E6;
lon = (Double)loc.getLongitude()*1E6;
Point point = new Point(lat.intValue(),lon.intValue());
if(lat.intValue()!=0 && lon.intValue()!=0){
mapConrtoller.animateTo(point);
}
}

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_I) {
mapView.requestFocus();
// zoom in
mapView.getController().zoomTo(mapView.getZoomLevel() + 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_P) {
// position
Double lat=0.0;
Double lng=0.0;
if(s1.getSelectedItemIndex()==0){
lat = 25.08421662*1E6;
lng = 121.5588632*1E6;
}else if(s1.getSelectedItemIndex()==1){
lat = 25.156109*1E6;
lng = 121.695457*1E6;
}else if(s1.getSelectedItemIndex()==2){
lat = 25.02723286*1E6;
lng = 121.4777282*1E6;
}else if(s1.getSelectedItemIndex()==3){
lat = 24.766944444*1E6;
lng = 121.758333333*1E6;
}else if(s1.getSelectedItemIndex()==4){
lat = 24.7952904064701*1E6;
lng = 121.005980402031*1E6;
}else if(s1.getSelectedItemIndex()==5){
lat = 25.01049145*1E6;
lng = 121.2988981*1E6;
}else if(s1.getSelectedItemIndex()==6){
lat = 24.6929396881103*1E6;
lng = 120.916988073054*1E6;
}else if(s1.getSelectedItemIndex()==7){
lat = 24.165632*1E6;
lng = 120.640234*1E6;
}else if(s1.getSelectedItemIndex()==8){
lat = 24.085467449249*1E6;
lng = 120.53489812506*1E6;
}else if(s1.getSelectedItemIndex()==9){
lat = 23.831933886322*1E6;
lng = 120.71674349869*1E6;
}else if(s1.getSelectedItemIndex()==10){
lat = 23.4670607206971*1E6;
lng = 120.424347942069*1E6;
}else if(s1.getSelectedItemIndex()==11){
lat = 23.68080782*1E6;
lng = 120.4857101*1E6;
}else if(s1.getSelectedItemIndex()==12){
lat = 23.015307619667*1E6;
lng = 120.19802892001*1E6;
}else if(s1.getSelectedItemIndex()==13){
lat = 22.6516357159836*1E6;
lng = 120.305947184541*1E6;
} else if(s1.getSelectedItemIndex()==14){
lat = 22.568397*1E6;
lng = 120.539828*1E6;
} else if(s1.getSelectedItemIndex()==15){
lat = 22.736944444*1E6;
lng = 121.122777778*1E6;
}else if(s1.getSelectedItemIndex()==16){
lat = 23.973333333*1E6;
lng = 121.588055556*1E6;
}else if(s1.getSelectedItemIndex()==16){
lat = 23.973333333*1E6;
lng = 121.588055556*1E6;
}else if(s1.getSelectedItemIndex()==17){
getLocation();
}
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false);
mapView.requestFocus();
return true;
}else if (keyCode == KeyEvent.KEYCODE_G) {
// zoom out
s1.requestFocus();
return true;
}else if (keyCode == KeyEvent.KEYCODE_O) {
mapView.requestFocus();
// zoom out
mapView.getController().zoomTo(mapView.getZoomLevel() - 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_S) {
mapView.requestFocus();
// Satellite,衛星地图
if(!mapView.isSatellite()){
mapView.toggleSatellite();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_M) {
mapView.requestFocus();
// traffic,路况
if(mapView.isSatellite()){
mapView.toggleSatellite();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;

} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
}
return false;
}

private void updateView(){

Double lat = 25.025708*1E6;
Double lng = 121.526403*1E6;
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false);
}

}


2. arrays.xml:加上GPS項目。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="city">
<item>台北市</item>
<item>基隆市</item>
<item>台北縣</item>
<item>宜蘭縣</item>
<item>新竹市</item>
<item>桃園市</item>
<item>苗栗縣</item>
<item>台中市</item>
<item>彰化縣</item>
<item>南投縣</item>
<item>嘉義市</item>
<item>雲林縣</item>
<item>臺南市</item>
<item>高雄市</item>
<item>屏東縣</item>
<item>臺東縣</item>
<item>花蓮縣</item>
<item>GPS</item>
</array>
</resources>

2008年2月26日 星期二

MapActivity in Android 3 - city menu

We apply city menu in Taiwan for app. You can choose city to position the map. "P" for Position."G" for focusing in city menu.

加入各縣市表單,你可以更進一步地定位Google map。

1. mapdemo.java:再將上一篇的程式碼主要加上籃色部份,其他部份亦有加上小部份修改,P為定位、G為到城市選單。


package com.test.demo;

import com.google.android.maps.MapActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;

public class mapdemo extends MapActivity{
/** Called when the activity is first created. */
public static final int change = 3000;
private MapView mapView;
private MapController mapConrtoller;
private Spinner s1;

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

s1 = (Spinner) findViewById(R.id.spinner1);
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this, R.array.city, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);

mapView =(MapView) findViewById(R.id.my_map);
mapConrtoller = mapView.getController();
mapConrtoller.zoomTo(17);
updateView();
}

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_I) {
mapView.requestFocus();
// zoom in
mapView.getController().zoomTo(mapView.getZoomLevel() + 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_P) {
// position
Double lat=0.0;
Double lng=0.0;
if(s1.getSelectedItemIndex()==0){
lat = 25.08421662*1E6;
lng = 121.5588632*1E6;
}else if(s1.getSelectedItemIndex()==1){
lat = 25.156109*1E6;
lng = 121.695457*1E6;
}else if(s1.getSelectedItemIndex()==2){
lat = 25.02723286*1E6;
lng = 121.4777282*1E6;
}else if(s1.getSelectedItemIndex()==3){
lat = 24.766944444*1E6;
lng = 121.758333333*1E6;
}else if(s1.getSelectedItemIndex()==4){
lat = 24.7952904064701*1E6;
lng = 121.005980402031*1E6;
}else if(s1.getSelectedItemIndex()==5){
lat = 25.01049145*1E6;
lng = 121.2988981*1E6;
}else if(s1.getSelectedItemIndex()==6){
lat = 24.6929396881103*1E6;
lng = 120.916988073054*1E6;
}else if(s1.getSelectedItemIndex()==7){
lat = 24.165632*1E6;
lng = 120.640234*1E6;
}else if(s1.getSelectedItemIndex()==8){
lat = 24.085467449249*1E6;
lng = 120.53489812506*1E6;
}else if(s1.getSelectedItemIndex()==9){
lat = 23.831933886322*1E6;
lng = 120.71674349869*1E6;
}else if(s1.getSelectedItemIndex()==10){
lat = 23.4670607206971*1E6;
lng = 120.424347942069*1E6;
}else if(s1.getSelectedItemIndex()==11){
lat = 23.68080782*1E6;
lng = 120.4857101*1E6;
}else if(s1.getSelectedItemIndex()==12){
lat = 23.015307619667*1E6;
lng = 120.19802892001*1E6;
}else if(s1.getSelectedItemIndex()==13){
lat = 22.6516357159836*1E6;
lng = 120.305947184541*1E6;
} else if(s1.getSelectedItemIndex()==14){
lat = 22.568397*1E6;
lng = 120.539828*1E6;
} else if(s1.getSelectedItemIndex()==15){
lat = 22.736944444*1E6;
lng = 121.122777778*1E6;
}else if(s1.getSelectedItemIndex()==16){
lat = 23.973333333*1E6;
lng = 121.588055556*1E6;
}
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false);
mapView.requestFocus();
return true;
}else if (keyCode == KeyEvent.KEYCODE_G) {
// zoom out
s1.requestFocus();
return true;
}else if (keyCode == KeyEvent.KEYCODE_O) {
mapView.requestFocus();
// zoom out
mapView.getController().zoomTo(mapView.getZoomLevel() - 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_S) {
mapView.requestFocus();
// Satellite,衛星地图
if(!mapView.isSatellite()){
mapView.toggleSatellite();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_M) {
mapView.requestFocus();
// traffic,路况
if(mapView.isSatellite()){
mapView.toggleSatellite();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;

} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
}
return false;
}

private void updateView(){
Double lat = 25.025708*1E6;
Double lng = 121.526403*1E6;
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false);
}

}


2. arrays.xml:在目錄res下的values目錄下建立一arrays.xml,是要存放城市表單內容。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="city">
<item>台北市</item>
<item>基隆市</item>
<item>台北縣</item>
<item>宜蘭縣</item>
<item>新竹市</item>
<item>桃園市</item>
<item>苗栗縣</item>
<item>台中市</item>
<item>彰化縣</item>
<item>南投縣</item>
<item>嘉義市</item>
<item>雲林縣</item>
<item>臺南市</item>
<item>高雄市</item>
<item>屏東縣</item>
<item>臺東縣</item>
<item>花蓮縣</item>
</array>
</resources>

3. main.xml:加入選單

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<view id="@+id/my_map" class="com.google.android.maps.MapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" /
>

<Spinner id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawSelectorOnTop="true"
/
>
</LinearLayout>


2008年2月25日 星期一

MapActivity in Android 2

You can control google map further. 你可以更進一步地使用Google map。

1. mapdemo.java:再將上一篇的程式碼加上籃色部份,可用手機按鍵控制地圖,O為拉遠、I為拉近、S為衛星地圖、上下左右鍵為移動。


package com.test.demo;

import com.google.android.maps.MapActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;

public class mapdemo extends MapActivity{
/** Called when the activity is first created. */
public static final int change = 3000;
private MapView mapView;
private MapController mapConrtoller;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

//get id from main.xml
mapView =(MapView) findViewById(R.id.my_map);
mapConrtoller = mapView.getController();
mapConrtoller.zoomTo(17); updateView();
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_I) {
// zoom in
mapView.getController().zoomTo(mapView.getZoomLevel() + 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_O) {
// zoom out
mapView.getController().zoomTo(mapView.getZoomLevel() - 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_S) {
// 衛星地图
if(!mapView.isSatellite()){
mapView.toggleSatellite(); }
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point); return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point); return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point); return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point); return true;
}
return false;
}
private void updateView(){
Double lat = 25.025708*1E6;
Double lng = 121.526403*1E6;
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false); }

}