SlideShare a Scribd company logo
1 of 53
Smart Robot Contest 2013 
LẬP TRÌNH ANDROID 
 
Bài 03: 
LLooccaattiioonn && SSeennssoorr PPrrooggrraammmmiinngg
Nội dung bài học 
 Location Programming 
 Sensor Programming
Nội dung bài học 
 Location Programming 
 Sensor Programming
Location Programming 
 Giới thiệu Android Location Service. 
 Xác định vị trí hiện tại của thiết bị. 
 Theo dõi sự di chuyển của thiết bị. 
 Proximity Alerts.
Location Programming 
 Giới thiệu Android Location Service. 
 Xác định vị trí hiện tại của thiết bị. 
 Theo dõi sự di chuyển của thiết bị. 
 Cảnh báo khi có sự di chuyển đến gần.
Android Location Service 
 Để cung cấp thông tin về vị trí, Android sử 
dụng “location provider”. Các loại location 
provider như sau: 
 GPS Provider 
 Network Provider
Android Location Service 
 GPS Provider: 
 Sử dụng GPS (Global positioning system) để giúp 
thiết bị Android xác định vị trí của nó. 
 Tuy nhiên, thiết bị di động rất khó làm việc trực 
tiếp với GPS (thời gian truyền thông tin vị trí các 
vệ tinh đến thiết bị). Các thiết bị di động hiện đại 
thường sử dụng A-GPS (thông tin vị trí các vệ 
tinh truyền qua mạng viễn thông đến thiết bị) 
hoặc S-GPS (cho phép sử dụng đồng thời GPS 
radio và cellular network radio).
Android Location Service 
 GPS Provider: 
 Hạn chế: 
 GPS provider hầu như không thể hoạt động trong nhà 
hay ở ngoài trời những vùng mà bầu trời bị che khuất 
như trong rừng rậm chẳng hạn. 
 Nếu trên đường đi của sóng bị nhiều vật cản, sóng phải 
phản xạ nhiều lần → tăng độ dài đường đi → xác định 
vị trí bị sai (multipath error).
Android Location Service 
 Network Provider: 
 Sử dụng Wireless Network Access Point. 
 Sử dụng Cell ID.
Android Location Service 
 Network Provider: 
 Sử dụng Wireless Network Access Point: 
 Sử dụng thông tin Wi-Fi (MAC của AP và cường độ tín 
hiệu nhận bởi AP) để truy vấn Google location service. 
 Điểm mạnh của phương pháp này là có thể xác định vị 
trí của thiết bị ở những nơi mà GPS Provider không thể 
cung cấp. 
 Điểm yếu: 
 Yêu cầu phải có mạng Wi-Fi, AP phải cấu hình SSID hoặc 
SSID không kết thúc bằng _nomap. 
 Thay đổi vị trí của AP.
Android Location Service 
 Network Provider: 
 Sử dụng Cell ID: 
 Sử dụng Cell ID để truy vấn Google location service về 
thông tin vị trí của thiết bị. 
 Về điểm mạnh và điểm yếu thì phương pháp này khá 
giống với phương pháp sử dụng “Wireless Network 
Access Points”. Tuy nhiên thì vị trí của các cột phát 
sóng (cell tower) rất hiếm thay đổi so với các access 
point.
Location Programming 
 Giới thiệu Android Location Service. 
 Xác định vị trí hiện tại của thiết bị. 
 Theo dõi sự di chuyển của thiết bị. 
 Promixity Alerts.
Xác định vị trí hiện tại của thiết bị 
 Các thành phần của Android Location API. 
 Xác định location provider. 
 Cập nhật thông tin location. 
 Ví dụ minh hoạ.
Xác định vị trí hiện tại của thiết bị 
 Các thành phần của Android Location API: 
LocationManager 
LocationProvider 
Thông báo+Location 
Location 
Đọc thông tin yêu cầu Criteria 
đối với LocationProvider 
LocationListener 
Cho phép hoạt động 
Sinh ra Sử dụng
Xác định vị trí hiện tại của thiết bị 
 Xác định location provider: 
Location Provider Permission yêu cầu Sử dụng Pin Độ chính xác 
GPS Provider android.permission. 
ACCESS_FINE_LOCATION 
hoặc android.permission. 
ACCESS_COARSE_LOCATION 
Sử dụng nhiều pin 
nhất so với các 
provider khác 
Chính xác nhất 
trong các provider 
Network Provider android.permission. 
ACCESS_COARSE_LOCATION 
Sử dụng ít pin hơn 
GPS provider 
Ít chính xác hơn 
GPS provider. 
Passive Provider android.permission. 
ACCESS_FINE_LOCATION 
Không xác định Không xác định.
Xác định vị trí hiện tại của thiết bị 
 Cập nhật thông tin location: Có hai phương 
pháp 
 Sử dụng LocationListener và hiện thực phương thức 
onLocationChanged 
 Sử dụng Broadcast Receiver để nhận broadcast 
Intent khi location được cập nhật.
Hiện thực ứng dụng demo 
 Hiện thực interface LocationListener 
 Lấy handle của LocationManager 
 Yêu cầu cập nhật thông tin location. 
 Dọn dẹp
Hiện thực ứng dụng demo 
 Hiện thực interface LocationListener: 
Phương thức Mô tả 
onLocationChanged Thông báo thông tin location đã 
cập nhật. 
onProviderDisabled & 
onProviderEnabled 
Người dùng disable/enable 
location provider từ setting menu. 
onStatusChanged Location provider on/off. 
public void onLocationChanged(Location arg0) { 
txtViDo.setText(String.valueOf(arg0.getLatitude())); 
txtKinhDo.setText(String.valueOf(arg0.getLongitude())); 
txtProvider.setText(String.valueOf(arg0.getProvider())); 
long timeToFix = SystemClock.uptimeMillis() - uptimeAtResume; 
txtTTF.setText(String.valueOf(timeToFix / 1000)); 
lblDCXDonVi.setVisibility(View.VISIBLE); 
lblTTFDonVi.setVisibility(View.VISIBLE); 
}
Hiện thực ứng dụng demo 
 Lấy handle của LocationManager: 
private LocationManager lm; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
txtViDo = (TextView)findViewById(R.id.txtViDo); 
txtKinhDo = (TextView)findViewById(R.id.txtKinhDo); 
txtDoChinhXac = (TextView)findViewById(R.id.txtDoChinhXac); 
txtTTF = (TextView)findViewById(R.id.txtTTF); 
txtProvider = (TextView)findViewById(R.id.txtProvider); 
txtEnabledProvider = (TextView)findViewById(R.id.txtEnabledProvider); 
lblDCXDonVi = (TextView)findViewById(R.id.lblDCXDonVi); 
lblTTFDonVi = (TextView)findViewById(R.id.lblTTFDonVi); 
}
Hiện thực ứng dụng demo 
 Yêu cầu cập nhật thông tin location: 
 Chúng ta không thể yêu cầu Android cung cấp 
thông tin này ngay lập tức mà chúng ta chỉ yêu 
cầu và nhận được thông tin khi nào nó có thông 
qua phương thức 
LocationManager#requestSingleUpdate
Hiện thực ứng dụng demo 
protected void onResume() { 
super.onResume(); 
StringBuffer stBuffer = new StringBuffer(); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
enabledProviders = lm.getProviders(criteria, true); 
if (enabledProviders.isEmpty()){ 
txtEnabledProvider.setText(""); 
}else{ 
for (String enabledProvider : enabledProviders) 
{ 
stBuffer.append(enabledProvider).append(" "); 
lm.requestSingleUpdate(enabledProvider,this,null); 
} txtEnabledProvider.setText(stBuffer); 
} 
uptimeAtResume = SystemClock.uptimeMillis(); 
txtViDo.setText(""); 
txtKinhDo.setText(""); 
txtProvider.setText(""); 
txtDoChinhXac.setText(""); 
txtTTF.setText(""); 
lblDCXDonVi.setVisibility(View.GONE); 
lblTTFDonVi.setVisibility(View.GONE); 
}
Hiện thực ứng dụng demo 
 Dọn dẹp : 
@Override 
protected void onPause() { 
super.onPause(); 
lm.removeUpdates(this); 
}
Location Programming 
 Giới thiệu Android Location Service. 
 Xác định vị trí hiện tại của thiết bị. 
 Theo dõi sự di chuyển của thiết bị. 
 Promixity Alerts.
Theo dõi sự di chuyển của thiết bị 
 Thu thập dữ liệu location. 
 Trình bày dữ liệu location.
Theo dõi sự di chuyển của thiết bị 
 Thu thập dữ liệu location. 
 Trình bày dữ liệu location.
Theo dõi sự di chuyển của thiết bị 
 Thu thập dữ liệu location: 
 Sử dụng BrodcastReceiver. 
 Sử dụng Service.
Theo dõi sự di chuyển của thiết bị 
 Thu thập dữ liệu location: 
 Sử dụng BroadcastReceiver: 
 Tạo broadcast Intent với action đã định nghĩa trước 
 Tạo PendingIntent từ getBroadcast. 
 Sử dụng phương thức 
LocationManager#requestLocationUpdate để đăng ký 
PendingIntent với LocationManager. 
 Hiện thực BroadcastReceiver để nhận broadcast Intent 
được gửi mỗi khi location được cập nhật.
Theo dõi sự di chuyển của thiết bị 
 Thu thập dữ liệu location: 
 Sử dụng Service: 
 Hiện thực Service và LocationListener. 
 Trong phương thức onCreate lấy handle của 
LocationManager. 
 Trong phương thức onStartCommand sử dụng phương 
thức requestOnLocationUpdate để đăng ký listener cho 
LocationManger. 
 Trong onLocationChanged chúng ta lưu lại location. 
 Trong phương thức onDestroy chúng ta dùng phương 
thức removeUpdate để xoá đăng ký.
Theo dõi sự di chuyển của thiết bị 
 Thu thập dữ liệu location. 
 Trình bày dữ liệu location.
Theo dõi sự di chuyển của thiết bị 
 Trình bày dữ liệu location: 
 Thường sử dụng Google Map để trình bày dữ liệu 
location thu thập được. Đây là chủ đề tự tìm hiểu.
Location Programming 
 Giới thiệu Android Location Service. 
 Xác định vị trí hiện tại của thiết bị. 
 Theo dõi sự di chuyển của thiết bị. 
 Promixity Alerts.
Promixity Alerts 
 Geocoding 
 Thiết lập Promixity Alert. 
 Đối ứng với Promixity Alert 
O R
Promixity Alerts 
 Geocoding 
 Thiết lập Promixity Alert. 
 Đối ứng với Promixity Alert
Promixity Alerts 
 Geocoding: 
 Chuyển tên vị trí sang toạ độ (kinh độ, vĩ độ). 
 Class android.location.Geocoder cho phép chúng ta 
thực hiện geocoding và ngược lại. 
 isPresent → kiểm tra bản Android hiện tại có hỗ trợ các 
phương thức geocoding và reverse geocoding hay 
không. 
 GetLocationFromName trả về danh sách các địa điểm 
phù hợp với tên được cung cấp.
Promixity Alerts 
 Geocoding 
 Thiết lập Promixity Alert. 
 Đối ứng với Promixity Alert
Promixity Alerts 
 Thiết lập Promixity Alert: 
 Sử dụng phương thức 
LocationManager#addPromixityAlert để thiết lập 
proximity alert: 
 Kinh độ, vĩ độ. 
 Bán kính vùng xung quanh. 
 Giới hạn về thời gian. 
 PendingIntent: intent sẽ được send broadcast khi 
proximity alert được kích hoạt 
 Sử dụng phương thức 
LocationManager#removeProximityAlert để huỷ 
đăng ký 1 proximity alert.
Promixity Alerts 
 Geocoding. 
 Thiết lập Promixity Alert. 
 Đối ứng với Promixity Alert.
Promixity Alerts 
 Đối ứng với Promixity Alert: Khi proximity alert bị 
kích hoạt thì intent trong PendingIntent sẽ được gửi 
broadcast → Hiện thực BroadcastReceiver để nhận 
intent này. 
 Sử dụng key 
LocationManager.KEY_PROXIMITY_ENTERING để 
filter và nhận thông tin từ Intent.
Nội dung bài học 
 Location Programming 
 Sensor Programming
Sensor Programming 
 Giới thiệu 
 Android Sensor Programming API 
 Ví dụ minh hoạ
Sensor Programming 
 Giới thiệu 
 Android Sensor Programming API 
 Ví dụ minh hoạ
Sensor Programming 
 Giới thiệu 
 MEMS (Microelectromechanical sensors) là những cảm biến 
có kích thước cực kỳ nhỏ được sản xuất dựa trên kỹ thuật 
sản xuất chip máy tính. 
 Các loại cảm biến: 
 Raw sensor cung cấp dữ liệu thô từ thiết bị vật lý 
 Sensor.TYPE_LIGHT (Cảm biến ánh sáng) 
 Sensor.TYPE_PROXIMITY (Cảm biến tiệm cận) 
 Sensor.TYPE_PRESSURE (Cảm biến áp suất) 
 Sensor.TYPE_TEMPERATURE (Cảm biến nhiệt độ thiết bị) 
 Sensor.TYPE_ACCELEROMETER (Cảm biến gia tốc) 
 Sensor.TYPE_GYROSCOPE (Cảm biến con quay) 
 Sensor.TYPE_MAGNETIC_FIELD (Cảm biến từ trường) 
 Sensor.TYPE_RELATIVE_HUMIDITY (Cảm biến độ ẩm) 
 Sensor.TYPE_AMBIENT_TEMPERATURE (CB nhiệt độ môi trường)
Sensor Programming 
 Giới thiệu 
 Các loại cảm biến: 
 Synthetic sensor (composite, virtual): abstract layer 
giữa code và thiết bị vật lý 
 Sensor.TYPE_ROTATION_VECTOR (CB véc tơ quay) 
 Sensor.TYPE_LINEAR_ACCELERATION 
(CB gia tốc không trọng lực) 
 Sensor.TYPE_GRAVITY (CB trọng lực) 
 Sensor.TYPE_ORIENTATION (CB phương hướng)
Sensor Programming 
 Giới thiệu 
 Android chia cảm biến thành 3 loại: 
 Nhóm cảm biến về chuyển động: Cảm biến gia tốc, 
cảm biến trọng lực, cảm biến con quay, cảm biến gia 
tốc không trọng lực, cảm biến véc tơ quay. 
 Nhóm cảm biến về vị trí:Cảm biến từ trường, cảm biến 
phương hướng, cảm biến tiệm cận. 
 Nhóm cảm biến về môi trường: Cảm biến nhiệt độ môi 
trường, cảm biến ánh sáng, cảm biến áp suất, cảm 
biến độ ẩm, cảm biến nhiệt độ thiết bị.
Sensor Programming 
 Giới thiệu 
 Android Sensor Programming API 
 Ví dụ minh hoạ
Sensor Programming 
 Android Sensor Programming API: 
 Package: android.hardware 
 Class & Interface: 
 SensorManager → Android sensor service 
 Sensor → sensor cụ thể 
 SensorEvent → sự kiện trên sensor 
 SensorEventListener → thông báo khi có sự kiện xảy ra 
trên sensor cụ thể.
Sensor Programming 
 Android Sensor Programming API: 
 Xác định tất cả các sensor: 
private SensorManager mSensorManager; 
... 
mSensorManager = (SensorManager) 
getSystemService(Context.SENSOR_SERVICE); 
List<Sensor> sensorsList = 
mSensorManager.getSensorList(Sensor.TYPE_ALL);
Sensor Programming 
 Android Sensor Programming API: 
 SensorManager class: 
 Lớp này cho phép chúng ta truy xuất đến các cảm biến của 
thiết bị. 
 Để truy xuất đến instance của lớp này chúng ta sử dụng 
phương thức Context#getSystemService với tham số là 
Context.SENSOR_SERVICE 
 Các phương thức thường dùng: 
 List<Sensor> getSensorList(int type) 
 static float[ ] getOrientation(float[ ] R, float[ ] values) 
 boolean registerListener(SensorEventListener listener,Sensor 
sensor, int rate) 
 rate: Chỉ ra thời gian hay tần suất đo để chuyển cho listener. Đây chỉ là giá trị đề nghị, hệ 
thống có thể trả về nhanh hơn hoặc chậm hơn. Các giá trị định nghĩa sẵn: 
SENSOR_DELAY_FASTEST, SENSOR_DELAY_GAME, SENSOR_DELAY_UI, 
SENSOR_DELAY_NORMAL.
Sensor Programming 
 Android Sensor Programming API: 
 Sensor class: 
 Lớp này đại diện cho một cảm biến. 
 Các thông tin lớp này cung cấp về một cảm biến: 
 Maximum range → Độ đo lớn nhất (theo đơn vị của cảm biến). 
 Minimum delay → Khoảng thời gian nhỏ nhất giữa 2 sự kiện xảy ra. 
 Name → Tên cảm biến. 
 Power → Cường độ dòng điện dùng bởi cảm biến. 
 Resolution → Độ phân giải của cảm biến (theo đơn vị của cảm biến). 
 Type → Loại cảm biến. 
 Vendor → Tên của nhà sản xuất. 
 Version → Phiên bản. 
 Các thông tin của cảm biến có thể truy xuất thông qua các 
hàm getter tương ứng.
Sensor Programming 
 Android Sensor Programming API: 
 SensorEvent class: 
 Lớp này đại diện cho một sự kiện của cảm biến. 
 Các thông tin lớp này cung cấp về một sự kiện của cảm 
biến: 
 Độ chính xác của sự kiện. 
 Cảm biến sinh ra sự kiện. 
 Thời điểm phát sinh sự kiện. 
 Một chuỗi dữ liệu (độ dài và thành phần phụ thuộc vào loại cảm biến).
Sensor Programming 
 Android Sensor Programming API: 
 SensorEventListener class: 
 Để giao tiếp với cảm biến thì ứng dụng cần đăng ký với 
SensorManager cảm biến mà ứng dụng quan tâm cùng 
với bản hiện thực SensorEventListener. Mỗi khi có một 
sự kiện xảy ra trên cảm biến thì SensorManager sẽ thông 
báo cho ứng dụng qua các hàm callback của bản hiện 
thực SensorEventListener mà ứng dụng đã đăng ký. 
 Hai phương thức bắt buộc phải hiện thực: 
 void onAccuracyChanged(Sensor sensor, int accuracy) 
→ gọi khi độ chính xác của phép đo của cảm biến 
thay đổi 
 void onSensorChanged(SensorEvent event) → gọi khi 
có một sự kiện xảy ra trên cảm biến.
Sensor Programming 
 Giới thiệu 
 Android Sensor Programming API 
 Ví dụ minh hoạ
NNGGUUYYỄỄNN HHỮỮUU PPHHƯƯỚỚCC, MEng. 
Website:http://phuocnh.nghelong.com

More Related Content

Viewers also liked

Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
Phuoc Nguyen
 
Bài 1: Giới thiệu Android
Bài 1: Giới thiệu AndroidBài 1: Giới thiệu Android
Bài 1: Giới thiệu Android
hoccungdoanhnghiep
 
56123159 android
56123159 android56123159 android
56123159 android
Hieu Pham
 
Christopher hills-victor-beasely--your-electro vibratory-body
Christopher hills-victor-beasely--your-electro vibratory-bodyChristopher hills-victor-beasely--your-electro vibratory-body
Christopher hills-victor-beasely--your-electro vibratory-body
ganesha1963
 
L & a part 6
L & a part 6L & a part 6
L & a part 6
debpearcy
 

Viewers also liked (19)

Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
 
Android Nâng cao-Bài 4: Content Provider
Android Nâng cao-Bài 4: Content ProviderAndroid Nâng cao-Bài 4: Content Provider
Android Nâng cao-Bài 4: Content Provider
 
Android chapter03-life-cycle
Android chapter03-life-cycleAndroid chapter03-life-cycle
Android chapter03-life-cycle
 
Android presentation
Android presentationAndroid presentation
Android presentation
 
IT120-1. Giới thiệu về Android SDK
IT120-1. Giới thiệu về Android SDKIT120-1. Giới thiệu về Android SDK
IT120-1. Giới thiệu về Android SDK
 
Google Android Security (Basic2Advanced)
Google Android Security (Basic2Advanced)Google Android Security (Basic2Advanced)
Google Android Security (Basic2Advanced)
 
Android ios wp7
Android ios wp7Android ios wp7
Android ios wp7
 
Android chapter03-life-cycle
Android chapter03-life-cycleAndroid chapter03-life-cycle
Android chapter03-life-cycle
 
Basic Sqlite in Android
Basic Sqlite in AndroidBasic Sqlite in Android
Basic Sqlite in Android
 
Slide hội thảo Google Android BKHN 26-10
Slide hội thảo Google Android BKHN 26-10Slide hội thảo Google Android BKHN 26-10
Slide hội thảo Google Android BKHN 26-10
 
Android OS
Android OSAndroid OS
Android OS
 
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
 
Lap trinh android – kiem tien ngay trong khi hoc
Lap trinh android – kiem tien ngay trong khi hocLap trinh android – kiem tien ngay trong khi hoc
Lap trinh android – kiem tien ngay trong khi hoc
 
Tìm hiểu về hệ điều hành android
Tìm hiểu về hệ điều hành androidTìm hiểu về hệ điều hành android
Tìm hiểu về hệ điều hành android
 
Bài 1: Giới thiệu Android
Bài 1: Giới thiệu AndroidBài 1: Giới thiệu Android
Bài 1: Giới thiệu Android
 
56123159 android
56123159 android56123159 android
56123159 android
 
Christopher hills-victor-beasely--your-electro vibratory-body
Christopher hills-victor-beasely--your-electro vibratory-bodyChristopher hills-victor-beasely--your-electro vibratory-body
Christopher hills-victor-beasely--your-electro vibratory-body
 
L & a part 6
L & a part 6L & a part 6
L & a part 6
 
Agile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio DigitalAgile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio Digital
 

More from Phuoc Nguyen (7)

Lanh dao va TPP
Lanh dao va TPPLanh dao va TPP
Lanh dao va TPP
 
Hiberbate Framework
Hiberbate FrameworkHiberbate Framework
Hiberbate Framework
 
Introduction to Hibernate Framework
Introduction to Hibernate FrameworkIntroduction to Hibernate Framework
Introduction to Hibernate Framework
 
Webservice performance testing with SoapUI
Webservice performance testing with SoapUIWebservice performance testing with SoapUI
Webservice performance testing with SoapUI
 
Web application security test tools
Web application security test toolsWeb application security test tools
Web application security test tools
 
A successful project sharing
A successful project sharingA successful project sharing
A successful project sharing
 
Buồn vui nghề IT (Pros & cons of IT Career)
Buồn vui nghề IT (Pros & cons of IT Career)Buồn vui nghề IT (Pros & cons of IT Career)
Buồn vui nghề IT (Pros & cons of IT Career)
 

Android location sensor programming

  • 1. Smart Robot Contest 2013 LẬP TRÌNH ANDROID  Bài 03: LLooccaattiioonn && SSeennssoorr PPrrooggrraammmmiinngg
  • 2. Nội dung bài học  Location Programming  Sensor Programming
  • 3. Nội dung bài học  Location Programming  Sensor Programming
  • 4. Location Programming  Giới thiệu Android Location Service.  Xác định vị trí hiện tại của thiết bị.  Theo dõi sự di chuyển của thiết bị.  Proximity Alerts.
  • 5. Location Programming  Giới thiệu Android Location Service.  Xác định vị trí hiện tại của thiết bị.  Theo dõi sự di chuyển của thiết bị.  Cảnh báo khi có sự di chuyển đến gần.
  • 6. Android Location Service  Để cung cấp thông tin về vị trí, Android sử dụng “location provider”. Các loại location provider như sau:  GPS Provider  Network Provider
  • 7. Android Location Service  GPS Provider:  Sử dụng GPS (Global positioning system) để giúp thiết bị Android xác định vị trí của nó.  Tuy nhiên, thiết bị di động rất khó làm việc trực tiếp với GPS (thời gian truyền thông tin vị trí các vệ tinh đến thiết bị). Các thiết bị di động hiện đại thường sử dụng A-GPS (thông tin vị trí các vệ tinh truyền qua mạng viễn thông đến thiết bị) hoặc S-GPS (cho phép sử dụng đồng thời GPS radio và cellular network radio).
  • 8. Android Location Service  GPS Provider:  Hạn chế:  GPS provider hầu như không thể hoạt động trong nhà hay ở ngoài trời những vùng mà bầu trời bị che khuất như trong rừng rậm chẳng hạn.  Nếu trên đường đi của sóng bị nhiều vật cản, sóng phải phản xạ nhiều lần → tăng độ dài đường đi → xác định vị trí bị sai (multipath error).
  • 9. Android Location Service  Network Provider:  Sử dụng Wireless Network Access Point.  Sử dụng Cell ID.
  • 10. Android Location Service  Network Provider:  Sử dụng Wireless Network Access Point:  Sử dụng thông tin Wi-Fi (MAC của AP và cường độ tín hiệu nhận bởi AP) để truy vấn Google location service.  Điểm mạnh của phương pháp này là có thể xác định vị trí của thiết bị ở những nơi mà GPS Provider không thể cung cấp.  Điểm yếu:  Yêu cầu phải có mạng Wi-Fi, AP phải cấu hình SSID hoặc SSID không kết thúc bằng _nomap.  Thay đổi vị trí của AP.
  • 11. Android Location Service  Network Provider:  Sử dụng Cell ID:  Sử dụng Cell ID để truy vấn Google location service về thông tin vị trí của thiết bị.  Về điểm mạnh và điểm yếu thì phương pháp này khá giống với phương pháp sử dụng “Wireless Network Access Points”. Tuy nhiên thì vị trí của các cột phát sóng (cell tower) rất hiếm thay đổi so với các access point.
  • 12. Location Programming  Giới thiệu Android Location Service.  Xác định vị trí hiện tại của thiết bị.  Theo dõi sự di chuyển của thiết bị.  Promixity Alerts.
  • 13. Xác định vị trí hiện tại của thiết bị  Các thành phần của Android Location API.  Xác định location provider.  Cập nhật thông tin location.  Ví dụ minh hoạ.
  • 14. Xác định vị trí hiện tại của thiết bị  Các thành phần của Android Location API: LocationManager LocationProvider Thông báo+Location Location Đọc thông tin yêu cầu Criteria đối với LocationProvider LocationListener Cho phép hoạt động Sinh ra Sử dụng
  • 15. Xác định vị trí hiện tại của thiết bị  Xác định location provider: Location Provider Permission yêu cầu Sử dụng Pin Độ chính xác GPS Provider android.permission. ACCESS_FINE_LOCATION hoặc android.permission. ACCESS_COARSE_LOCATION Sử dụng nhiều pin nhất so với các provider khác Chính xác nhất trong các provider Network Provider android.permission. ACCESS_COARSE_LOCATION Sử dụng ít pin hơn GPS provider Ít chính xác hơn GPS provider. Passive Provider android.permission. ACCESS_FINE_LOCATION Không xác định Không xác định.
  • 16. Xác định vị trí hiện tại của thiết bị  Cập nhật thông tin location: Có hai phương pháp  Sử dụng LocationListener và hiện thực phương thức onLocationChanged  Sử dụng Broadcast Receiver để nhận broadcast Intent khi location được cập nhật.
  • 17. Hiện thực ứng dụng demo  Hiện thực interface LocationListener  Lấy handle của LocationManager  Yêu cầu cập nhật thông tin location.  Dọn dẹp
  • 18. Hiện thực ứng dụng demo  Hiện thực interface LocationListener: Phương thức Mô tả onLocationChanged Thông báo thông tin location đã cập nhật. onProviderDisabled & onProviderEnabled Người dùng disable/enable location provider từ setting menu. onStatusChanged Location provider on/off. public void onLocationChanged(Location arg0) { txtViDo.setText(String.valueOf(arg0.getLatitude())); txtKinhDo.setText(String.valueOf(arg0.getLongitude())); txtProvider.setText(String.valueOf(arg0.getProvider())); long timeToFix = SystemClock.uptimeMillis() - uptimeAtResume; txtTTF.setText(String.valueOf(timeToFix / 1000)); lblDCXDonVi.setVisibility(View.VISIBLE); lblTTFDonVi.setVisibility(View.VISIBLE); }
  • 19. Hiện thực ứng dụng demo  Lấy handle của LocationManager: private LocationManager lm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); txtViDo = (TextView)findViewById(R.id.txtViDo); txtKinhDo = (TextView)findViewById(R.id.txtKinhDo); txtDoChinhXac = (TextView)findViewById(R.id.txtDoChinhXac); txtTTF = (TextView)findViewById(R.id.txtTTF); txtProvider = (TextView)findViewById(R.id.txtProvider); txtEnabledProvider = (TextView)findViewById(R.id.txtEnabledProvider); lblDCXDonVi = (TextView)findViewById(R.id.lblDCXDonVi); lblTTFDonVi = (TextView)findViewById(R.id.lblTTFDonVi); }
  • 20. Hiện thực ứng dụng demo  Yêu cầu cập nhật thông tin location:  Chúng ta không thể yêu cầu Android cung cấp thông tin này ngay lập tức mà chúng ta chỉ yêu cầu và nhận được thông tin khi nào nó có thông qua phương thức LocationManager#requestSingleUpdate
  • 21. Hiện thực ứng dụng demo protected void onResume() { super.onResume(); StringBuffer stBuffer = new StringBuffer(); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); enabledProviders = lm.getProviders(criteria, true); if (enabledProviders.isEmpty()){ txtEnabledProvider.setText(""); }else{ for (String enabledProvider : enabledProviders) { stBuffer.append(enabledProvider).append(" "); lm.requestSingleUpdate(enabledProvider,this,null); } txtEnabledProvider.setText(stBuffer); } uptimeAtResume = SystemClock.uptimeMillis(); txtViDo.setText(""); txtKinhDo.setText(""); txtProvider.setText(""); txtDoChinhXac.setText(""); txtTTF.setText(""); lblDCXDonVi.setVisibility(View.GONE); lblTTFDonVi.setVisibility(View.GONE); }
  • 22. Hiện thực ứng dụng demo  Dọn dẹp : @Override protected void onPause() { super.onPause(); lm.removeUpdates(this); }
  • 23. Location Programming  Giới thiệu Android Location Service.  Xác định vị trí hiện tại của thiết bị.  Theo dõi sự di chuyển của thiết bị.  Promixity Alerts.
  • 24. Theo dõi sự di chuyển của thiết bị  Thu thập dữ liệu location.  Trình bày dữ liệu location.
  • 25. Theo dõi sự di chuyển của thiết bị  Thu thập dữ liệu location.  Trình bày dữ liệu location.
  • 26. Theo dõi sự di chuyển của thiết bị  Thu thập dữ liệu location:  Sử dụng BrodcastReceiver.  Sử dụng Service.
  • 27. Theo dõi sự di chuyển của thiết bị  Thu thập dữ liệu location:  Sử dụng BroadcastReceiver:  Tạo broadcast Intent với action đã định nghĩa trước  Tạo PendingIntent từ getBroadcast.  Sử dụng phương thức LocationManager#requestLocationUpdate để đăng ký PendingIntent với LocationManager.  Hiện thực BroadcastReceiver để nhận broadcast Intent được gửi mỗi khi location được cập nhật.
  • 28. Theo dõi sự di chuyển của thiết bị  Thu thập dữ liệu location:  Sử dụng Service:  Hiện thực Service và LocationListener.  Trong phương thức onCreate lấy handle của LocationManager.  Trong phương thức onStartCommand sử dụng phương thức requestOnLocationUpdate để đăng ký listener cho LocationManger.  Trong onLocationChanged chúng ta lưu lại location.  Trong phương thức onDestroy chúng ta dùng phương thức removeUpdate để xoá đăng ký.
  • 29. Theo dõi sự di chuyển của thiết bị  Thu thập dữ liệu location.  Trình bày dữ liệu location.
  • 30. Theo dõi sự di chuyển của thiết bị  Trình bày dữ liệu location:  Thường sử dụng Google Map để trình bày dữ liệu location thu thập được. Đây là chủ đề tự tìm hiểu.
  • 31. Location Programming  Giới thiệu Android Location Service.  Xác định vị trí hiện tại của thiết bị.  Theo dõi sự di chuyển của thiết bị.  Promixity Alerts.
  • 32. Promixity Alerts  Geocoding  Thiết lập Promixity Alert.  Đối ứng với Promixity Alert O R
  • 33. Promixity Alerts  Geocoding  Thiết lập Promixity Alert.  Đối ứng với Promixity Alert
  • 34. Promixity Alerts  Geocoding:  Chuyển tên vị trí sang toạ độ (kinh độ, vĩ độ).  Class android.location.Geocoder cho phép chúng ta thực hiện geocoding và ngược lại.  isPresent → kiểm tra bản Android hiện tại có hỗ trợ các phương thức geocoding và reverse geocoding hay không.  GetLocationFromName trả về danh sách các địa điểm phù hợp với tên được cung cấp.
  • 35. Promixity Alerts  Geocoding  Thiết lập Promixity Alert.  Đối ứng với Promixity Alert
  • 36. Promixity Alerts  Thiết lập Promixity Alert:  Sử dụng phương thức LocationManager#addPromixityAlert để thiết lập proximity alert:  Kinh độ, vĩ độ.  Bán kính vùng xung quanh.  Giới hạn về thời gian.  PendingIntent: intent sẽ được send broadcast khi proximity alert được kích hoạt  Sử dụng phương thức LocationManager#removeProximityAlert để huỷ đăng ký 1 proximity alert.
  • 37. Promixity Alerts  Geocoding.  Thiết lập Promixity Alert.  Đối ứng với Promixity Alert.
  • 38. Promixity Alerts  Đối ứng với Promixity Alert: Khi proximity alert bị kích hoạt thì intent trong PendingIntent sẽ được gửi broadcast → Hiện thực BroadcastReceiver để nhận intent này.  Sử dụng key LocationManager.KEY_PROXIMITY_ENTERING để filter và nhận thông tin từ Intent.
  • 39. Nội dung bài học  Location Programming  Sensor Programming
  • 40. Sensor Programming  Giới thiệu  Android Sensor Programming API  Ví dụ minh hoạ
  • 41. Sensor Programming  Giới thiệu  Android Sensor Programming API  Ví dụ minh hoạ
  • 42. Sensor Programming  Giới thiệu  MEMS (Microelectromechanical sensors) là những cảm biến có kích thước cực kỳ nhỏ được sản xuất dựa trên kỹ thuật sản xuất chip máy tính.  Các loại cảm biến:  Raw sensor cung cấp dữ liệu thô từ thiết bị vật lý  Sensor.TYPE_LIGHT (Cảm biến ánh sáng)  Sensor.TYPE_PROXIMITY (Cảm biến tiệm cận)  Sensor.TYPE_PRESSURE (Cảm biến áp suất)  Sensor.TYPE_TEMPERATURE (Cảm biến nhiệt độ thiết bị)  Sensor.TYPE_ACCELEROMETER (Cảm biến gia tốc)  Sensor.TYPE_GYROSCOPE (Cảm biến con quay)  Sensor.TYPE_MAGNETIC_FIELD (Cảm biến từ trường)  Sensor.TYPE_RELATIVE_HUMIDITY (Cảm biến độ ẩm)  Sensor.TYPE_AMBIENT_TEMPERATURE (CB nhiệt độ môi trường)
  • 43. Sensor Programming  Giới thiệu  Các loại cảm biến:  Synthetic sensor (composite, virtual): abstract layer giữa code và thiết bị vật lý  Sensor.TYPE_ROTATION_VECTOR (CB véc tơ quay)  Sensor.TYPE_LINEAR_ACCELERATION (CB gia tốc không trọng lực)  Sensor.TYPE_GRAVITY (CB trọng lực)  Sensor.TYPE_ORIENTATION (CB phương hướng)
  • 44. Sensor Programming  Giới thiệu  Android chia cảm biến thành 3 loại:  Nhóm cảm biến về chuyển động: Cảm biến gia tốc, cảm biến trọng lực, cảm biến con quay, cảm biến gia tốc không trọng lực, cảm biến véc tơ quay.  Nhóm cảm biến về vị trí:Cảm biến từ trường, cảm biến phương hướng, cảm biến tiệm cận.  Nhóm cảm biến về môi trường: Cảm biến nhiệt độ môi trường, cảm biến ánh sáng, cảm biến áp suất, cảm biến độ ẩm, cảm biến nhiệt độ thiết bị.
  • 45. Sensor Programming  Giới thiệu  Android Sensor Programming API  Ví dụ minh hoạ
  • 46. Sensor Programming  Android Sensor Programming API:  Package: android.hardware  Class & Interface:  SensorManager → Android sensor service  Sensor → sensor cụ thể  SensorEvent → sự kiện trên sensor  SensorEventListener → thông báo khi có sự kiện xảy ra trên sensor cụ thể.
  • 47. Sensor Programming  Android Sensor Programming API:  Xác định tất cả các sensor: private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List<Sensor> sensorsList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
  • 48. Sensor Programming  Android Sensor Programming API:  SensorManager class:  Lớp này cho phép chúng ta truy xuất đến các cảm biến của thiết bị.  Để truy xuất đến instance của lớp này chúng ta sử dụng phương thức Context#getSystemService với tham số là Context.SENSOR_SERVICE  Các phương thức thường dùng:  List<Sensor> getSensorList(int type)  static float[ ] getOrientation(float[ ] R, float[ ] values)  boolean registerListener(SensorEventListener listener,Sensor sensor, int rate)  rate: Chỉ ra thời gian hay tần suất đo để chuyển cho listener. Đây chỉ là giá trị đề nghị, hệ thống có thể trả về nhanh hơn hoặc chậm hơn. Các giá trị định nghĩa sẵn: SENSOR_DELAY_FASTEST, SENSOR_DELAY_GAME, SENSOR_DELAY_UI, SENSOR_DELAY_NORMAL.
  • 49. Sensor Programming  Android Sensor Programming API:  Sensor class:  Lớp này đại diện cho một cảm biến.  Các thông tin lớp này cung cấp về một cảm biến:  Maximum range → Độ đo lớn nhất (theo đơn vị của cảm biến).  Minimum delay → Khoảng thời gian nhỏ nhất giữa 2 sự kiện xảy ra.  Name → Tên cảm biến.  Power → Cường độ dòng điện dùng bởi cảm biến.  Resolution → Độ phân giải của cảm biến (theo đơn vị của cảm biến).  Type → Loại cảm biến.  Vendor → Tên của nhà sản xuất.  Version → Phiên bản.  Các thông tin của cảm biến có thể truy xuất thông qua các hàm getter tương ứng.
  • 50. Sensor Programming  Android Sensor Programming API:  SensorEvent class:  Lớp này đại diện cho một sự kiện của cảm biến.  Các thông tin lớp này cung cấp về một sự kiện của cảm biến:  Độ chính xác của sự kiện.  Cảm biến sinh ra sự kiện.  Thời điểm phát sinh sự kiện.  Một chuỗi dữ liệu (độ dài và thành phần phụ thuộc vào loại cảm biến).
  • 51. Sensor Programming  Android Sensor Programming API:  SensorEventListener class:  Để giao tiếp với cảm biến thì ứng dụng cần đăng ký với SensorManager cảm biến mà ứng dụng quan tâm cùng với bản hiện thực SensorEventListener. Mỗi khi có một sự kiện xảy ra trên cảm biến thì SensorManager sẽ thông báo cho ứng dụng qua các hàm callback của bản hiện thực SensorEventListener mà ứng dụng đã đăng ký.  Hai phương thức bắt buộc phải hiện thực:  void onAccuracyChanged(Sensor sensor, int accuracy) → gọi khi độ chính xác của phép đo của cảm biến thay đổi  void onSensorChanged(SensorEvent event) → gọi khi có một sự kiện xảy ra trên cảm biến.
  • 52. Sensor Programming  Giới thiệu  Android Sensor Programming API  Ví dụ minh hoạ
  • 53. NNGGUUYYỄỄNN HHỮỮUU PPHHƯƯỚỚCC, MEng. Website:http://phuocnh.nghelong.com