3. ไดห้ นา้ ตาของโปรแกรมดงั นี้
4. แกไ้ ขโค้ด Java ในไฟล์ MyTabWidgetActivity.java ดังนี้
package com.viewgroup.mytabwidget;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TabHost;
public class MyTabWidgetActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TabHost tabHost=(TabHost)findViewById(R.id.tabhost); กำ�หนดคณุ สมบัติ Tab ที่ 1
tabHost.setup();
TabHost.TabSpec tabSpec=tabHost.newTabSpec("tab1");
tabSpec.setContent(R.id.tab1);
tabSpec.setIndicator("Home");
tabHost.addTab(tabSpec);
tabSpec=tabHost.newTabSpec("tab2"); กำ�หนดคณุ สมบัติ Tab ท่ี 2
tabSpec.setContent(R.id.tab2); กำ�หนดคุณสมบัติ Tab ท่ี 3
tabSpec.setIndicator("Setting");
tabHost.addTab(tabSpec);
tabSpec=tabHost.newTabSpec("tab3");
tabSpec.setContent(R.id.tab3);
//tabSpec.setContent(new Intent(this,MyActivity.class));
tabSpec.setIndicator("About",getResources().getDrawable(android.R.drawable.ic_dialog_
info));
tabHost.addTab(tabSpec);
}
}
140 Android App Development ฉบับสมบูรณ์
โดยท่ี
z setContent() เป็นเมธอดส�ำหรับก�ำหนดเน้ือหาภายในแท็บน้ันๆ ซึ่งผู้อ่านสามารถสร้าง
แอ็คทิวิตี้เตรียมไว้ก่อนน�ำมาแสดงในภายหลังก็ได้ โดยก�ำหนดพารามิเตอร์
ดังตวั อย่างต่อไปนี้
tabSpec.setContent(new Intent(this,<Activity Name>.class));
z setIndicator() เป็นเมธอดสำ� หรบั ก�ำหนดชือ่ ของแทบ็ รวมไปถึงกำ� หนดรูปไอคอนของแท็บดว้ ย
5. เม่ือรันแอพพลเิ คชันจะได้ผลลัพธ์ดังน้ี
WebView
WebView เปน็ ตัวชว่ ยในการแสดงเวบ็ เพจ (Web Page) ในกรณีทผ่ี ้อู า่ นต้องการแสดงผลเวบ็ เพจ
(Web Page) ภายในแอพพลิเคชัน กส็ ามารถทำ� ไดโ้ ดยใช้ WebView
ในหัวข้อนี้ผู้เขียนจะอธิบายข้ันตอนการสร้างเว็บบราวเซอร์อย่างง่ายโดยใช้ WebView เพ่ือเป็น
ตัวอยา่ งในการใช้งาน WebView ซ่ึงมีขนั้ ตอนดังตอ่ ไปนี้
1. สร้างโปรเจก็ ตใ์ หม่ ในทน่ี ต้ี งั้ ช่ือว่า
MyWebBrowser และกำ� หนดคุณสมบตั ิ 1.1 กรอกชอื่
ดงั น้ี 1.2 เลอื ก
1.3 คลิก
1.4 คลกิ
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 141
1.5 เลือก 1.7 ตั้งช่อื แอพพลิเคชัน
1.8 ต้งั ชื่อแพ็คเกจ
1.9 ตงั้ ช่อื แอค็ ทวิ ติ ้ี
1.10 เลอื ก
1.6 คลกิ 1.11 คลิก
2. แกไ้ ขโคด้ XML ในไฟล์ main.xml เพ่ือจัดวางหนา้ จอส�ำหรับแอพพลิเคชนั ดังน้ี
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout กำ�หนดคณุ สมบตั ิของ LinearLayout
android:id="@+id/linearLayout1" กำ�หนดคณุ สมบตั ขิ อง EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.3" >
<requestFocus>
</requestFocus>
</EditText>
<Button กำ�หนดคุณสมบตั ขิ อง Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Go" >
</Button>
</LinearLayout>
142 Android App Development ฉบับสมบูรณ์
<LinearLayout กำ�หนดคณุ สมบตั ขิ อง LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView กำ�หนดคณุ สมบัติของ WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</WebView>
</LinearLayout>
</LinearLayout>
3. แกไ้ ขโคด้ XML ในไฟล์ AndroidManifest.xml โดยเพม่ิ แทก็ <uses-permission android:name=
“android.permission.INTERNET” /> เพื่อให้แอพพลเิ คชันสามารถใชง้ านอนิ เทอร์เน็ตไดด้ งั นี้
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.viewgroup.myweb"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="12" /> เพม่ิ แท็ก
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MyWebBrowserActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
4. แกไ้ ขโคด้ Java ในไฟล์ MyWebBrowserActivity.java เพอื่ ใหแ้ อพพลเิ คชนั สามารถทำ� งานไดด้ งั นี้
package com.viewgroup.myweb;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 143
import android.widget.TextView;
public class MyWebBrowserActivity extends Activity {
WebView webview;
Button bt_go;
TextView txt_address;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webView1);
webview.setWebViewClient(new WebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
txt_address = (TextView) findViewById(R.id.editText1);
webview.loadUrl("http://www.google.com"); กำ�หนด Url
bt_go = (Button) findViewById(R.id.button1);
bt_go.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String url = txt_address.getText().toString().trim();
if (!url.equals("")) { ตรวจสอบการกรอก Url
webview.loadUrl(url);
}
}
});
}
}
5. รนั แอพพลเิ คชันเพอ่ื ทดสอบการทำ� งาน จะไดผ้ ลลัพธ์ดังรปู
144 Android App Development ฉบับสมบูรณ์
Preferences Screen
Preferences Screen เปน็ รปู แบบหน้าจอส�ำหรบั ตง้ั คา่ ตา่ งๆ ของแอพพลิเคชัน ยกตวั อย่างเช่น การ
ตง้ั คา่ Wireless & network ในแอนดรอยด์ ซงึ่ Preferences Screen กจ็ ะประกอบไปดว้ ยอลิ ิเมนต์ภายใน เชน่
CheckBoxPreference, ListPreference และ EditTextPreference เปน็ ตน้ สำ� หรบั การสรา้ ง Preferences Screen
ข้ึนมาใช้งานนั้น สามารถท�ำได้ตามขั้นตอนดังตอ่ ไปน้ี
1. สร้างโปรเจ็กตใ์ หม่ ในทน่ี ี้ตง้ั ชื่อวา่ MyPreferencesScreen และก�ำหนดคณุ สมบัตดิ ังน้ี
1.1 กรอกชอ่ื
1.2 เลอื ก
1.3 คลิก เลือก 1.5
1.4 คลิก 1.6 คลกิ
1.7 ต้งั ชือ่ แอพพลิเคชัน
1.8 ตั้งช่ือแพค็ เกจ
1.9 ตั้งชือ่ แอ็คทวิ ิตี้
1.10 เลือก
1.11 คลิก
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 145
2. สร้างไฟล์ arrays.xml ไวใ้ นส่วนของ res/ เลอื ก 2.1
values เพอื่ เปน็ ขอ้ มลู ใน ListPreferences เลือก 2.2
ดังนี้
2.3 กรอกช่ือ
3. เพม่ิ โค้ด XML ในไฟล์ arrays.xml ดังน้ี 2.4 คลกิ
4.6 แสดงไฟล์
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="listName">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="listValue">
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
</resources>
4. สร้างไฟล์ mypref.xml เพอื่ สรา้ งหนา้ จอ Preference ดังนี้
4.3 กรอกช่ือ เลอื ก 4.1
เลือก 4.2
4.4 เลือก
4.5 คลิก
146 Android App Development ฉบับสมบูรณ์
5. เพิ่มโค้ด XML ในไฟล์ mypref.xml ดงั นี้
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="Preference Category" >
<CheckBoxPreference
android:defaultValue="false"
android:key="checkboxPref"
android:summary="true or false"
android:title="Checkbox Preference" />
<ListPreference
android:defaultValue="0"
android:entries="@array/listName"
android:entryValues="@array/listValue"
android:key="listPref"
android:summary="Select value from array"
android:title="List Preference" />
<EditTextPreference
android:name="EditText Preference"
android:defaultValue="Nothing"
android:key="editTextPref"
android:summary="Please enter you string"
android:title="Edit This Text" />
<RingtonePreference
android:name="Ringtone Preference"
android:key="ringtonePref"
android:summary="Select a ringtone"
android:title="Ringtones" />
<Preference
android:key="customPref"
android:summary="Please touch hare to start MyActivity."
android:title="Custom Preference" />
</PreferenceCategory>
</PreferenceScreen>
จากโคด้ XML เปน็ การสรา้ ง CheckBoxPreference, ListPreference, EditTextPreference, Ringtone
Preference และ CustomPreference
6. แกไ้ ขโคด้ Java ในไฟล์ MyPreferencesScreenActivity.java ดังนี้
package com.viewgroup.mypref;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class MyPreferencesScreenActivity extends PreferenceActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); กำ�หนดหน้าจอ
addPreferencesFromResource(R.xml.mypref);
}
}
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 147
7. เมอื่ รนั แอพพลิเคชันจะได้ผลลพั ธด์ ังน้ี
148 8. แกไ้ ขโคด้ Java ในไฟล์ MyPreferencesScreenActivity.java เพอ่ื นำ� คา่ จาก Preference มาใชง้ าน
และเพิม่ เหตุการณ์เม่อื คลิกปุม่ Custom Preference ดังนี้
package com.viewgroup.mypref;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.widget.Toast;
public class MyPreferencesScreenActivity extends PreferenceActivity {
boolean CheckboxPreference;
String ListPreference;
String editTextPreference;
String ringtonePreference;
String customPref;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.mypref);
Preference customPref = (Preference) findPreference("customPref");
customPref
.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
getPrefValue();
Toast.makeText(
Android App Development ฉบับสมบูรณ์
getBaseContext(),
"Custom preference has been clicked"
+ "\nCheck : " + CheckboxPreference
+ "\nList : " + ListPreference
+ "\nEditText : " + editTextPreference
+ "\nRingtone : " + ringtonePreference,
Toast.LENGTH_LONG).show();
return true;
}
});
}
private void getPrefValue() {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());
CheckboxPreference = prefs.getBoolean("checkboxPref", true);
ListPreference = prefs.getString("listPref", "0");
editTextPreference = prefs.getString("editTextPref",
"Nothing has been entered");
ringtonePreference = prefs.getString("ringtonePref",
"DEFAULT_RINGTONE_URI");
SharedPreferences mySharedPreferences = getSharedPreferences(
"myCustomSharedPrefs", Activity.MODE_PRIVATE);
customPref = mySharedPreferences.getString("cusomPref", "");
}
}
โดยท่ี
z setOnPreferenceClickListener() เปน็ เมธอดสำ� หรบั เพม่ิ เหตกุ ารณ์ เมอ่ื มกี ารคลกิ ปมุ่ Custom
Reference ท่ีสรา้ งขนึ้
z getPrefValue() เปน็ เมธอดทส่ี รา้ งขนึ้ เพอื่ ดงึ คา่ ปจั จบุ นั ของแตล่ ะ Preference
มาเก็บไว้ในตัวแปร
ในตวั อย่างนผ้ี เู้ ขียนจะให้แอพพลิเคชนั แสดงคา่ ปจั จุบันของแตล่ ะ Preference เมือ่ คลกิ ปมุ่ Custom
Reference
9. เม่อื รันแอพพลิเคชันจะได้ผลลัพธ์ดังน้ี
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 149
การจัดวางหน้าจอ (Screen Orientation)
โดยทว่ั ไปแลว้ แอพพลเิ คชนั จะสนบั สนนุ การทำ� งานหนา้ จอแนวนอน (Landscape) และแนวตง้ั (Portrait)
ยกตวั อยา่ งเชน่ เกม Angry Birds ที่จดั วางหน้าจอในแนวนอนเพ่ือใหเ้ หมาะกับการเล่น
ในหัวข้อน้ี ผู้อ่านจะได้ศึกษาการพัฒนาแอพพลิเคชันให้สนับสนุนการจัดวางหน้าจอแนวนอนและ
แนวตั้ง ซึ่งมีขน้ั ตอนดงั นี้
1. สรา้ งโปรเจ็กต์ใหม่ ในท่นี ีต้ งั้ ช่ือวา่ MyScreenOrientation และก�ำหนดคุณสมบตั ดิ ังนี้
1.1 กรอกช่ือ
1.2 เลือก
1.3 คลิก เลือก 1.5
1.4 คลกิ 1.6 คลิก
1.7 ต้ังชื่อแอพพลิเคชัน
1.8 ตงั้ ชอ่ื แพ็คเกจ
1.9 ต้งั ช่ือแอค็ ทวิ ติ ี้
1.10 เลือก
1.11 คลกิ
โดยปกตแิ ลว้ หลงั จากที่สร้างโปรเจก็ ตข์ นึ้ มาใหม่ ไฟล์ main.xml ในส่วนของ res/layout จะเป็นไฟล์
ส�ำหรบั สร้างหน้าจอท่วี างในแนวตงั้
150 Android App Development ฉบับสมบูรณ์
2. สรา้ งโฟลเดอร์ layout-land ในสว่ นของ res (โดยคลกิ ขวาที่
res) และสร้างไฟล์ main.xml ไว้ภายในดังรูป
3. แกไ้ ขโค้ด XML ในไฟล์ main.xml เพ่อื ใชส้ �ำหรบั การจัดวางหนา้ จอแนวตั้งดงั น้ี 151
<?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"
android:gravity="center_horizontal">
<Button android:text="Linear Layout"
android:id="@+id/button1"
android:layout_width="120dp"
android:layout_height="wrap_content">
</Button>
<Button android:text="Relative Layout"
android:id="@+id/button2"
android:layout_width="120dp"
android:layout_height="wrap_content">
</Button>
<Button android:text="Frame Layout"
android:id="@+id/button3"
android:layout_width="120dp"
android:layout_height="wrap_content">
</Button>
<Button android:text="Absolute Layout"
android:id="@+id/button4"
android:layout_width="120dp"
android:layout_height="wrap_content">
</Button>
<Button android:text="Table Layout"
android:id="@+id/button5"
android:layout_width="120dp"
android:layout_height="wrap_content">
</Button>
<Button android:text="Exit"
android:id="@+id/button6"
android:layout_width="120dp"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ
4. คลกิ แทบ็ Graphical Layout จะปรากฏหนา้ จอแนวตัง้ ดงั รูป
4 คลิก
5. แก้ไขโค้ด XML ในไฟล์ main.xml ในสว่ นของ res/layout-land เพอื่ ใชส้ ำ� หรบั การจดั วางหนา้ จอ
แนวนอนดังนี้
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<LinearLayout กำ�หนดรปู แบบ Layout
android:id="@+id/linearLayout3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout กำ�หนดรปู แบบ Layout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/button1"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="Linear Layout" >
</Button>
<Button
android:id="@+id/button2"
android:layout_width="160dp"
152 Android App Development ฉบับสมบูรณ์
android:layout_height="wrap_content"
android:text="Relative Layout" >
</Button>
<Button
android:id="@+id/button3"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="Frame Layout" >
</Button>
</LinearLayout>
<LinearLayout กำ�หนดรปู แบบ Layout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/button4"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="Absolute Layout" >
</Button>
<Button
android:id="@+id/button5"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="Table Layout" >
</Button>
<Button
android:id="@+id/button6"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="Exit" >
</Button>
</LinearLayout>
</LinearLayout>
</LinearLayout>
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 153
6. คลกิ แท็บ Graphical Layout จะปรากฏหน้าจอแนวนอนดงั รปู
6 คลกิ
7. แก้ไขโคด้ Java ในไฟล์ MyScreenOrientationActivity.java ดังนี้
package com.viewgroup.screenorient;
import android.app.Activity;
import android.os.Bundle;
public class MyScreenOrientationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
8. เมอ่ื รนั แอพพลิเคชนั จะแสดงหน้าจอในแนวตั้งดงั รูป
154 Android App Development ฉบับสมบูรณ์
9. กดป่มุ + เพือ่ เปล่ยี นหน้าจอเป็นแนวนอน จะได้ผลลพั ธ์ดงั รูป
10. ในกรณีที่ผู้อ่านต้องการจัดวางหน้าจอในแนวนอน หรือแนวต้ังเพียงอย่างเดียว สามารถท�ำได้
โดยเพมิ่ พรอ็ พเพอรต์ ้ี android:screenOrientation=“landscape” ของแทก็ Activity ในไฟล์ Android
Manifest.xml ดงั นี้
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.viewgroup.screenorient"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="12" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MyScreenOrientationActivity"
android:screenOrientation="landscape" เพมิ่ โค้ด
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
บทท่ี 7 รู้จักการใช้งานวิวกรุ๊ป (ViewGroup) ชนิดต่างๆ 155
สรุปท้ายบท
ในบทนี้เป็นการอธิบายถึงการใช้งานวิวกรุ๊ปส�ำหรับพัฒนาแอพพลิเคชัน เพ่ือออกแบบส่วนติดต่อกับ
ผใู้ ชง้ านไดอ้ ยา่ งเหมาะสม ทงั้ ListView, ScrollView, Image Switcher View, Options Menu และ TabWidget
แบบฝึกหัดท้ายบท
จงสรา้ งแอพพลเิ คชนั สำ� หรบั แสดงภาพในรปู แบบแคต็ ตาลอ็ ก (Catalog) หรอื Photo Gallery อยา่ งงา่ ย
โดยแบ่งเปน็ หมวดหมู่ เช่น ภาพวิว ภาพรถยนต์ ภาพที่อย่อู าศัย และภาพการต์ นู จากนนั้ เมอ่ื ผอู้ า่ นคลกิ เลือก
ในแตล่ ะหมวด แอพพลเิ คชนั กจ็ ะเปดิ คลังภาพในแต่ละหมวดขน้ึ มาแสดง
156 Android App Development ฉบับสมบูรณ์
8
การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS)
เนื้อหาในบทท่ี 8 จะเปน็ สว่ นของการฝึกพฒั นาแอพพลเิ คชนั รบั ส่งขอ้ ความสนั้ (SMS) ซ่งึ มใี ชง้ านอยู่
ทั่วไปบนเครือข่ายของโทรศัพทเ์ คลอ่ื นท่ี
การรับสง่ ขอ้ ความสนั้ หรอื ที่เรียกกนั ว่า SMS (Short Message Service) เป็นบรกิ ารทางการสอื่ สาร
ประเภทหนึ่ง ซ่ึงอนุญาตให้ผู้ใช้งานสามารถส่งข้อความส้ันๆ ไปยังอุปกรณ์สื่อสารอีกเคร่ืองหนึ่งได้ โดยทั่วไป
แลว้ จะเปน็ บรกิ ารทีใ่ ชใ้ นโทรศพั ทเ์ คล่อื นท่หี รือคอมพวิ เตอร์ทั่วไป
ทง้ั นบ้ี รกิ าร SMS นน้ั ไดถ้ กู พฒั นามาจากการสง่ เพจ (Page) โดยใชโ้ ปรโตคอล (Protocol) ตามมาตรฐาน
ของโทรศพั ทเ์ คลอื่ นท่ี และภายหลงั ไดถ้ กู พฒั นาขน้ึ บนเทคโนโลยโี ทรศพั ทเ์ คลอื่ นทแี่ บบ GSM (Global System for
Mobile Communications) ซง่ึ สามารถสง่ ขอ้ ความได้มากทส่ี ุดเปน็ จ�ำนวน 160 ตวั อกั ษร ซึ่งปัจจบุ นั การส่ง SMS
นนั้ สามารถส่งได้จากเครือ่ งหนึ่งไปยงั เครอ่ื งหนงึ่ (Unicast) หรือมากกวา่ 1 เคร่ือง (Broadcast) กไ็ ด้
โดยเนือ้ หาในบทนี้ จะแบ่งออกเปน็ ข้นั ตอนให้ศึกษาดังนี้
1. หลกั การทำ� งานของแอพพลเิ คชันรบั สง่ ขอ้ ความ
2. เริม่ ตน้ สร้างโปรเจก็ ต์
3. ออกแบบหน้าจอแอพพลเิ คชัน
4. เขยี นโคด้ กำ� หนดการทำ� งานของแอพพลเิ คชัน
5. ทดสอบการทำ� งานของแอพพลิเคชนั ผา่ นโทรศัพท์จำ� ลอง (Emulator)
หลักการท�ำงานของแอพพลิเคชันรับส่งข้อความ
สำ� หรบั การพฒั นาแอพพลเิ คชนั ใดๆ กต็ าม ผพู้ ฒั นาแอพพลเิ คชนั
จะต้องเข้าใจหลักการท�ำงานของแอพพลิเคชันในเบ้ืองต้นก่อน ซ่ึงในบทน้ี
ผู้อ่านจะได้ฝึกพัฒนาแอพพลิเคชันรับส่งข้อความ ซ่ึงมีรายละเอียดของ
แอพพลเิ คชนั ดังตอ่ ไปน้ี
ตัวอย่างแอพพลเิ คชนั รบั ส่ง SMS
ส�ำหรับการพัฒนาแอพพลิเคชันบน Android แอพพลิเคชันนั้นๆ จะต้องมีการตั้งค่าการอนุญาต
(Permission) ซ่งึ กค็ ือ การก�ำหนดให้แอพพลเิ คชันสามารถท�ำอะไรไดบ้ า้ ง เช่น คา่ INTERNET ก็คือ การ
อนุญาตให้แอพพลิเคชันนั้นๆ สามารถเช่ือมต่อกับอินเทอร์เน็ตได้
สำ� หรบั ในกรณขี องแอพพลเิ คชนั รบั สง่ SMS นน้ั คา่ SEND_SMS จะเปน็ การอนญุ าตใหแ้ อพพลเิ คชนั
รับส่ง SMS ได้ โดยสามารถส่งข้อความระหว่างกันได้นั่นเอง ซึ่งรายละเอียดการก�ำหนดค่า Permission
จะอธิบายในข้ันตอนการพัฒนาแอพพลิเคชันรับส่ง SMS ต่อไป
z หนา้ จอโทรศพั ท์จำ� ลอง หรือ Emulator จะมีส่วนประกอบตา่ งๆ ดังน้ี
1. ชอ่ งกล่องข้อความสำ� หรับใส่เลขหมายโทรศพั ท์ (Enter the phone number of recipient)
2. ช่องกลอ่ งขอ้ ความท่ใี ช้สำ� หรบั พมิ พ์ขอ้ ความ (Message)
3. ปุ่มกด (Button) ที่ใชส้ �ำหรับส่งขอ้ ความ (Send SMS)
z ก ารทำ� งานของแอพพลเิ คชันรับสง่ SMS ทจ่ี ะพัฒนา มีขัน้ ตอนการทำ� งานดังน้ี
1. เรมิ่ ต้นจากผู้ใชแ้ อพพลิเคชนั พมิ พห์ มายเลขโทรศัพท์
2. พิมพข์ อ้ ความทต่ี ้องการสง่ ไปยงั หมายเลขปลายทาง
3. ผูใ้ ช้คลิกปุ่ม Send SMS
4. ข้อความนน้ั จะถกู ส่งไปยังหมายเลขปลายทาง
ในส่วนของการทดสอบแอพพลิเคชนั รับสง่ SMS น้นั ให้จำ� ลอง Emulator ข้ึนมาเปน็ จำ� นวน 2 เครอ่ื ง
เพ่ือใชท้ ดสอบการรับส่งข้อความระหวา่ งกนั (Receive/Send SMS)
158 Android App Development ฉบับสมบูรณ์
เร่ิมต้นสร้างโปรเจ็กต์
เรม่ิ ต้นพัฒนาโปรแกรมโดยสร้างโปรเจ็กตส์ �ำหรบั เขียนโปรแกรม ซ่งึ ผู้อา่ นสามารถท�ำไดต้ ามขั้นตอน
ดังต่อไปน้ี
1. เปิดโปรแกรม Eclipse
2. คลิกเมนู File > New > Android Project
2 เลอื ก
3. จะปรากฏไดอะลอ็ กบ็อกซ์ New Android Project
4. ในส่วนแรกสำ� หรับกำ� หนดชื่อและรปู แบบของโปรเจก็ ต์ ในท่ีนตี้ ั้งชือ่ โปรเจก็ ต์ว่า SMS Droid
5. ในสว่ นของ Contents คลกิ เลอื ก Create new project in workspace เพ่อื สรา้ งโปรเจก็ ตใ์ หม่
6. คลกิ เครอ่ื งหมายถกู หนา้ Use default location เพอ่ื พฒั นาแอพพลเิ คชนั ในตำ� แหนง่ ทอ่ี ยเู่ ดยี วกนั
กบั โปรเจก็ ต์ Eclipse
7. คลกิ ปมุ่
4 ตั้งชือ่ โปรเจก็ ต์
5 เลอื ก
คลิก 6
7 คลกิ
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 159
8. จะปรากฏไดอะลอ็ กบอ็ กซ์ New Android 9 เลือก
Project ในสว่ นทสี่ อง สำ� หรบั เลอื กเวอรช์ นั
ของ Android
9. คลกิ เลอื กเวอรช์ นั ของ Android ทจ่ี ะพฒั นา
ในที่นีเ้ ลอื ก Android 4.0.3
10. คลกิ ป่มุ
10 คลกิ
11. จะปรากฏไดอะล็อกบ็อกซ์ New Android Project ในสว่ นที่สาม ส�ำหรับกำ� หนดรายละเอยี ดของ
แอพพลเิ คชนั
12. ต้งั ชือ่ ของแอพพลิเคชันคอื SMS Droid
13. ตัง้ ชอ่ื แพค็ เกจเป็น com.android.example.smsdroid
14. ตง้ั ชื่อแอ็คทวิ ติ ้ี ในทีน่ ี้ตัง้ ชอ่ื เป็น SMSDroidActivity
15. ในสว่ นของ Minimum SDK: คลกิ เลอื กเวอรช์ นั 15 ซง่ึ เปน็ เวอรช์ นั เดยี วกนั กบั API Level ทเ่ี ลอื ก
ในขอ้ 9
16. คลิกปุ่ม ซึ่งถือเปน็ อนั เสรจ็ สน้ิ การสร้างโปรเจ็กต์
12 ตง้ั ชอื่ แอพพลิเคชัน
13 ต้ังชื่อแพ็คเกจ
14 ตั้งชอ่ื แอค็ ทิวิตี้
15 เลอื กเวอร์ชัน
16 คลิก
160 Android App Development ฉบับสมบูรณ์
17. จะปรากฏโปรเจ็กต์ท่ี Package Explorer ซึง่ แสดงถงึ โครงสรา้ งของโปรเจก็ ต์ที่ได้สร้างขนึ้ มา
หลังจากท่ีสร้างโปรเจ็กต์เสร็จส้ินแล้ว ขั้นตอนต่อไปจะเป็นการแก้ไขไฟล์หลักๆ ซึ่งในบทนี้จะมี
4 ไฟล์ดังน้ี
1. ไฟล์ AndroidManifest.xml ซง่ึ ถูกใช้เพือ่ ก�ำหนดสิทธใ์ิ หโ้ ปรแกรมสามารถรบั และสง่ SMS ได้
2. ไฟล์ main.xml ซง่ึ จะใช้เป็นไฟลส์ �ำหรับสร้างหน้าจอท่อี ย่บู นอมี เู ลเตอร์ โดยสามารถกำ� หนดให้มี
รปู แบบตามความตอ้ งการได้
3. ไฟล์ SMSDroidActivity.java ซง่ึ เปน็ ไฟล์หลักท่ใี ชส้ ำ� หรับกำ� หนดการทำ� งานของแอพพลิเคชันใน
สว่ นของการส่งข้อความ
4. ไฟล์ SMSDroidReceiver.java ซง่ึ เปน็ ไฟลห์ ลกั ทใ่ี ชส้ ำ� หรบั กำ� หนดการทำ� งานของแอพพลเิ คชนั ใน
ส่วนของการรบั ข้อความ
ก�ำหนดสิทธิ์การท�ำงานให้แอพพลิเคชัน
การกำ� หนดสิทธ์กิ ารท�ำงานใหแ้ อพพลเิ คชนั เป็นการแกไ้ ขโค้ด XML ในไฟล์ AndroidManifest.xml
โดยจะแบง่ ออกเปน็ 2 สว่ นคอื
z สว่ นท่ี 1 ก�ำหนดใหแ้ อพพลเิ คชนั มีขีดความสามารถต่างๆ เช่น ในกรณขี องโปรแกรมรบั สง่ SMS
นั้นจะก�ำหนดสิทธิ์ให้แอพพลิเคชันสามารถรับส่ง SMS ได้จริงระหว่างแอพพลิเคชันสองเคร่ือง
ซง่ึ จะมีการเพิม่ แทรค็ การอนุญาตการใหส้ ทิ ธิ์ (Permission) ในไฟล์ AndroidManifest.xml ดงั น้ี
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 161
z ส ว่ นท่ี 2 จะเปน็ การเพ่มิ ความสามารถใหไ้ ฟล์ SMSDroidReceiver.java ให้สามารถดกั จับ SMS
ท่ีถูกสง่ เขา้ มายงั เครอ่ื งได้ (สว่ นนีจ้ ะเพมิ่ ในไฟล์ SMSDroidReceiver.java)
เพมิ่ โค้ด
ออกแบบหน้าจอแอพพลิเคชัน
การออกแบบหนา้ จอแอพพลเิ คชนั เปน็ การแก้ไขไฟล์ XML ส�ำหรับแอพพลเิ คชันรบั สง่ SMS (Short
Message Service) น้นั สามารถทำ� ได้โดยแกไ้ ขไฟล์ main.xml ซ่ึงเป็นไฟล์หลกั ส�ำหรับการออกแบบหนา้ จอของ
แอพพลิเคชนั โดยผอู้ ่านสามารถแกไ้ ขโค้ด XML ในไฟล์ main.xml ได้ดังนี้
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="5dip" >
<TextView 1 กำ�หนดคุณสมบัตขิ อง TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter the phone number of recipient"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText 2 กำ�หนดคณุ สมบตั ิของ EditText
android:id="@+id/txtPhoneNo"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
162 Android App Development ฉบับสมบูรณ์
<requestFocus />
</EditText>
<TextView 1 กำ�หนดคุณสมบตั ขิ อง TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Message"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText 2 กำ�หนดคณุ สมบตั ขิ อง EditText
android:id="@+id/txtMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="5" />
<Button 3 กำ�หนดคณุ สมบัติของ Button
android:id="@+id/btnSendSMS"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Send SMS" />
</LinearLayout>
ซึง่ ไดผ้ ลลพั ธด์ งั น้ี
หนา้ จอแอพพลิเคชันท่ตี ้องการพฒั นา
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 163
เขียนโค้ดก�ำหนดการท�ำงานของแอพพลิเคชัน
ในการเขยี นโค้ดกำ� หนดการท�ำงานของแอพพลเิ คชนั น้ี จะตอ้ งเขียน 2 สว่ นคอื โคด้ ในสว่ นของการ
สง่ ขอ้ ความและโคด้ ในสว่ นของการรับข้อความ ซึ่งมรี ายละเอียดดังน้ี
การเขียนโค้ดส่วนของการส่งข้อความ
เมื่อผู้อ่านสร้างหน้าจอแอพพลิเคชันเรียบร้อยแล้ว ขั้นตอนต่อไปคือ การเขียนโค้ด Java ที่ไฟล์
SMSDroidActivity.java เพอื่ ใชก้ ำ� หนดการทำ� งานในการสง่ ขอ้ ความระหวา่ ง Emulator ทงั้ 2 เครอ่ื ง โดยมขี น้ั ตอน
ดังตอ่ ไปน้ี
1. เร่มิ ตน้ โดยการดบั เบลิ คลกิ ไฟล์ SMSDroidActivity.java ขน้ึ มา ซ่งึ จะมีโค้ดดงั รปู
ทงั้ น้ี setContentView(R.layout.main) จะเปน็ สว่ นของการนำ� ไฟล์ main.xml มาวาด (Draw) เปน็ หนา้ จอ
ในสว่ นของ R.layout.main เปน็ การอา้ งองิ ไปยงั ไฟล์ main.xml ซง่ึ ผอู้ า่ นสามารถสรา้ งไฟล์ main.xml ขนึ้ มาใหมไ่ ด้
ทง้ั หมด เพอื่ ออกแบบหนา้ จอแอพพลเิ คชนั ตามความตอ้ งการไดเ้ อง โดยไมต่ อ้ งใช้ main.xml ทผี่ เู้ ขยี นสรา้ งไวก้ ไ็ ด้
2. แก้ไขโคด้ Java ในไฟล์ SMSDroidActivity.java ดงั นี้
package com.android.example.smsdroid;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class SMSDroidActivity extends Activity {
Button btnSendSMS;
EditText txtPhoneNo;
EditText txtMessage;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSendSMS = (Button) findViewById(R.id.btnSendSMS);
txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
164 Android App Development ฉบับสมบูรณ์
txtMessage = (EditText) findViewById(R.id.txtMessage);
btnSendSMS.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String phoneNo = txtPhoneNo.getText().toString();
String message = txtMessage.getText().toString();
if (phoneNo.length() > 0 &&message.length() > 0) {
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNo, null, message, null, null);
} else {
Toast.makeText(getBaseContext(),
"Please enter both phone number and message.",
Toast.LENGTH_SHORT).show();
}
}
});
}
}
อธิบายโค้ดการทำ� งานของแอพพลเิ คชัน
1. นำ� เข้าคลาส SmsManager ท่ใี ช้ในการรับสง่ SMS
import android.telephony.SmsManager;
2. เขยี นโค้ดหลกั เพ่อื ใชอ้ า้ งองิ ไปยัง SendSMS (Button), PhoneNo (EditText) และ Message
(EditText) จากอิลิเมนต์ของไฟล์ main.xml ทง้ั น้ใี นการรบั ส่ง SMS นนั้ ผ้อู ่านจะตอ้ งใส่หมายเลข
โทรศัพท์ และพิมพ์ข้อความท่ีจะส่งลงในกล่องข้อความ จากน้ันคลิกปุ่ม Send SMS ซ่ึงการ
อ้างอิงน้ันก็เพื่อใช้จัดการกับค่าท่ีพิมพ์เข้ามานั่นเอง โดยจะสังเกตได้ว่าจะเป็นการน�ำค่ามาใช้ใน
ข้นั ตอนตอ่ ไป
public class SMSDroidActivity extends Activity {
Button btnSendSMS;
EditText txtPhoneNo;
EditText txtMessage;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); 1 วาดหน้าจอ
setContentView(R.layout.main); 2 อ้างอิงไปยงั ปุ่ม Send SMS
btnSendSMS = (Button) findViewById(R.id.btnSendSMS);
txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo); 3 อา้ งอิงไปยงั ชอ่ งกรอกหมายเลข
txtMessage = (EditText) findViewById(R.id.txtMessage);
btnSendSMS.setOnClickListener(new View.OnClickListener() { โทรศพั ท์ปลายทาง
public void onClick(View v) { 4 อา้ งอิงไปยังชอ่ งกรอกขอ้ ความ
String phoneNo = txtPhoneNo.getText().toString(); 5 รบั หมายเลขโทรศัพทป์ ลายทาง
String message = txtMessage.getText().toString(); 6 รับข้อความ
if (phoneNo.length() > 0 &&message.length() > 0) {
7 ตรวจสอบการกรอกหมายเลข
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNo, null, message, null, null); โทรศพั ท์ปลายทาง
} else {
Toast.makeText(getBaseContext(),
"Please enter both phone number and message.",
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 165
Toast.LENGTH_SHORT).show();
}
}
});
}
}
การเขียนโค้ดส่วนของการรับข้อความ
หลงั จากท่ผี ู้อ่านได้เขยี นโปรแกรมส�ำหรับสง่ SMS เรยี บรอ้ ยแลว้ ในสว่ นน้ผี ู้อา่ นจะได้เขยี นโปรแกรม
สำ� หรบั รับ SMS ทถี่ กู สง่ มายงั เครือ่ ง โดยมีขัน้ ตอนดังตอ่ ไปนี้
1. สร้างไฟล์ SMSDroidReceiver.java โดยคลิกขวาที่ com.android.example.smsdr
2. เลือกคำ� ส่งั New > Class
1 คลกิ ขวา
2 เลือก
3. จะปรากฏไดอะล็อกบอ็ กซ์ New Java
Class
4. ตัง้ ชอ่ื คลาสคอื SMSDroidReceiver
5. คลิกปุ่ม
4 ตัง้ ช่ือคลาส
5 คลิก
166 Android App Development ฉบับสมบูรณ์
6. จะปรากฏหน้าต่างส�ำหรบั เขียนโคด้ ลงในไฟล์ SMSDroidReceiver.java ดังรูป
7. แกไ้ ขโค้ด Java ในไฟล์ SMSDroidReceiver.java ดังนี้
package com.android.example.smsdroid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class SMSDroidReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
if (messages.length > -1) {
Toast.makeText(context, "Message From :"
+ messages[0].getOriginatingAddress()
+ "\n" + messages[0].getMessageBody(),
Toast.LENGTH_LONG).show();
}
}
}
}
}
อธิบายโคด้ การท�ำงานของแอพพลิเคชัน
1. สรา้ งคลาส SMSDroidReceiver โดยขยายมาจากคลาส BroadcastReceiver เพอื่ ดกั จบั เหตกุ ารณ์
ตา่ งๆ ของตัวเครอื่ งเมือ่ มกี ารเปล่ียนแปลง
public class SMSDroidReceiver extends BroadcastReceiver {
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 167
2. เขยี นโค้ด Override เมธอด onReceive() เพือ่ ตรวจสอบว่าเครอื่ งไดร้ ับ SMS และหากเคร่อื ง
ได้รับ SMS เขา้ มาใหม่ ก็จะแสดงข้อความที่ไดร้ บั ออกทางหนา้ จอ
@Override รบั ขอ้ ความ
public void onReceive(Context context, Intent intent) { มาเก็บใน
messages[i]
if (intent.getAction().equals(SMS_RECEIVED)) { สว่ นแสดง
Bundle bundle = intent.getExtras(); Message
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
if (messages.length > -1) {
Toast.makeText(
context,
"Message From :"
+ messages[0].getOriginatingAddress()
+ "\n" + messages[0].getMessageBody(),
Toast.LENGTH_LONG).show();
}
}
}
}
ทดสอบการท�ำงานของแอพพลิเคชันผ่านโทรศัพท์
จ�ำลอง (Emulator)
หลังจากการพัฒนาแอพพลิเคชันเสร็จส้ินแล้ว
ขั้นตอนต่อไปคือ ทดสอบการท�ำงานของแอพพลิเคชัน ซ่ึง
ผู้เขียนจะไม่กล่าวซ�้ำอีก โดยผู้อ่านสามารถอ่านทบทวนได้จาก
บททผี่ า่ นมา อย่างไรก็ตามในหวั ข้อนจ้ี ะอธิบายถงึ การรัน AVD
จ�ำนวน 2 เครอื่ งพร้อมๆ กนั เพอื่ ให้สง่ ขอ้ ความระหวา่ งกัน โดย
มขี น้ั ตอนตา่ งๆ ดงั ต่อไปน้ี
1. สร้าง AVD ใหมข่ ึ้นมา ให้ตั้งชื่อวา่ AVD1 โดยมี
คณุ สมบตั ดิ ังนี้
168 Android App Development ฉบับสมบูรณ์
2. สรา้ ง AVD ใหมข่ ้ึนมา ใหต้ ัง้ ชื่อวา่ AVD2 โดยมคี ุณสมบัติดังน้ี
3. ผอู้ า่ นจะได้ AVD จำ� นวน 2 เครอื่ งคือ AVD1 และ AVD2
4. จากนัน้ ให้ผอู้ า่ นเปิดใชเ้ ครื่อง AVD1 และ AVD2
4.1 เลือก
4.4 เลอื ก
คลกิ 4.2
4.5 คลกิ 4.6 คลิก
คลกิ 4.3
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 169
5. จะปรากฏ Emulator 2 เคร่ืองคือ AVD1 และ AVD2 ดังรูป
6. รันแอพพลเิ คชันรับสง่ SMS จากโปรเจก็ ตต์ ามข้นั ตอนต่อไปน้ี
6.1 คลิกเมนู Run > Run Configurations...
6.2 คลกิ เลอื ก Android Application เปน็ SMS Droid
6.3 ในแท็บ Target คลิกเลือก AVD1
6.4 คลิกปุม่
6.1 เลอื ก
เลือก 6.2
เลือก 6.3
6.4 คลิก
170 Android App Development ฉบับสมบูรณ์
7. รันแอพพลิเคชันรับสง่ SMS อีกครงั้ โดยเลือก Target เป็น AVD2 ตามข้ันตอนในข้อ 6
8. จะปรากฏเคร่อื ง Emulator ตน้ ทางและเครอื่ ง Emulator ปลายทางข้นึ มา
9. กรอกหมายเลขปลายทางในเครอื่ ง Emulator ต้นทาง
10. กรอกข้อความในเครอ่ื ง Emulator ต้นทาง
11. คลิกป่มุ Send SMS ในเครอื่ ง Emulator ต้นทางเพ่ือส่งขอ้ ความ
12. เคร่ืองปลายทางจะไดร้ บั ข้อความ และแสดงข้อความออกทางหน้าจอ
กรอกหมายเลขปลายทาง 9 10 กรอกข้อความ
12 รบั ขอ้ ความ 11 คลกิ
ส�ำหรับการทดสอบการท�ำงานของแอพพลิเคชันรับส่งข้อความ SMS นั้น ในช่องที่ใส่ตัวเลข 5556
จะหมายถึง หมายเลขโทรศัพท์ปลายทางท่ีจะส่งข้อความ SMS ไปถึง แต่ความเป็นจริงแล้วหมายเลข
5556 น้ีจะเป็นหมายเลขโทรศัพท์เคลื่อนท่ีจริงปลายทาง แต่ในตัวอย่างน้ีหมายเลข 5556 จะใช้เป็นการ
จ�ำลองหมายเลขโทรศัพท์ส�ำหรับการทดสอบบน Emulator เท่าน้ัน
หรืออีกนัยหน่ึงคือ ค่าพอร์ต (Port) ซึ่งเครื่องโทรศัพท์จ�ำลองในแต่ละเคร่ืองก็จะมีหมายเลขประจ�ำ
เครื่องด้วยเช่นกัน โดยจากตัวอย่างข้างต้นเป็นการรันแอพพลิเคชันที่เครื่องหมายเลข 5554 และจัดส่ง
ข้อความไปยังเคร่ืองท่ีมีหมายเลข 5556 เป็นต้น
สรุปท้ายบท
ในบทนเี้ ปน็ การอธบิ ายถงึ ตวั อยา่ งของการพฒั นาแอพพลเิ คชนั ทใี่ ชง้ านการรบั สง่ ขอ้ ความสนั้ (SMS)
ซึง่ มกี ารอนุญาตผา่ นทางฟังกช์ ัน SEND_SMS ในไฟล์ AndroidManifest.xml
บทท่ี 8 การพัฒนาแอพพลิเคชันรับส่งข้อความ (SMS) 171
แบบฝึกหัดท้ายบท
แบบฝึกหัดในบทน้ีให้ผู้อ่านพัฒนาแอพพลิเคชันเพ่ิมเติม โดยเพ่ิมการส่ง SMS ไปยังเคร่ืองหลาย
เคร่อื งพรอ้ มๆ กนั เชน่ ขอ้ ความจากเครื่อง 5554 จะถูกจัดสง่ ไปยงั เครื่อง 5555 และ 5556 ดว้ ยข้อความ
เดียวกนั และพรอ้ มๆ กัน
172 Android App Development ฉบับสมบูรณ์
9
การพัฒนาแอพพลิเคชันติดต่อกับ GPS
และการอ้างอิงกับระบบแผนที่ (Map)
เนอื้ หาในบทน้ี จะเปน็ การฝกึ พฒั นาแอพพลเิ คชนั ตดิ ตอ่ กบั ระบบ GPS (Global Positioning System) และ
การอา้ งองิ กบั ระบบแผนท่ี (Google Map) ซง่ึ จดุ ประสงคข์ องบทนจี้ ะเปน็ การเรยี กใชง้ านคลาส LocationManager
ท่รี ะบถุ ึงค่าพิกัดและนำ� ค่านั้นมาแสดงบนแผนที่
ความรู้พื้นฐานเก่ียวกับ GPS
ระบบกำ� หนดต�ำแหน่งบนโลก หรอื GPS (Global Positioning System) เปน็ ระบบทร่ี ะบุต�ำแหนง่ บน
พื้นโลก โดยค�ำนวณจากค่าสัญญาณนาฬิกาท่ีส่งมาจากดาวเทียมที่โคจรอยู่รอบโลก ท�ำให้ทราบต�ำแหน่งท่ี
แน่นอน จงึ สามารถระบตุ ำ� แหน่งต่างๆ ของอุปกรณ์รบั สญั ญาณตา่ งๆ ได้อย่างถูกตอ้ ง
ดาวเทยี ม GPS เปน็ ดาวเทยี มที่ใช้บนวงโคจรระดบั กลาง หรือ MEO (Medium Earth Orbit) ซง่ึ โดย
ท่ัวไปนั้นจะมวี งโคจรทร่ี ะดับความสูงประมาณ 20,000 กิโลเมตร
ซึ่งการยืนยันต�ำแหน่งต่างๆ จะอาศัยค่าพิกัดจากดาวเทียมอย่าง
นอ้ ย 4 ดวง โดยปกติแล้วดาวเทยี มแตล่ ะดวงจะโคจรรอบโลกเป็นเวลา 12
ช่วั โมงต่อหน่งึ รอบ โดยมคี วามเรว็ ประมาณ 4 กโิ ลเมตร/วินาที (km/s) และ
การโคจรในแต่ละรอบนั้นจะแบ่งออกเป็น 6 ระนาบ ซึ่งแต่ละระนาบจะมี
ดาวเทียมจ�ำนวน 4 ดวง โดยท�ำมมุ ท่ี 55 องศา (Degree) ดงั น้ัน โดยรวม
แลว้ ทงั้ ระบบจะตอ้ งมีดาวเทียมอยา่ งน้อยจำ� นวน 24 ดวง
โดยทั่วไปแล้วอุปกรณ์รับสัญญาณในปัจจุบัน จะผนวกเข้ากับ
ระบบแผนที่เพ่ือใช้ระบุรายละเอียดของสถานที่ต่างๆ รวมไปถึงสามารถนำ�
มาประยกุ ต์ใชใ้ นการนำ� ทางไดอ้ ีกดว้ ย
ตวั อยา่ งแอพพลเิ คชนั ติดตอ่ กับ GPS และการอ้างอิงกับระบบแผนที่ (Map)
ในบทนีผ้ เู้ ขยี นจะแบ่งการศกึ ษาออกเป็น 2 ส่วนหลกั ๆ คอื
z การอา่ นตำ� แหน่งพิกัดของระบบ GPS
z การแสดงผลคา่ พกิ ัดน้ันๆ บน Google Map
การอ่านต�ำแหน่งพิกัดของระบบ GPS
ส�ำหรับการพัฒนาแอพพลิเคชันเพื่อใช้งานระบบ GPS บนระบบปฏิบัติการ Android นั้นมีขั้นตอน
ที่ไมซ่ บั ซอ้ นมากนัก ซ่ึงสามารถท�ำได้โดยอาศัยคลาส LocationManager ซึ่งคลาสดังกลา่ วได้ผนวกอยูใ่ น API
(Application Programming Interface) เรียบรอ้ ยแล้ว
ท้งั นีก้ ารพัฒนาแอพพลิเคชนั อา่ นต�ำแหนง่ พิกัดค่าละติจูด (Latitude) และค่าลองจิจดู (Longitude)
ของระบบ GPS นน้ั สามารถแบง่ ออกไดเ้ ป็น 4 ขนั้ ตอนคือ
1. เริม่ ต้นสรา้ งโปรเจ็กต์
2. ออกแบบหนา้ จอแอพพลิเคชนั
3. เขยี นโค้ดกำ� หนดการทำ� งานของแอพพลิเคชนั
4. ทดสอบการทำ� งานของแอพพลเิ คชันผ่านโทรศพั ท์จำ� ลอง (Emulator)
อย่างไรก็ตามข้ันตอนในบางข้ันตอน ผู้เขียนได้กล่าวไว้แล้วในบทท่ีผ่านมา ดังน้ัน ในบทนี้ผู้เขียนจะ
ไมก่ ลา่ วซ�ำ้ ในบางข้ันตอน ซ่งึ ผ้อู า่ นสามารถศกึ ษาทบทวนได้ในบทท่ี 3 ถงึ บทท่ี 8
เริ่มต้นสร้างโปรเจ็กต์
เร่ิมต้นพัฒนาแอพพลิเคชันโดยสร้างโปรเจ็กต์ส�ำหรับเขียนโปรแกรม ซ่ึงผู้อ่านสามารถท�ำได้ตาม
ขั้นตอนดงั ต่อไปน้ี
1. เปดิ โปรแกรม Eclipse สรา้ งโปรเจ็กตท์ ่มี คี ณุ สมบัติดังนี้
เลอื ก 1.2 1.1 ตั้งชอื่ โปรเจก็ ต์
คลิก 1.3
1.4 คลิก
174 Android App Development ฉบับสมบูรณ์
เลอื ก 1.5
เลือกเวอร์ชนั 1.10 1.7 ตง้ั ชื่อแอพพลิเคชัน
1.8 ตัง้ ช่อื แพค็ เกจ
1.6 คลกิ
1.9 ตัง้ ช่ือแอค็ ทวิ ิต้ี
2. จะปรากฏโปรเจ็กตท์ ่ี Package Explorer ซง่ึ แสดงถงึ โครงสร้างของโปรเจก็ ตท์ ่ไี ด้สรา้ งขนึ้ มา
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนท่ี (Map) 175
ก�ำหนดสิทธิ์การท�ำงานให้แอพพลิเคชัน
ก�ำหนดสิทธิ์การท�ำงานให้แอพพลิเคชนั เป็นการแกไ้ ขโคด้ XML ในไฟล์ AndroidManifest.xml ซง่ึ
เปน็ การอนญุ าตให้แอพพลิเคชนั มีขีดความสามารถต่างๆ เพม่ิ ข้ึน เช่น ในกรณขี องแอพพลิเคชันอา่ นคา่ พกิ ดั น้นั
จะเป็นการก�ำหนดสิทธ์ิให้แอพพลิเคชันสามารถอ่านค่าพิกัด (ค่าละติจูดและค่าลองจิจูด) ได้จริง โดยเพิ่มโค้ด
การอนญุ าตการใหส้ ทิ ธ์ิ (Permission) ในไฟล์ AndroidManifest.xml ดังน้ี
" "<uses-permission android:name= android.permission.ACCESS_FINE_LOCATION />
แสดงไดด้ ังรปู
เพ่มิ โค้ด
เขียนโค้ดก�ำหนดการท�ำงานของแอพพลิเคชัน
เม่ือผู้อ่านแก้ไขไฟล์ AndroidManifest.xml แล้ว ข้ันตอนต่อไปคือ การเขียนโค้ด Java ในไฟล์
SampleGPSActivity.java เพอื่ ใชใ้ นการอา่ นคา่ พกิ ดั โดยเรยี กใชง้ านคลาส LocationManager เพอ่ื ขอเขา้ ใชง้ าน
การอ่านพิกัดของระบบ GPS ซง่ึ มีโคด้ ดงั น้ี
package com.android.example.simplegps;
import android.app.Activity; เรยี กใชง้ านคลาส LocationListener และคลาส LocationManager
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class SampleGPSActivity extends Activity {
private LocationManager lm;
private LocationListener locationListener;
176 Android App Development ฉบับสมบูรณ์
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1,
locationListener);
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location loc) {
if (loc != null) {
Toast.makeText(
getBaseContext(),
" " Location changed \nLat: + loc.getLatitude()
" " + \nLng: + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
}
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
}
อธิบายโคด้ การท�ำงานของแอพพลเิ คชัน
1. การสรา้ งออบเจ็กตข์ องคลาส LocationManager นั้น สามารถเรียกใชง้ านได้โดยตรงดังน้ี
getSystemService(Context.LOCATION_SERVICE);
2. การลงทะเบียนให้แอพพลิเคชัน สามารถรับการแจ้งเตือนบริการประเภทต่างๆ จากระบบได้น้ัน
จะมรี ูปแบบค�ำส่งั ดังน้ี
requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
โดยจะตอ้ งระบุพารามเิ ตอร์ตา่ งๆ ดงั ต่อไปนี้
z provider คือ ชอ่ื สิง่ ที่ต้องการขอการบรกิ าร ซง่ึ ในทน่ี ้ใี ห้กำ� หนดเป็นค่า LocationManager.
GPS_PROVIDER เพราะแอพพลิเคชนั น้มี กี ารเรียกใช้งาน GPS
z minTime คือ ระยะเวลาที่ห่างกันในการแจ้งเตือนแต่ละวงรอบ ซึ่งมีหน่วยเป็นมิลลิวินาที
(millisecond)
z minDistance คอื การแจ้งเตอื นเมือ่ มีการเปลยี่ นตำ� แหนง่ ตามระยะหา่ งที่กำ� หนด ซ่ึงมีหน่วย
เป็นเมตร (meter)
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนท่ี (Map) 177
z l istener คือ ออบเจ็กตข์ องคลาส LocationListener ทใ่ี ชส้ �ำหรับดักจบั เมอ่ื มีการแจง้ เตอื น
มายังแอพพลเิ คชนั
3. สรา้ งคลาส MyLocationListener ซงึ่ พฒั นามาจากคลาส LocationListener ซงึ่ เปน็ Inner Class
ไว้ส�ำหรับการตรวจจับในระบบ GPS โดยเฉพาะ ในกรณีท่ีมีการเปลี่ยนแปลงค่าต�ำแหน่ง ซ่ึงมี
จ�ำนวน 4 เมธอด (Method) ดงั ตอ่ ไปนี้
z o nLocationChanged(Location loc) จะถกู เรยี กใช้งานเมอ่ื มีการเปลย่ี นแปลงตำ� แหน่ง
z o nProviderDisabled(String provider) จะถูกเรยี กใชง้ านเมอื่ ปิดการใชง้ าน
z onProviderEnabled(String provider) จะถูกเรียกใชง้ านเมอื่ เปดิ การใช้งาน
z o nStatusChanged(String provider, int status, Bundle extras) จะถกู เรยี กใชง้ านเมอื่ มกี าร
เปลยี่ นแปลงสถานะ
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location loc) {
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
4. ในสว่ นของเมธอด onLocationChanged ของคลาส MyLocationListener มหี นา้ ทแี่ สดงตำ� แหนง่
พิกดั ปจั จบุ นั ออกมาทางหนา้ จอ โดยผอู้ า่ นสามารถก�ำหนดค่าอืน่ ๆ ไดเ้ พิ่มเติม เช่น
z g etAccuracy() ซ่งึ ใช้ในกรณีที่มคี ่าความคลาดเคล่อื นในหนว่ ยเมตร
z getAltitude() ซ่ึงใช้ในกรณที ีม่ ีคา่ ระดับเหนอื น้�ำทะเล มหี นว่ ยเปน็ ฟุต
z g etSpeed() ซึ่งใช้ในกรณที ม่ี คี ่าความเร็วในหน่วยเมตรตอ่ วินาที
public void onLocationChanged(Location loc) {
if (loc != null) {
Toast.makeText(
getBaseContext(),
" " Location changed \nLat: + loc.getLatitude()
" " + \nLng: + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
}
}
178 Android App Development ฉบับสมบูรณ์
ทดสอบการท�ำงานของแอพพลิเคชันผ่านโทรศัพท์จ�ำลอง
(Emulator)
หลังจากการเขียนโค้ดก�ำหนดการท�ำงานของแอพพลิเคชัน
เสร็จสิ้นแล้ว ขั้นตอนต่อไปคือ ทดสอบการท�ำงานของแอพพลิเคชัน
ท้ังนี้ผู้อ่านสามารถอ่านทบทวนได้จากบทที่ 2 โดยสร้าง Emulator ที่
มีคณุ สมบตั ดิ ังรปู
จากน้ันให้รันแอพพลิเคชันบน Emulator ที่สร้างข้ึนมา
เมื่อรันแอพพลิเคชันขึ้นมาแล้ว ผู้อ่านจะต้องส่งค่าพิกัดที่แตกต่างกัน
ให้แอพพลเิ คชัน เพือ่ ตรวจสอบวา่ แอพพลิเคชนั สามารถแสดงคา่ พกิ ัด
ได้ถกู ต้องหรือไม่
ในกรณนี ีจ้ ะใชง้ าน Emulator Control เปน็ เครอื่ งมือในการ
ส่งค่าพิกัด ซ่ึงมีข้ันตอนการทดสอบดังต่อไปน้ี (ผู้อ่านสามารถศึกษา
ส่วนของ Emulator Control ไดใ้ นบทที่ 14 เทคนคิ ในการแก้ไขปัญหา
สำ� หรับการพัฒนาแอพพลิเคชนั )
1. คลิกเมนู Window > Open Perspective > DDMS
1 คลิก
ในกรณีท่ีผู้อ่านไม่พบเมนูดังข้อ 1 ให้ท�ำตามขั้นตอนดังน้ี
1. คลิกเมนู Window > Open Perspective > Other...
2. จะปรากฏไดอะล็อกบ็อกซ์ Open Perspective แล้วคลิกเลือก DDMS
3. คลิกปุ่ม
2 เลอื ก
1 เลือก
3 คลิก
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนท่ี (Map) 179
2. คลิกเลือก Device ท่ตี ้องการทดสอบ
3. ใหผ้ อู้ ่านมาท่ีแท็บ Emulator Control
4. คลกิ ปุม่
5. สงั เกตหนา้ จอ Emulator จะปรากฏข้อความแจง้ เตอื นสำ� หรับการเปล่ยี นค่าต�ำแหนง่ ดงั รูป
2 เลือก 5 ขอ้ ความแจ้งเตือน
3 เลอื ก
4 คลิก
ส�ำหรับการใช้งานเคร่ืองมือ DDMS (Dalvik Debug Monitor Server) น้ันอาจจะไม่สะดวกในการ
สงั เกตผลลพั ธข์ องการทำ� งานเมอ่ื มกี ารพฒั นาแอพพลเิ คชนั บน Eclipse ดงั นนั้ ผอู้ า่ นสามารถจำ� ลองวธิ กี าร
ส่งค่าพิกัดได้อีกวิธีหน่ึงคือ ให้เปิด Command Prompt จากนั้นพิมพ์ค�ำส่ัง "C:\telnet localhost 5554"
สงั เกตผลลพั ธก์ ารทำ� งานบน Emulator ซงึ่ กจ็ ะไดผ้ ลลพั ธเ์ ชน่ เดยี วกนั กบั การทำ� งานบน Eclipse ทง้ั นี้
คา่ พอรต์ ท่ี 5554 จะขนึ้ อยกู่ บั พอรต์ ที่ Emulator เลอื กใช้ โดยผอู้ า่ นสงั เกตตวั เลขนไี้ ดจ้ าก Emulator ทเ่ี ปดิ
ขึ้นใช้งาน แสดงได้ดังตัวอย่างต่อไปน้ี
180 Android App Development ฉบับสมบูรณ์
วิธีการหาค่าพิกัด (ค่าละติจูดและค่าลองจิจูด) ส�ำหรับสถานท่ีต่างๆ นั้นสามารถท�ำได้ผ่านเว็บไซต์
http://maps.google.co.th ตวั อยา่ งเชน่ แสดงการคน้ หาทอี่ ยขู่ องมหาวทิ ยาลยั ขอนแกน่ ซงึ่ มขี น้ั ตอนดงั นี้
1. คลิกขวาที่หมุด จะเห็นกล่องข้อความปรากฏข้ึนมา
2. เลือกค�ำส่ัง "นี่คืออะไร"
3. จะปรากฏหน้าจอที่แสดงค่าละติจูดและค่าลองจิจูดบนกล่องข้อความค้นหาด้านบน ซ่ึงในกรณีนี้
ค่าที่ได้คือ 16.474362, 102.82156
ซง่ึ สามารถนำ� คา่ ทงั้ สองไปใสใ่ นชอ่ ง Latitude และ Longitude ของเครอื่ งมอื Emulator Control ได้
1 คลกิ ขวา
เลือก 2
3 แสดงคา่ ละติจดู และคา่ ลองจิจูด
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนท่ี (Map) 181
การแสดงผลค่าพิกัดบน Google Map
หลังจากท่ีเขียนโค้ดเพ่ือก�ำหนดค่าพิกัดผ่านระบบ GPS ได้แล้ว ข้ันตอนต่อไปคือ การน�ำค่าพิกัดท่ี
ไดไ้ ปแสดงบนแผนท่ี Google Map เพื่อแสดงตำ� แหนง่ ปจั จบุ นั หรอื คา่ พิกดั น้ันบนแผนที่ ซง่ึ สามารถแบง่ ออก
เปน็ 5 ขนั้ ตอนดงั น้ี
1. สรา้ ง Google API Key
2. ออกแบบหน้าจอแอพพลิเคชนั
3. เขียนโคด้ กำ� หนดการทำ� งานของแอพพลิเคชัน
4. ทดสอบการท�ำงานของแอพพลิเคชนั ผ่านโทรศัพทจ์ �ำลอง (Emulator)
5. ปรับแต่งแอพพลิเคชนั เพอื่ แสดงแผนทีใ่ นรูปแบบตา่ งๆ และเพิม่ Marker
สร้าง Google API Key
การสรา้ ง Google API Key เป็นข้นั ตอนโดยรวมในการขออนญุ าตเข้าใชแ้ ผนทขี่ อง Google โดยมี
ขั้นตอนตา่ งๆ ดังตอ่ ไปนี้
1. ใหผ้ ู้อ่านคดั ลอกไฟล์ debug.keystore เก็บไว้ ซึ่งโดยปกติแลว้ จะอยู่ท่ีไดเร็คทอรี C:\username\
<username>\.android แตอ่ ยา่ งไรกต็ ามผอู้ า่ นสามารถใชฟ้ งั กช์ นั การคน้ หาขอ้ มลู ของ Windows
ค้นหาไฟลน์ ไี้ ด้เช่นกนั ในท่ีนเ้ี ก็บไฟล์ debug.keystore ไว้ที่ไดรว์ D:\android_key
2. เปดิ Command Prompt และเขา้ ไปยงั ไดเรค็ ทอรขี อง JDK ในทนี่ อี้ ยทู่ ไี่ ดเรค็ ทอรี C:\Program Files\
Java\jdk1.6.0_24\bin
3. พมิ พ์ค�ำสง่ั ด้านล่างแลว้ กดป่มุ
" "keytool.exe -list -alias androiddebugkey -keystore D:\android_key\debug.keystore -store-
pass android -keypass android -v
จากนน้ั จะปรากฏ Certificate สำ� หรับใชง้ าน Google API ขึน้ มาดังรูป
182 Android App Development ฉบับสมบูรณ์
4. คดั ลอก Certificate Fingerprint (MD5) เก็บไว้ 3 พิมพ์คำ�ส่งั
คดั ลอกเก็บไว้ 4
5. ใหผ้ อู้ า่ นเขา้ เวบ็ ไซต์ http://code.google.com/intl/th-TH/android/maps-api-signup.html เพอื่ สรา้ ง
Google API Key
6. คลกิ เครอ่ื งหมายถกู หนา้ I have read and agree with the terms and conditions ซง่ึ จะเปน็ การ
ยอมรบั ข้อก�ำหนดตา่ งๆ ในการขอเขา้ ใชง้ าน Google Map
7. กรอก Certificate Fingerprint ในช่อง My certificate’s MD5 fingerprint:
8. คลกิ ปุ่ม
6 คลกิ
คลกิ 8 7 กรอก Certificate Fingerprint
9. จะปรากฏ API Key และให้ผู้อ่านคัดลอก API Key เก็บไว้เพ่ือใช้ส�ำหรับการออกแบบหน้าจอ
แอพพลิเคชันในส่วนตอ่ ไป
คดั ลอกเก็บไว้ 9
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนท่ี (Map) 183
ก�ำหนดสิทธิ์การท�ำงานให้แอพพลิเคชัน
ก�ำหนดสิทธิก์ ารท�ำงานใหแ้ อพพลเิ คชนั เปน็ การแกไ้ ขโคด้ XML ในไฟล์ AndroidManifest.xml ซึ่ง
เปน็ การอนญุ าตใหแ้ อพพลเิ คชนั สามารถใชง้ านอนิ เทอรเ์ นต็ ไดโ้ ดยเพม่ิ permission สำ� หรบั ใชง้ านอนิ เทอรเ์ นต็
ดังน้ี
" "<uses-permission android:name= android.permission.INTERNET />
และเพม่ิ permission ส�ำหรบั ใชง้ าน library maps ดังนี้
" "<uses-library android:name= com.google.android.maps />
ซงึ่ ไดโ้ ค้ดท่ีแก้ไขแล้วดงั น้ี
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.example.simplegps"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
เพิ่มโคด้
<uses-permission android:name="android.permission.INTERNET" />
<application เพมิ่ โคด้
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="com.google.android.maps" />
<activity
android:name=".SampleGPSActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ออกแบบหน้าจอแอพพลิเคชัน
การออกแบบหน้าจอแอพพลเิ คชนั เป็นการแก้ไขโคด้ XML ในไฟล์ main.xml ในทน่ี ้ีคือ ออกแบบ
ส�ำหรบั แอพพลิเคชันเพอื่ ใช้แสดงค่าพิกัดบน Google Map ซ่ึงจะไม่มกี ารวาดหนา้ จอแอพพลิเคชนั เพยี งแต่
เปน็ การใสค่ า่ คณุ สมบตั ขิ องคา่ API Key ทไี่ ดร้ บั จากเวบ็ ไซตข์ อง Google โดยแกไ้ ขโคด้ XML ในไฟล์ main.xml
ดังน้ี
184 Android App Development ฉบับสมบูรณ์
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" 1 กำ�หนดคุณสมบตั ิของ Layout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:id="@+id/mapview1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="<google_api_key>" กรอก Key ท่ีไดจ้ ากหัวขอ้ สร้าง Google API Key
/>
</LinearLayout>
เขียนโค้ดก�ำหนดการท�ำงานของแอพพลิเคชัน
เม่ือผู้อ่านออกแบบหน้าจอแอพพลิเคชันเรียบร้อยแล้ว ต่อไปจะเป็นการเขียนโค้ดก�ำหนดการท�ำงาน
ของแอพพลเิ คชนั โดยแก้ไขโคด้ Java ในไฟล์ SampleGPSActivity.java เพ่อื น�ำค่าพิกดั GPS มาแสดงบน
Google Map ในแอพพลิเคชัน
โดยใหผ้ อู้ า่ นแก้ไขโคด้ Java จากไฟลเ์ ดิมดังน้ี
1. แก้ไขจาก SampleGPSActivity extends Activity เป็น SampleGPSActivity extends
MapActivity
2. ให้ Override เมธอด isRouteDisplayed()
ซ่งึ มโี ค้ดดังนี้
package com.android.example.simplegps;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.content.Context; 1 แก้ไขโค้ด
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class SampleGPSActivity extends MapActivity {
private LocationManager lm;
private LocationListener locationListener;
private MapView mapView;
private MapController mc;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนที่ (Map) 185
mapView = (MapView) findViewById(R.id.mapview1);
mapView.setBuiltInZoomControls(true);
mc = mapView.getController();
mc.setZoom(14);
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1,
locationListener);
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location loc) {
if (loc != null) {
Toast.makeText(getBaseContext(), "Location changed\nLat: "
+ loc.getLatitude()
+ "\nLng: " + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
int lat = (int) (loc.getLatitude() * 1E6);
int lng = (int) (loc.getLongitude() * 1E6);
GeoPoint point = new GeoPoint(lat, lng);
mc.animateTo(point); // mapController.setCenter(point);
}
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
@Override 2 Override เมธอด
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
186 Android App Development ฉบับสมบูรณ์
ทดสอบการท�ำงานของแอพพลิเคชันผ่านโทรศัพท์จ�ำลอง
(Emulator)
ในหัวข้อนี้จะเป็นการทดสอบแอพพลิเคชันที่ได้พัฒนาในบทน้ี ซึ่งผู้เขียนจะไม่ขออธิบายข้ันตอนการ
ทดสอบซ้�ำอีก ท้ังน้ีผู้อ่านสามารถอ่านการรันแอพพลิเคชันได้จากหัวข้อ ทดสอบการทำ� งานของแอพพลิเคชัน
ผ่านโทรศพั ทจ์ ำ� ลอง (Emulator) ในบทที่ 2 และ 3
อยา่ งไรกต็ ามในหวั ขอ้ นจ้ี ะเปน็ การรนั Emulator ขน้ึ มา เพอื่ นำ� คา่ พกิ ดั ไปแสดงบนแผนทขี่ อง Google
ซงึ่ มขี ้นั ตอนครา่ วๆ ดังนี้
1. สรา้ ง AVD โดยก�ำหนด Target เปน็ Google APIs
(Google Inc.) – API Level 15 ทง้ั นคี้ า่ Target จะไมใ่ ช่
ค่า Android 4.0.3 ดงั รูป
2. รนั แอพพลเิ คชนั ซง่ึ ผอู้ า่ นสามารถจำ� ลองการเปลยี่ น
ตำ� แหนง่ คา่ พกิ ดั GPSโดยใชเ้ ครอ่ื งมอื Emulator Control
เช่น ใส่ค่าละติจูดและค่าลองจิจูดท่ีแตกต่างกัน
โดยตวั อยา่ งของผลลัพธ์จะแสดงได้ดังรูป
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนท่ี (Map) 187
หากผู้อ่านรันแอพพลิเคชันแล้วไม่มีข้อผิดพลาดใดๆ แต่
แผนท่ีไม่แสดงออกมา โดยจะสังเกตเห็นเป็นเส้นกริด (Grid)
ดังรูป
สามารถแกไ้ ขไดโ้ ดยใหผ้ อู้ า่ นนำ� ไฟล์ debug.keystore ไป
สรา้ ง Google API Key ใหม่ แลว้ แกไ้ ขโคด้ XML ในไฟล์ main.xml
จากน้ันรันแอพพลิเคชันใหม่อีกครั้ง
ปรับแต่งแอพพลิเคชันเพ่ือแสดงแผนท่ีในรูปแบบต่างๆ
หลังจากท่ีผู้อ่านสามารถพัฒนาโปรแกรมให้แสดงแผนท่ีอย่างง่ายได้เรียบร้อยแล้ว ในหัวข้อน้ีจะ
อธิบายการปรับแต่งแอพพลิเคชันให้มีความสมบูรณ์ข้ึน โดยการปรับแต่งให้แสดงแผนท่ีในรูปแบบต่างๆ
(ในทน่ี ้ปี รบั แต่งจากแอพพลิเคชนั เดิม) ซึง่ มขี ั้นตอนดังน้ี
1. แก้ไขโคด้ XML ในไฟล์ main.xml เพื่อเพิ่มป่มุ สำ� หรับแสดงแผนทใ่ี นแต่ละแบบดังนี้
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ToggleButton เพม่ิ ปมุ่ 2 ปุม่
android:id="@+id/bt_traffic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="Traffic Off"
android:textOn="Traffic On" />
<ToggleButton
android:id="@+id/bt_satellite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="Satellite Off"
android:textOn="Satellite On" />
</LinearLayout>
188 Android App Development ฉบับสมบูรณ์
<com.google.android.maps.MapView
android:id="@+id/mapview1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="<google_api_key>"
android:clickable="true"
android:enabled="true" />
</LinearLayout>
2. แก้ไขโคด้ Java ในไฟล์ SampleGPSActivity.java โดยแกไ้ ขเมธอด onCreate() ดงั น้ี
package com.android.example.simplegps;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;
public class SampleGPSActivity extends MapActivity {
private LocationManager lm;
private LocationListener locationListener;
private MapView mapView; 2 แก้ไขโคด้
private MapController mc;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview1);
mapView.setBuiltInZoomControls(true);
mc = mapView.getController();
mc.setZoom(14);
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1,
locationListener);
ToggleButton traffic = (ToggleButton) findViewById(R.id.bt_traffic);
ToggleButton satellite = (ToggleButton) findViewById(R.id.bt_satellite);
บทท่ี 9 การพัฒนาแอพพลิเคชันติดต่อกับ GPS และการอ้างอิงกับระบบแผนที่ (Map) 189