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);
}
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.
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ạ