Bài giảng Android nâng cao - Bài 4: Media Services (continue) + Location Base Services

pdf 43 trang Gia Huy 16/05/2022 3540
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Android nâng cao - Bài 4: Media Services (continue) + Location Base Services", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_android_nang_cao_bai_4_media_services_continue_loc.pdf

Nội dung text: Bài giảng Android nâng cao - Bài 4: Media Services (continue) + Location Base Services

  1. M o b i P r o ANDROID NÂNG CAO BÀI 4: Media Services (continue) + Location Base Services
  2. M o b i P r o Nội dung 1. Media Services (continue) – Video – TTS – Camera 2. Location Base Services – Global Positioning Services – Geocoding Locations – Mapping Locations TRƯƠNG XUÂN NAM 2
  3. M o b i P r o Phần 1.1 Video TRƯƠNG XUÂN NAM 3
  4. M o b i P r o Video playback . Android OS có 2 cách để chơi lại các tập tin video – Sử dụng VideoView kết hợp với MediaController – Sử dụng MediaPlayer và SurfaceView . Chơi lại video không yêu cầu quyền gì đặc biệt, nhưng nếu file video ở ngoài internet, thì ứng dụng cần có quyền truy cập internet . Phương pháp thứ 2 cho phép lập trình viên thiết lập các bộ filter cho hình ảnh phát ra thông qua hàm setPreviewCallback(filter), cần có kiến thức tốt về video nếu muốn viết filter TRƯƠNG XUÂN NAM 4
  5. M o b i P r o VideoView + MediaController . VideoView là view dùng để hiển thị dữ liệu video . VideoView cung cấp các hàm để điều khiển quá trình chơi video: start, pause, suspend, resume, stopPlayback, seekTo(millis) . MediaController là widget cung cấp các điều khiển cơ bản cho video, ngoài ra cũng cho lập trình viên tùy biến điều khiển các nút next và prev . VideoView và MediaController được thiết kế để làm việc với nhau và cùng đáp ứng trải nghiệm người dùng khi chơi video (xử lý các sự kiện chạm) TRƯƠNG XUÂN NAM 5
  6. M o b i P r o VideoView + MediaController TRƯƠNG XUÂN NAM 6
  7. M o b i P r o VideoView + MediaController protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); VideoView videoView = (VideoView) findViewById(R.id.videoView1); videoView.setMediaController(new MediaController(this)); videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.teamwork)); videoView.start(); } TRƯƠNG XUÂN NAM 7
  8. M o b i P r o VideoView + MediaController . MediaController được mặc định là ẩn, không cần đặt lên layout khi thiết kế . MediaController dùng hàm setAnchorView(v) để xác định nó sẽ được gắn vào view nào khi xuất hiện, view mặc định chính là VideoView mà nó điều khiển . MediaController được ẩn đi sau 5s nếu không có tác động, nếu cần thay đổi những mặc định này thì nên viết lại class MediaController . VideoView mặc định giữ nguyên tỉ lệ khung hình của video mà nó chạy; muốn thiết lập tỉ lệ khác, chỉ cần điều chỉnh kích thước của VideoView TRƯƠNG XUÂN NAM 8
  9. M o b i P r o MediaPlayer + SurfaceView . MediaPlayer là bộ giải mã, luôn chạy ngầm, hỗ trợ nhiều chuẩn và giao thức video, audio, mạng . SurfaceView là view được thiết kế với mục đích để thể hiện các hình ảnh cần có tốc độ cập nhật cao, đặc biệt thích hợp với việc thể hiện dữ liệu từ video, camera và hoạt hình . SurfaceView loại bỏ các chi tiết phức tạp của view nhưng cũng có những hạn chế nhất định – Thread có cơ chế cập nhật thẳng vào SurfaceView không cần qua đồng bộ – SurfaceView luôn chiếm một vùng màn hình và không thể bị che hoặc có bóng mờ TRƯƠNG XUÂN NAM 9
  10. M o b i P r o MediaPlayer + SurfaceView public class MainActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener { private MediaPlayer mediaPlayer; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SurfaceView vidSurface = new SurfaceView(this); vidSurface.getHolder().addCallback(this); setContentView(vidSurface); } public void surfaceChanged(SurfaceHolder s, int a, int b, int c) { } public void surfaceDestroyed(SurfaceHolder arg0) { } TRƯƠNG XUÂN NAM 10
  11. M o b i P r o MediaPlayer + SurfaceView public void surfaceCreated(SurfaceHolder arg0) { try { mediaPlayer = new MediaPlayer(); mediaPlayer.setDisplay(arg0); mediaPlayer.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.teamwork)); mediaPlayer.prepare(); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { } } public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } } TRƯƠNG XUÂN NAM 11
  12. M o b i P r o Phần 1.2 Text to speech TRƯƠNG XUÂN NAM 12
  13. M o b i P r o Text to speech . Cho phép chuyển đổi từ text sang âm thanh . Cần tìm hiểu kĩ về chọn ngôn ngữ, loại giọng, tùy biến ngữ điệu . Có thể lựa chọn engine khác với engine mặc định . Có thể điều chỉnh nguồn phát ra tai nghe, alarm, . Hai class hữu ích: – TextToSpeech: phát âm – TextToSpeechService: customize engine TRƯƠNG XUÂN NAM 13
  14. M o b i P r o Text to speech // gọi activity mặc định để kiểm tra có dữ liệu cho TTS chưa Intent intent = new Intent(Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(intent, CODE); // xử lý dữ liệu do activity trả về protected void onActivityResult(int req, int result, Intent data) { if (req == CODE) if (result != Engine.CHECK_VOICE_DATA_PASS) startActivity(new Intent(Engine.ACTION_INSTALL_TTS_DATA)); else { // dữ liệu đã có, tạo đối tượng TTS mặc định } } TRƯƠNG XUÂN NAM 14
  15. M o b i P r o Text to speech TextToSpeech talker = new TextToSpeech(this, new OnInitListener() { public void onInit(int status) { talker.speak(“Hi! There!”, TextToSpeech.QUEUE_FLUSH, null); } } TextToSpeech tts = new TextToSpeech(this, new OnInitListener() { public void onInit(int status) { if (status != TextToSpeech.SUCCESS) return; tts.setLanguage(Locale.ENGLISH); tts.setPitch(0.8f); tts.setSpeechRate(1.0f); } }); TRƯƠNG XUÂN NAM 15
  16. M o b i P r o Phần 1.3 Camera TRƯƠNG XUÂN NAM 16
  17. M o b i P r o Chụp ảnh bằng camera activity 1. Previewing 2. After shutter is pressed 3. Image transferred from CAMERA to the application TRƯƠNG XUÂN NAM 17
  18. M o b i P r o Chụp ảnh bằng camera activity public class CameraDemo extends Activity { ImageView mImageView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mImageView = (ImageView) findViewById(R.id.mImageView); Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(mIntent, 101); } private void showToast(Context context, String text) { Toast.makeText(context, text, 1).show(); } TRƯƠNG XUÂN NAM 18
  19. M o b i P r o Chụp ảnh bằng camera activity protected void onActivityResult(int req, int res, Intent intent) { super.onActivityResult(req, res, intent); if (res == RESULT_CANCELED) return; if (req == 101) { Bundle b = intent.getExtras(); Bitmap bm = (Bitmap) b.get("data"); mImageView.setImageBitmap(bm); } } } TRƯƠNG XUÂN NAM 19
  20. M o b i P r o Camera . Lớp Camera hỗ trợ kết nối và ngắt kết nối tới dịch vụ camera, để cho phép bạn có thể: chụp, quay và sử dụng các tiện ích camera cung cấp . Dùng hàm open() để lấy về một đối tượng Camera . Cần khai báo trong Android Manifest để cấp quyền và các tính năng sử dụng Camera . Xem demo ứng dụng chụp ảnh để hiểu rõ hơn TRƯƠNG XUÂN NAM 20
  21. M o b i P r o The takePicture Method TRƯƠNG XUÂN NAM 21
  22. M o b i P r o Phần 2.1 Global Positioning Services TRƯƠNG XUÂN NAM 22
  23. M o b i P r o Global Positioning Services . Các bước để xác định vị trí của thiết bị – Cấp quyền truy cập các dịch vụ phù hợp (trong AndroidManifest.xml) – Khởi tạo đối tượng LocationManager bằng việc gọi phương thức getSystemService với tham số truyền vào là LOCATION_SERVICE – Lựa chọn một provider bằng cách gọi phương thức getAllProviders() hoặc getBestProvider() – Implement interface LocationListener, viết các hàm xử lý phù hợp với các sự kiện location liên quan – Gọi phương thức requestLocationUpdates() với provider được chọn ở bước trên TRƯƠNG XUÂN NAM 23
  24. M o b i P r o Global Positioning Services TRƯƠNG XUÂN NAM 24
  25. M o b i P r o AndroidManifest.xml TRƯƠNG XUÂN NAM 25
  26. M o b i P r o Location services: example TRƯƠNG XUÂN NAM 26
  27. M o b i P r o Location services: example TRƯƠNG XUÂN NAM 27
  28. M o b i P r o Location services: example TRƯƠNG XUÂN NAM 28
  29. M o b i P r o Location services: giải thích . Thông qua LocationManager có thể lấy được nhiều provider có năng lực location service (tùy vào thiết bị có những sensor này hay không) – List getAllProviders(): lấy tất cảprovider – String getBestProviders(Criteria, enableOnly): lấy provider phù hợp nhất với điều kiện • Criteria: power, accuracy, speed, altitude – LocationProvider getProvider(name): Lấy provider theo tên – requestLocationUpdate(providerName, minTime, minDistance, listener): Yêu cầu gọi listener mỗi minTime mili- giây hoặc provider phát hiện dịch chuyển midDistance mét TRƯƠNG XUÂN NAM 29
  30. M o b i P r o Phần 2.2 Geocoding Locations TRƯƠNG XUÂN NAM 30
  31. M o b i P r o Geocoding Locations . Google API cho phép người dùng có thể xác định địa chỉ và tọa độ thông qua sử dụng đối tượng Geocoder . Sử dụng đối tượng Geocoder khá đơn giản và không yêu cầu đăng ký thêm quyền trong manifest . Service này hoạt động dựa trên remote service của Google, vì vậy đôi khi bị trục trặc (phải liệu mà xử lý lỗi phù hợp) . Các phương thức thường được sử dụng như: – List getFromLocation – List getFromLocationName TRƯƠNG XUÂN NAM 31
  32. M o b i P r o Geocoding Locations - example TRƯƠNG XUÂN NAM 32
  33. M o b i P r o Geocoding Locations - example TRƯƠNG XUÂN NAM 33
  34. M o b i P r o Geocoding Locations - example TRƯƠNG XUÂN NAM 34
  35. M o b i P r o Phần 2.3 Mapping Locations TRƯƠNG XUÂN NAM 35
  36. M o b i P r o Mapping Locations . Google API cung cấp hai cách để làm việc với Google Map – Hiển thị vị trí lên Google Maps bên ngoài ứng dụng thông qua Intent – Nhúng widget MapView vào bên trong ứng dụng TRƯƠNG XUÂN NAM 36
  37. M o b i P r o Google Maps bên ngoài TRƯƠNG XUÂN NAM 37
  38. M o b i P r o MapView TRƯƠNG XUÂN NAM 38
  39. M o b i P r o Google Maps: giải thích . V1: bắt buộc làm việc với MapActivity là một activity chứa MapView mặc định . V2 (API 12 trở lên): cung cấp đối tượng MapView là một ViewGroup tương tự các view khác, cung cấp sẵn các năng lực như đáp ứng key presses, touch, zooming, ngoài ra: – Hiển thị dữ liệu vector nhanh hơn – Tốn ít băng thông internet hơn – Caching làm việc hiệu quả hơn – Hỗ trợ3 D map . V3: mới có bản javascript chưa có native android TRƯƠNG XUÂN NAM 39
  40. M o b i P r o Google Maps: giải thích . Dịch vụ Google Maps nằm trong gói Google Play Services, vì vậy cần thêm thư viện này vào dự án . Đây là dịch vụ của Google, nên cần key do Google cung cấp để truy cập dịch vụ . Lấy Google Maps API Key: . Trong AndroidManifest.xml, phần , bổ sung thêm các dòng sau: 1. 2. TRƯƠNG XUÂN NAM 40
  41. M o b i P r o Google Maps: giải thích . Quyền (bắt buộc): . Quyền (optional): TRƯƠNG XUÂN NAM 41
  42. M o b i P r o Google Maps: giải thích . GoogleMap tự động xử lý: – Kết nối đến Google Maps service + tải dữ liệu bản đồ – Hiển thị bản đồ – Hiển thị các control điều khiển như zoom và dịch chuyển – Xử lý các action zoom và dịch chuyển . Tùy biến GoogleMap bằng cách viết các listener phù hợp và đăng kí với GoogleMap : – setOnMapClickListener – setOnMapLongClickListener – setOnMarkerClickListener – setOnMarkerDragListener TRƯƠNG XUÂN NAM 42
  43. M o b i P r o Google Maps: giải thích . Từ MapView có thể lấy GoogleMap bằng method getMap() GoogleMap mMap = ((SupportMapFragment) getSupportFragmentManager(). findFragmentById(R.id.map)).getMap(); . Lập trình viên có thể tác động vào Google Map: – Thêm một đánh dấu (addMarker) mMap.addMarker(new MarkerOptions().position(x).title(“XXX")); – Vẽđa giác, hình tròn với vị trí theo tọa độ địa lý – Điều chỉnh góc nhìn – Điều chỉnh loại bản đồ – Điều chỉnh vị trí (camera) TRƯƠNG XUÂN NAM 43