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ó.. Android Location Service Network Provider: Sử dụng C
Trang 1Smart Robot Contest 2013
LẬP TRÌNH ANDROID
Bài 03:
Location & Sensor Programming
Trang 2Nội dung bài học
Location Programming
Sensor Programming
Trang 3Nội dung bài học
Location Programming
Sensor Programming
Trang 4Location 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.
Trang 5Location 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.
Trang 6Android 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
Trang 7Android 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
Trang 8Android 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)
Trang 9Android Location Service
Network Provider:
Sử dụng Wireless Network Access Point.
Sử dụng Cell ID.
Trang 10Android Location Service
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.
Trang 11Android 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
Trang 12Location 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.
Trang 13Xá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ạ.
Trang 14Xác định vị trí hiện tại của thiết bị
Các thành phần của Android Location API:
Trang 15Xác định vị trí hiện tại của thiết bị
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
Ít chính xác hơn GPS provider
Trang 16Xá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.
Trang 17Hiện thực ứng dụng demo
Lấy handle của LocationManager
Hiện thực interface LocationListener
Yêu cầu cập nhật thông tin location.
Dọn dẹp
Trang 19onProviderEnabled Người dùng disable/enable location provider từ setting menu.
public void onLocationChanged(Location arg0) {
arg0.getLatitude();//Vĩ độ arg0.getLongitude()); //Kinh độ
Trang 20Hiện thực ứng dụng demo
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 1 lần khi nào nó có thông qua phương thức.
Trang 21Hiệ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);
//Lấy ra những provider mà đang enable.
enabledProviders = lm getProviders(criteria, true);
/ /Đăng ký listener location update 1 lần, qua provider_name
lm requestSingleUpdate(provider_name, location_listener, null); }
Trang 23Location 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.
Trang 24Theo 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
Trang 25Theo 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
Trang 26Theo 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.
Trang 27Theo 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
Trang 28Theo 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ý
Trang 29Theo 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
Trang 30Theo 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.
Chúng ta có thể giả lập sự thay đổi location trên
emulator bằng cách dùng DDMS-Emulator control (sẽ chỉ chi tiết hơn trong thực hành)
Trang 31Location 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.
Trang 32Promixity Alerts
Geocoding
Thiết lập Promixity Alert.
Đối ứng với Promixity Alert
O
Trang 33Promixity Alerts
Thiết lập Promixity Alert.
Đối ứng với Promixity Alert
Trang 34Promixity 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
Trang 35Promixity Alerts
Geocoding
Thiết lập Promixity Alert.
Đối ứng với Promixity Alert
Trang 36Promixity Alerts
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
Trang 37Promixity Alerts
Geocoding.
Thiết lập Promixity Alert.
Đối ứng với Promixity Alert.
Trang 38Promixity 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.
Trang 39Nội dung bài học
Location Programming
Sensor Programming
Trang 40Sensor Programming
Giới thiệu
Android Sensor Programming API
Ví dụ minh hoạ
Trang 41Sensor Programming
Giới thiệu
Android Sensor Programming API
Ví dụ minh hoạ
Trang 42Sensor Programming
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.
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)
Trang 43Sensor 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)
Trang 44Sensor 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ị
Trang 45Sensor Programming
Giới thiệu
Android Sensor Programming API
Ví dụ minh hoạ
Trang 46Sensor 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ể
Trang 47 Để 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:
Sensor getDefaultSensor(int type) //tra ve default sensor theo type
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:
Trang 49Sensor Programming
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
Trang 50Sensor 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).
Trang 51Sensor 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:
accuracy) → gọi khi độ chính xác của phép đo của
cảm biến thay đổi
Trang 52Cách simulate sensor trên Emulator
Tham khảo cách setup sensor simulate:
Trang 53Sensor Programming
Giới thiệu
Android Sensor Programming API
Ví dụ minh hoạ