Where Are My Friends? วิธีการโปรแกรม Google Android
Posted in:
ี้หมดปัญหาเรื่องถูกทิ้ง เพราะยังไงก็หาเจออยู่แล้ว ว วว....
การเล่นกับ Android นั้นคุณคือผู้กำหนด ขึดจำกัดของ Android อยู่ที่จินตนาการของคุณจะไปถึง
หลังจากที่ Android SDK ประกาศตัว จนถึงตอนนี้มีนักพัฒนาลงทะเบียนใน Android support forum กว่า 4,500 คน มีการส่งข้อความแลกเปลี่ยนข่าวสารกันกว่า 4,000 ข้อความ มาทดลองสร้างแอปพริเคชั่นของ Android กันโดยใช้ SDK โดยในที่นี้ เราจะทำแอปพริเคชั่นอย่างมีประสิทธิภาพในการใช้มากที่สุด ดังนั้นตัวที่ใช้มีดังนี้ GPS, address book, และก็มีแผนที่
สำหรับการทำ Android applicaition ถ้าคุณมีพื้นเรื่องโปรแกรมบ้างก็ช่วยได้ แต่ไม่จำเป็นว่าต้องเคยทำ application บนมือถือแต่อย่างใด
มาดูวิธีการง่ายๆ สำหรับการทำแอปพริเคชั่นของ Android: Where Are My Friends ? โดยเราจะเรียกแอปพริเคชั่นที่จะทำตัวนี้ว่า WamF
WamF บอกให้คุณรู้ได้ว่าคุณอยู่ไหน และไกลจากเพื่อนๆ คุณใน address book เท่าไร สามารถลากเส้นระหว่างคุณและพวกเพื่อนๆ ลงในแผนที่ หรือวาดเส้นระหว่างคุณและเพื่อนคนที่อยู่ใกล้ในแผนที่ได้
WamF ก็ไม่ได้สลับซับซ้อนอะไร โดยนำรูปแบบที่น่าสนใจของ Android มาใช้ เช่น Location Based Information (GPS และอื่นๆ), แผนที่ (maps), contacts
manager และปุ่มกดโทรศัพท์อัตโนมัติ (phone dialer) ถ้ารวมเวลาทั้งหมดในการพัฒนาแอปพริเคชั่นตัวนี้ก็ประมาณ 14 ชั่วโมงนับจากเปิดไปยังหน้า SDK (ตั้งแต่เช้าจนเย็นเลยล่ะ)
การพัฒนา Android ชิ้นนี้ทำใน Windows ด้วย Eclipse โดยใช้ plugin หวังว่าคุณคงทำแบบเดียวกันนะ:)
ี
เริ่มอุ่นเครื่องก่อนจากการดาวน์โหลด
Eclipse และคลายซิปไปไว้ยังโฟลเดอร์ใหม่ที่สร้างขึ้น จากนั้นก็ดาวน์โหลด
Android SDK และก็คลายซิปไปยังอีกโฟลเดอร์ใหม่อีกโฟลเดอร์ที่สร้างขึ้น จากนั้นก็เปิด Eclipse และสร้างพื้นที่ทำงานสำหรับการพัฒนา Android
ติดตั้ง
Android Plugin โดยเลือก Help > Software Updates > Find and
Install...ในช่องข้อความให้เลือก Search for new Features to
install เลือก New Remote Site แล้วใส่เวปไซด์ต่อไปนี้ https://dl-ssl.google.com/android/eclipse/ ไปยังช่องใส่ข้อความ กด OK และให้ตอบรับ (accept) เมื่อมีคำถามขึ้นมาทั้งหมดจนกว่าจะเสร็จสิ้นการติดตั้ง รีสตาร์ท Eclipse เอาล่ะตอนนี้คุณก็พร้อมแล้วที่จะเข้าสู่โลกของ Android
เลือก Window > Preferences... และเลือก Android จากนั้นให้ใส่โฟลเดอร์ที่คุณเปิดซิปของ SDK ไว้ไปใน SDK Location text box กด Apply แล้วก็ OK ก็สำเร็จแล้ว
ทำแบบฝึกหัดนับเป็นเรื่องจำเป็น จงทำซะ
เพื่อความแน่ใจว่าทุกอย่างติดตั้งอย่างถูกต้อง ให้ทดลองสร้างตัวอย่าง Hello Android ทีมงาน Android ได้ อธิบายวิธีการทำ ไว้แล้ว ดังนั้นคงไม่ต้องกล่าวซ้ำอีก ควรจะตรวจสอบ
known bugs ก่อนเสมอถ้าคุณเกิดปัญหาอะไรขึ้นระหว่างการทำ
เอกสารเกี่ยวกับ Android ก็เจ๋งสุดยอดอยู่แล้ว; เอาล่ะหลังจากคุณได้ทดลองทำ Hello Android ข้างต้นแล้วลอง run ผ่าน แบบฝึกหัด สามารถเข้าใจและติดตามได้ไม่ยากเลย และยังให้แนวคิดว่า ทำยังไงจะให้แอปพริเคชั่นจริงๆ ทำงานได้ดีอีกด้วย
ออกแบบ UI เพื่อให้เทียบเท่ากับโปรเจคตัวอย่าง
ในแง่ธุรกิจแล้ว ขั้นตอนแรกมักเกี่ยวกับการออกแบบ UI นั่นคือมองภาพว่ามันคืออะไรที่คุณต้องการที่จะบอกผู้ใช้ และผู้ใช้ต้องทำอย่างไร หรือใช้อะไรบ้างในการพัฒนาอินเตอร์เฟสที่ดีที่สุดเท่าที่จะดีได้ เพื่อให้ทุกอย่างง่ายขึ้นมาลองทำโปรเจคในแบบฝึกหัดบน NotePad กัน
เริ่มด้วยการเปลี่ยน resource strings เพื่อเปลี่ยนชื่อของ app และแก้ไข
menu options
ใช้ Location Based Services เพื่อดูว่าคุณอยู่ไหน และให้อัพเดทเมื่อคุณเคลื่อนที่
หน้าตาของ Android ที่น่าสนใจที่สุดน่าจะเป็น Location Based Services ที่ให้แอปพริเคชั่นของคุณอยู่ในรูปแบบกราฟฟิคผ่านทางผู้ให้บริการในภูมิภาคหรือย่านที่ผู้ใช้อยู่ (อาทิเช่น GPS และอื่นๆ) ใน Android ยังมี mock provider ที่เรียกกันว่า 'gps'
(ที่กลับไปกลับมาระหว่างซานฟรานซิสโก,ใช้เฉพาะในสหรัฐอเมริกา) หรือคุณอาจสร้าง mock providers ของคุณเองใน XML
ในการหาตำแหน่งที่คุณอยู่ในขณะนี้ให้ใช้ LocationManager
-
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getCurrentLocation("gps");
ค้นหาใน address book ชื่อ สถานที่ ตำแหน่งในแผนที่ และเบอร์โทรศัพท์
ึความสามารถของ Android อีกอย่างที่ไม่ค่อยมีคนกล่าวถึงนัก คือความสามารถในการใช้ 'content' ร่วมกันระหว่างแอปพริเคชั่น เราจะมาใช้ตัวนี้กันเพื่อดูลิสต์พร้อมกับชื่อ และระยะห่างจากโทรศัพท์ของเรา โดยเริ่มจากสร้าง updateList
method ที่เราจะเรียกหลังจากเราได้ตำแหน่งล่าสุดของเราเองแล้ว
ใช้ ContentResolver เพื่อที่จะได้ถามข้อความที่ใช้ร่วมกันโดยใช้ Content Providers โดยคำถามจะมาเป็นแบบ cursors ที่จะให้คุณสามารถเข้าถึงตารางข้อมูลข้างใน ข้อมูลที่เราสนใจจะนำมาใช้คือ People content provider
-
Cursor c = getContentResolver().query(People.CONTENT_URI, null, null, null,
null); startManagingCursor(c);
Cursor เป็นวิธีการจัดการควบคุมตำแหน่งของคุณ (แถว,Row) เราจะเข้าถึงตัวข้อมูลในตาราง ได้โดยใช้วิธีกำหนดคอลัมภ์ที่มีข้อมูลที่เรากำลังอยากได้ และแทนที่เราจะใช้วิธีการจำดัชนีของคอลัมภ์สำหรับแต่ละ Content Provider เราสามารถใช้ short cut จากค่าคงที่จาก People class
-
int coordIdx = c.getColumnIndex(People.NOTES); int phoneIdx =
c.getColumnIndex(People.PhonesColumns.NUMBER); int nameIdx =
c.getColumnIndex(People.NAME);
ตอนนี้เราก็ iterate ไปทั่วๆ ตารางโดยใช้ cursor เก็บค่าที่ได้ใน arrays คุณจะสังเกตุได้ว่าเราได้ตำแหน่งของ contact เราจาก Notes
field ที่จริงแล้วเราอยากได้ภาพออกมาโดยการใช้ geocoding lookup ดูจาก address
-
-
String name = c.getString(nameIdx);
String coords = c.getString(coordIdx);
String phone = c.getString(phoneIdx);... [ Process the lat/long from the coordinates ] ...
... [ Storing their location under variable loc ] ...String distStr = String.valueOf(location.distanceTo(loc)/1000);
name = name + " (" + distStr + "km)";
listItems.add(name);numbers.add("tel:" + phone);
List listItems = new ArrayList();
c.first();
do {} while(c.next());
จากนั้นก็ให้กำหนดลิสต์ Strings ของเราไปยัง array โดยการใช้ ArrayAdapter
-
ArrayAdapter notes = new ArrayAdapter(this, R.layout.notes_row, items);
setListAdapter(notes);
รีเฟรชลิสต์เมื่อเคลื่อนที่
ปกติ WamF จะค่อนข้างไวดังนั้นจึงเป็นการดีที่จะอัพเดทหน้าจอทุกครั้งที่คุณเคลื่อนที่ ซึ่งคุณสามารถทำได้โดยถาม LocationManager เพื่อให้ trigger ตัว Intent ใหม่เมื่อผู้ให้บริการ location provider รับรู้ว่าเราเคลื่อนที่
-
List providers = locationManager.getProviders();
LocationProvider provider = providers.get(0);
Intent intent = new Intent(LOCATION_CHANGED);
locationManager.requestUpdates(provider, minTime, minDistance, intent);
Intents ใน Android เปรียบเหมือน เหตุการณ์ ใน driven
programming ทั่วไป ดังนั้นเราใช้วิธีการ trigger LOCATION_CHANGED event/intent
ทุกครั้งที่เราเคลื่อนที่โดยระยะที่น้อยที่สุด หลังจากระยะเวลาที่น้อยที่สุด ขั้นต่อไปก็สร้าง IntentReceiver (event handler) สร้าง internal class ใหม่ โดยขยายส่วน IntentReceiver และ override ReceiveIntent
event เพื่อเรียกไปยัง update method ของเรา
-
-
-
updateList();
@Override
public void onReceiveIntent(Context context, Intent intent) {} -
public class myIntentReceiver extends IntentReceiver {}
แล้วเราก็จะมี activity listen สำหรับ LOCATION_CHANGED intent โดยการลงทะเบียน event handler และกำหนด intent ที่ควรจะ listening
สำหรับ (LOCATION_CHANGED) การเริ่ม/หยุดการอัพเดทอัตโนมัตให้ทำใน onCreate method หรือ สร้างเมนูออปชั่นใหม่
-
filter = new IntentFilter(LOCATION_CHANGED);
receiver = new myIntentReceiver();
registerReceiver(receiver, filter);
เพื่อให้โทรศัพท์ของท่านไม่โหลดมากนัก ให้ใช้วิธี registering / unregistering สัญญาณ เมื่อ activity หยุดและทำงานต่อ เพราะไม่มีความจำเป็นที่เราจะต้องดูตำแหน่งที่เปลี่ยนไปถ้าเรามองไม่เห็นลิสต์
ตั้งแผนที่ (map activity) และสร้าง overlay เพื่อให้แสดงตำแหน่งที่คุณอยู่เมื่อเทียบกับเพื่อนของคุณ
ส่วนหนึ่งของความสนุกอยู่ตรงที่เรามีข้อความที่ไวต่อตำแหน่งวาดอยู่บน map ตอนนี้ให้สร้าง activity class ใหม่เพื่อให้แสดง map โดยตำแหน่งของเราควรอยู่กลางแผนที่ จากนั้นก็กำหนดจุดตำแหน่งเพื่อนของเรา เรายังสามารถวาดเส้นจากตำแหน่งของเรา ไปยังเพื่อนของเราแต่ละคนได้
แผนที่จะควบคุมตัวของมันเองเรียกว่า MapView โดยเราจะใช้ MapView
ใน MapActivity เพื่อที่เราจะได้เปลี่ยน inheritance ของ activity นี้ไปยัง MapActivity
-
public class MyMapViewActivity extends MapActivity
เพื่อ แสดงผลของแผนที่ เราต้องสร้าง MapView ใหม่และกำหนดให้มันเป็น content สำหรับ activity ของเราใน OnCreate method
-
MapView mapView = new MapView(this);
setContentView(mapView);
จะทำให้ MapView ปรากฎขึ้นเต็มจอ แล้วใช้การมองแบบ
LinearLayout ในกรณีที่เราต้องการจะสร้าง UI layout ที่ซับซ้อน
การจะเข้าถึง OverlayController และ MapController ทำได้โดยการสร้าง global variables เพื่อเก็บและ assign the references ภายใน OnCreate
method เรายังคงใช้ข้อมูลจาก Location โดย get
reference ไปยังส่วนนั้นด้วย ด้วยการให้ค่า references นอกจากนี้ยังสามารถกำหนดให้ย่อ ขยาย แผนที่หรือเริ่มแผนที่ใหม่โดยใช้ MapController เมื่อคุณทำเสร็จแล้ว ตัว OnCreate
ควรมีหน้าตาคล้ายๆ แบบนี้
-
-
super.onCreate(icicle);
MapView mapView = new MapView(this);
mapController = mapView.getController();
overlayController = mapView.createOverlayController();
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mapController.zoomTo(9);
setContentView(mMapView);
updateView();
protected void onCreate(Bundle icicle) {}
updateView คือส่วนที่เราทำงาน เริ่มโดยดึงตำแหน่งปัจจุบันของเราแล้วแปลงตำแหน่ง Lat/Long เป็นจุดในแผนที่ (Point) จากนั้นให้ตำแหน่งที่เราอยู่เป็นศูนย์กลางของแผนที่
-
Double lat = location.getLatitude()*1E6;
Double lng = location.getLongitude()*1E6;
Point point = new Point(lat.intValue(), lng.intValue());
mapController.centerMapTo(point, false);
เหลืออยู่อย่างเดียวที่ต้องทำบนแผนที่ของเราคือลากจุดเชื่อมต่อด้วยเส้น ทำได้โดยการสร้าง class ขึ้นใหม่ class ที่ขยายส่วน Overlay และเพิ่มบันทัดเหล่านี้โดยใช้ OverlayController.
-
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
overlayController.add(myLocationOverlay, true);
จะทำงานใน Overlay class โดย overriding draw method.
-
-
-
... [ draw things here ] ...
@Override
public void draw(Canvas canvas, PixelCalculator calculator, boolean
shadow) {} -
protected class MyLocationOverlay extends Overlay {}
เริ่มจากการวาด 'marker' บนตำแหน่งปัจจุบัน ปกติไม่ค่อยมี marker ซัพพอร์ตใน Google Maps ทั่วๆ ไป แต่คุณสามารถทำได้แบบเดียวกันโดย
วาดบนแผนที่ canvas; เลือกวาดวงกลมเล็กๆ เป็น markers เริ่มด้วยคุณต้องใช้ PixelCalculator เพื่อเปลี่ยนตำแหน่งจุด Lat/Long ให้กลายเป็นจุดบนหน้าจอ จากนั้นสร้าง Paint object เพื่อกำหนดสีและการตั้งค่าแปรง (brush) ของคุณ จากนั้นก็เริ่มระบาย markers
-
int[] screenCoords = new int[2];
calculator.getPointXY(point, screenCoords);
RectF oval = new RectF(...);
Paint paint = new Paint();
paint.setARGB(200, 255, 0, 0);
canvas.drawOval(oval, paint);
เพิ่มตำแหน่งเพื่อนของคุณโดยวิธีการเดียวกัน iterating ไปทั่ว address
book เลือกชื่อและสถานที่ คัดคนที่อยู่ไกลเกินไปออก (เช่นสัก 10กม.)
และวาด markers, ชื่อ (drawText), และเส้นเชื่อม (drawLine)
ไปยังตำแหน่งใกล้เคียง
มาโทรศัพท์กัน
ตอนนี้เรารู้แล้วว่าเราอยู่ใก้ลๆ กับเพื่อนของเรา แต่ถ้าเราไปหาเฉยๆ โดยไม่บอกกล่าว อาจดูไม่ค่อยสุภาพสักเท่าไร ก็น่าจะโทรไปบอกกล่าวกันก่อน โดยเปลี่ยน list item ของเราด้วยการ คลิ๊กฟังก์ชั่นไปยังโทรหาเพื่อนทำได้โดยการจัดการกับ DIAL_ACTION intent
-
Intent i = new Intent();
i.setAction(DIAL_ACTION);
i.setData(new ContentURI(numbers.get(position)));
startActivity(i);
ซึ่งเป็นการกำหนดให้ dialer ของโทรศัพทลงทะเบียนกับ IntentReceiver ซึ่งกรองข้อมูลไว้บน DIAL_ACTION แล้วมันก็จะทำหน้าที่ให้เรา
แหล่งข้อมูล Where are my friends และ A developer's perspective on Google's Android SDK


เจอจนได้ต
เจอจนได้ตัวจริงอยู่นี่เอง ยอดเยี่ยมครับ
เป็นบทควา
เป็นบทความที่ดีมากๆ ครับละเอียดดีจริงๆ
กำลังโหลด
กำลังโหลดมาจะลองเล่นอยู่พอดีเลยครับ เอาแค่ขึ้นว่า Hello Android ก็ดีใจแล้ว ^^
ขอบคุณครั
ขอบคุณครับ
"การพัฒนา
"การพัฒนา Android ชิ้นนี้ทำใน Windows ด้วย Eclipse โดยใช้ plugin หวังว่าคุณคงทำแบบเดียวกันนะ:) "
ทำใน ubuntu ได้มั้ยคับ :p (แซว)
Eclipse
ทำได้ค่ะ มีเหมือนกันหมดเลย
ดาวโหลดมาติดตั้งได่เลย
สนุกกับการพัฒนานะครับ
แปลมาใช่ม
แปลมาใช่มั้ยครับ
น่าจะอธิบายให้ละเอียดกว่านี้นะครับ
ต้นฉบับอย
link ที่สำคัญต่างๆ รวมถึงแหล่งข้อมูลอยู่ตรงท้ายบทความ เข้าไปอ่านได้เลยจ๊ะ
Google Averything for future
อีกหน่อยทุกอย่างก็เป็นกูเกิ้ลหมดแน่เลย
เมื่อไหร่จะมี gCar สักที สร้าง Framework สำหรับรถยนต์ ให้พวกเราได้พัฒนากัน
ใช่เลย
ใช่เลย ไว้ว่างๆ จะนำบทความเกี่ยวกับ google จะครองเมืองมาให้อ่านเล่นกัน :o
มาเจอโดยบ
มาเจอโดยบังเอิญ ขออนุญาติเผยแพร่ครับ :D
Post new comment