Đăng ký Đăng nhập
Trang chủ Công nghệ thông tin Quản trị mạng Tài liệu tổng quát về phonegap...

Tài liệu Tài liệu tổng quát về phonegap

.PDF
155
678
101

Mô tả:

Tài liệu tổng quát về Phonegap
Phonegap cho người mới học MỤC LỤC LỜI NÓI ĐẦU ........................................................................................................................ 5 Các tài liệu liên quan ............................................................................................................. 6 I.Events................................................................................................................................. 7 1.1.Hiểu thêm về events .................................................................................................... 7 1.2.Cách sử dụng EVENTS LISTENER............................................................................. 8 1.3.Hiểu thêm về các dạng sự kiện EVENT TYPES .......................................................... 9 1.3.1.Backbutton ............................................................................................................ 9 1.3.2.Deviceready ........................................................................................................ 10 1.3.3.Menubutton ......................................................................................................... 11 1.3.4.Pause.................................................................................................................. 12 1.3.5.Resume .............................................................................................................. 13 1.3.6.Searchbutton....................................................................................................... 14 1.3.7.Online ................................................................................................................. 15 1.3.8.Offline ................................................................................................................. 16 1.3.9.Một ví dụ đơn giản về sự phản hồi lại các sự kiện events .................................. 17 1.3.10.Một ví dụ đơn giản về việc phản hồi lại các sự kiện Button Events ................... 18 II.Cách làm việc với thiết bị, mạng network, và các thông báo notifications ......................... 20 2.1.Cách lấy thông tin từ thiết bị ...................................................................................... 20 2.1.2.Cách lấy về tên của thiết bị Device Name ........................................................... 20 2.1.3.Cách lấy về thông tin phiên bản phonegap.......................................................... 21 2.1.4.Cách lấy về nền tảng thiết bị Device Platform ..................................................... 21 2.1.5.Cách lấy về ID quốc tế của thiết bị UUID ............................................................ 21 2.1.6.Cách lấy về thông tin phiên bản hệ điều hành ..................................................... 22 2.1.7.Ví dụ về cách lấy thông tin của thiết bị ................................................................ 22 2.2.Cách kiểm tra 1 mạng network .................................................................................. 23 Cách xác định dạng kết nối .......................................................................................... 24 2.3.Cách sử dụng các thông báo NOTIFICATIONS......................................................... 26 2.3.1.Cách sử dụng Alerts ........................................................................................... 26 2.3.2.Cách sử dụng hộp thoại tương tác Confirmation Dialogs .................................... 27 2.3.3.Cách sử dụng Beeps .......................................................................................... 28 2.3.4.Cách sử dụng chế độ rung Vibrations ................................................................. 29 2.3.5.Ví dụ về cách sử dụng tất cả 4 loại thông báo Notifications ................................ 29 III.Gia tốc kế Accelerometer ................................................................................................ 32 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 1 Phonegap cho người mới học 3.1.Thế nào là gia tốc kế Accelerometer ? ....................................................................... 32 3.2.Cách sử dụng gia tốc kế Accelerometer .................................................................... 32 3.3.Các ứng dụng dùng gia tốc kế Accelerometer ........................................................... 33 3.4.Cách sử dụng đối tượng gia tốc kế ACCELERATION OBJECT ................................ 36 3.5.Cách sử dụng các phương thức ACCELEROMETER METHODS ............................. 37 3.5.1.Phương thức getCurrentAcceleration.................................................................. 37 3.5.2.Phương thức watchAcceleration ......................................................................... 38 3.5.3.Phương thức clearWatch .................................................................................... 39 3.6.Lựa chọn cấu hình ACCELEROMETER OPTION ..................................................... 40 3.7.Ví dụ về cách sử dụng gia tốc kế ACCELEROMETER .............................................. 40 Cách thức ví dụ hoạt động ........................................................................................... 41 IV.Ví trí địa lý Geolocation ................................................................................................... 42 4.1.Thế nào là vị trí địa lý Geolocation ? .......................................................................... 42 4.2.Cách sử dụng Geolocation ........................................................................................ 42 4.3.Các mẫu ứng dụng về Geolocation ........................................................................... 42 4.4.Các đối tượng POSITION, POSITIONERROR, và COORDINATES .......................... 45 4.4.1.Đối tượng Position Object ................................................................................... 45 4.4.2.Đối tượng PositionError ...................................................................................... 46 4.4.3.Đối tượng Coordinates Object............................................................................. 46 4.5.Ví dụ minh họa về geolocation................................................................................... 46 Cách ví dụ hoạt động ................................................................................................... 47 4.6.Cách cải thiện giao diện và trải nghiệm của người dùng ........................................... 48 V.Media............................................................................................................................... 52 5.1.Các Media Files là gì ? .............................................................................................. 52 5.2.Cách sử dụng các Media Files .................................................................................. 52 5.3.Các ứng dụng mẫu sử dụng media API ..................................................................... 52 5.4.Đối tượng MEDIA OBJECT ....................................................................................... 55 5.5.Cách sừ dụng các phương thức methods ................................................................. 56 5.5.1.phương thức media.getCurrentPosition .............................................................. 56 5.5.2.Phương thức media.getDuration ......................................................................... 57 5.5.3.Phương thức media.pause ................................................................................. 58 5.5.4.Phương thức media.play..................................................................................... 59 5.5.5.Phương thức media.release ............................................................................... 61 5.5.6.Phương thức media.seekTo ............................................................................... 61 5.5.7.Phương thức media.startRecord ......................................................................... 62 5.5.8.Phương thức media.stop .................................................................................... 63 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 2 Phonegap cho người mới học 5.5.9.Phương thức media.stopRecord ......................................................................... 64 5.5.10.Kiểm soát lỗi MediaError ................................................................................... 65 5.5.11.Ví dụ về việc sử dụng media api ....................................................................... 66 VI.Lưu trữ Storage .............................................................................................................. 73 6.1.Điểm khác biệt giữa Session Storage và Local Storage ?.......................................... 75 6.2.Cách sử dụng local storage ....................................................................................... 76 6.3.Cách sử dụng đối tượng DATABASE OBJECT ......................................................... 77 6.3.1.Cách tạo và Cách mở 1 database ....................................................................... 77 6.3.2.Cách chạy 1 sql Query ........................................................................................ 78 6.3.3.Cách phân tích và tiền xử lý các câu lệnh SQL (phòng chống SQL injection) ..... 81 6.3.4.Các giao dịch Transactions ................................................................................. 82 6.4.Cách xem 1 tập kết quả ............................................................................................. 84 6.5.Điều chỉnh lỗi ............................................................................................................. 86 6.6.Ví dụ về cách xây dựng 1 database đơn giản : .......................................................... 89 VII.Files ............................................................................................................................... 91 7.1.Hệ thống FILESYSTEMS .......................................................................................... 91 7.2.Tìm hiểu về các thư mục dẫn DIRECTORIES và các files ......................................... 92 7.2.1.Cách sử dụng đối tượng DirectoryEntry Object ................................................... 92 7.2.2.getMetadata ........................................................................................................ 93 7.2.3.setMetadata ........................................................................................................ 94 7.2.4.moveTo ............................................................................................................... 95 7.2.5.copyTo ................................................................................................................ 96 7.2.6.toURI................................................................................................................... 97 7.2.7.remove ................................................................................................................ 97 7.2.8.getParent ............................................................................................................ 98 7.2.9.createReader ...................................................................................................... 98 7.2.10.getDirectory....................................................................................................... 99 7.2.11.getFile ............................................................................................................... 99 7.2.12.removeRecursively.......................................................................................... 100 7.3.metadata ................................................................................................................. 101 7.4.FileError................................................................................................................... 102 7.5.Flags ....................................................................................................................... 102 7.6.LocalFileSystem ...................................................................................................... 103 7.7.DirectoryReader ...................................................................................................... 104 7.8.Cách sử dụng đối tượng FileEntry Object................................................................ 105 7.8.1.getMetadata ...................................................................................................... 106 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 3 Phonegap cho người mới học 7.8.2.moveTo ............................................................................................................. 107 7.8.3.copyTo .............................................................................................................. 108 7.8.4.toURI................................................................................................................. 109 7.8.5.remove .............................................................................................................. 109 7.8.6.getParent .......................................................................................................... 109 7.8.7.createWriter ...................................................................................................... 110 7.8.8.file ..................................................................................................................... 111 7.9.Cách đọc các files - FileReader ............................................................................... 111 7.9.1.readAsDataURL ................................................................................................ 112 7.9.2.abort.................................................................................................................. 113 7.9.3.readAsText........................................................................................................ 114 7.10.Cách đọc các files – FileWriter .............................................................................. 116 7.11.Cách truyền dẫn files – FileTransfer ...................................................................... 120 7.11.1.upload ............................................................................................................. 120 7.11.2.download......................................................................................................... 124 7.11.3.abort................................................................................................................ 125 7.11.4.onprogress ...................................................................................................... 125 7.12.FileTransferError ................................................................................................... 126 VIII.Camera ....................................................................................................................... 127 8.1.Cách truy cập 1 ảnh Picture..................................................................................... 127 8.2.Cách thiết lập các cấu hình trong Camera Options .................................................. 139 8.2.1.Quality............................................................................................................... 140 8.2.2.destinationType ................................................................................................. 141 8.2.3.sourceType ....................................................................................................... 143 8.2.4.allowEdit ........................................................................................................... 145 8.2.5.encodingType ................................................................................................... 146 8.2.6.targetHeight và targetWidth ............................................................................... 146 8.2.7.mediaType ........................................................................................................ 146 8.2.8.saveToPhotoAlbum ........................................................................................... 147 8.3.Làm việc với các vấn đề xảy ra với camera ............................................................. 147 IX.Splashscreen ................................................................................................................ 151 10.1.Cách phần quyền Permissions .............................................................................. 151 Android ..................................................................................................................... 151 iOS ............................................................................................................................ 151 10.2.Cách thiết lập......................................................................................................... 151 10.3.show ...................................................................................................................... 152 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 4 Phonegap cho người mới học 10.4.hide ....................................................................................................................... 153 LỜI NÓI ĐẦU 1 điểm cá nhân mình rất thích ở Phonegap, đó chính là tính đơn giản và hầu như không có tính ràng buộc. Phonegap được gọi là framework tuy nhiên nó không giống như 1 vài framework PHP mà mình đã từng học, với những framework PHP này, nó định nghĩa lại hoàn toàn cách bạn viết mã code, và nó đòi hỏi bạn phải hiểu rõ sâu rộng về các thành phần hệ thống bên trong, thì bạn mới có thể lập trình thông thạo được. Với Phonegap, nó không kìm kẹp bạn vào trong 1 hệ thống có 1 quy chuẩn riêng rối rắm nào cả, bạn có thể tự do thoải mái lập trình theo cách mà bạn muốn (tuy nhiên cái gì cũng có 2 mặt của nó), bạn chỉ cần nắm bắt 1 công nghệ duy nhất - công nghệ nền Web(bao gồm HTML5, Javascript, CSS), bỏ qua gánh nặng cần phải nắm bắt và hiểu rõ về các công nghệ bên trong mỗi nền tảng (Android, iOS, Blackberry, Windowphone, …) mà bạn vẫn có thể tạo ra được các ứng dụng “viết một lần, biên dịch qua cloud và chạy khắp nơi – tương thích với hầu hết các nền tảng hệ điều hành di động hiện tại”. Tài liệu được viết giống như 1 bản ghi chép, ghi lại những thứ mà mình đã đọc được từ các ebook tiếng anh, do vậy bố cục sắp xếp của nó có thể chưa chính xác, cách trình bày không theo chuẩn 1 ebook nào cả và nhiều chỗ viết chưa rõ nghĩa và không mạch lạc do hạn chế về ngoại ngữ của bản thân mình. Tài liệu mang đậm tính chất cá nhân do vậy bạn sẽ bắt gặp trong tài liệu này nhiều đoạn kí tự in đậm, in màu, cỡ chữ lớn bất thường và được tô màu khác nhau - đó là các đoạn có liên quan đến nhau hay là những ghi chú quan trọng mà bạn cần phải đọc kĩ. Nội dung trong tài liệu này được dựa trên các cuốn ebook: “Beginning Phonegap Thomas Myer”, “PhoneGap Essentials - John M. Wargo”, “Apache Cordova Documentation 2.2.0 – Phonegap team”, và 1 số giải thích, định nghĩa về kiến trúc của HTML5 từ W3C.org. Tài liệu này không đề cập tới đầy đủ các hàm APIs được Phonegap hỗ trợ. Cụ thể, các phần sau bị lược bỏ: Capture, Compass, Contacts, Globalization, Guides (do mình không có thời gian để viết nốt, và mình cũng không sử dụng đến các phần bị lược bỏ này) Nếu có thắc mắc hay góp ý gì, các bạn có thể đăng ký ngay 1 nick vào diễn đàn www.phonegap.vn/forum để đặt câu hỏi trực tiếp, các MOD và ADMIN sẽ trả lời câu hỏi của bạn trong thời gian sớm nhất. Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 5 Phonegap cho người mới học Các tài liệu liên quan  “Lập trình hướng đối tượng trong Javascript và các kiểu mẫu thiết kế”: http://www.slideshare.net/myloveforyounqt/lap-trinh-huong-doi-tuong-trongjavascript-va-cac-kieu-mau-thiet-ke  “Cách tối ưu hóa môi trường lập trình ứng dụng cho Android”: http://www.slideshare.net/myloveforyounqt/cch-ti-u-ha-mi-trng-lp-trnh-ng-dngcho-android-tng-tc-my-o-android  Hoặc đơn giản truy cập vào thư mục chia sẻ sau: http://sdrv.ms/VoAXBi (rất có thể trong 1 thời gian nữa, mình sẽ viết 1 ebook liên quan đến Jquery Mobile, nếu có thì các bạn sẽ thấy nó xuất hiện trong thư mục chia sẻ này) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 6 Phonegap cho người mới học I.Events 1 sự kiện events trong phonegap tương đối giống sự kiện trong javascript.1 hành động (thao tác) được thực hiện trên thiết bị - ví dụ như document object model (DOM) đã được tải xong và do đó thiết bị ở trạng thái sẵn sàng “ready” - và hiện tại phonegap có thể thực hiện 1 vài thứ để trả lời(đáp ứng) lại sự kiện này 1.1.Hiểu thêm về events Để đơn giản hóa, ta hiểu 1 event là bất cứ hành động nào mà có thể được xác định (nhận biết) bởi phonegap.trong lập trình javascript truyền thống, bất cứ phần tử nào trên 1 trang page cũng có thể có các sự kiện event nào đó, và nó có thể được kích hoạt bởi 1 vài mã javascript.ví dụ như 1 sự kiện onrollover trên 1 link có thể gây ra xuất hiện 1 bảng pop-up, hay sự kiện onclick có thể gây ra 1 bảng hộp thoại xem trước Tóm lại, sự kiện events có thể là click chuột, 1 image loading, rolling over trên 1 link nào đó hay những đối tượng DOM khác, việc lựa chọn 1 trường input field trong 1 form, submitting 1 form, hay sự kiện gõ 1 phím bất kì trên bàn phím.về đa số thì tất cả các dạng sự kiện events trên cũng có thể được sử dụng khi ta phát triển các ứng dụng sử dụng phonegap.tuy nhiên có những sự kiện chỉ được định nghĩa bên trong phonegap như sau :  deviceready  pause  resume  online  offline  backbutton  batterycritical  batterylow  batterystatus  menubutton  searchbutton  startcallbutton Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 7 Phonegap cho người mới học  endcallbutton  volumedownbutton  volumeupbutton trong tất cả các sự kiện events trên thì sự kiện deviceready là quan trọng nhất mà ta phải xem xét tới.không có nó thì ứng dụng của ta sẽ không biết khi nào phonegap đã được load hoàn toàn.khi nó được kích hoạt, ta có thể gọi 1 cách an toàn bất cứ các hàm PhoneGap function nào và do đó có thể lần lượt truy cập an toàn vào các API bản địa khi sự kiện deviceready event được kích hoạt, thì ta biết được 2 điều : DOM đã được load, và do vậy đã có PhoneGap API 1.2.Cách sử dụng EVENTS LISTENER để sử dụng bất cứ sự kiện event nào, thì ta sẽ cần phải sử dụng 1 event listener.như ví dụ sau : dùng để xác định sự kiện deviceready.ta phải làm như sau : PhoneGap Device Ready Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 8 Phonegap cho người mới học Ví dụ trên nhắc nhở ta rằng deviceready có thể là 1 sự kiện nhưng nó lại không phải là sự kiện chuẩn tắc trong trình duyệt, nó chỉ hoạt động và nhận biết bởi trong phonegap.nếu ta thử chạy sự kiện này trong 1 trình duyệt thông thường thì nó không bao giờ được kích hoạt 1.3.Hiểu thêm về các dạng sự kiện EVENT TYPES 1.3.1.Backbutton Sự kiện backbutton được kích hoạt khi người dùng ấn vào nút Back trên thiết bị Android Để xác định sự kiện event này, thì ta cần đăng ký 1 event listener như sau : document.addEventListener(“backbutton”, onBackButton, false); function onBackButton(){ //handle the back button } Cũng giống như các sự kiện event khác thì ta không nên đăng ký giống như thế này cho tới khi ta đã xác định được sự kiện deviceready event: PhoneGap backbutton Example 1.3.2.Deviceready Như đã nhắc đến từ trước, sự kiện deviceready là sự kiện quan trọng nhất mà ta có thể xác định.theo đó ta cần phải xác định sự kiện này đầu tiên trước khi ta làm bất cứ những gì khác bởi vì khi nó được kích hoạt thì đồng nghĩa với việc ta chắc chắn gọi được các PhoneGap API document.addEventListener(“deviceready”, onDeviceReady, false); function onDeviceReady(){ //ready! } Để dành cho những người phát triển trên BlackBerry OS 4.6, thì RIM Browserfield không hỗ trợ hàm sự kiện event này, nên ta cần sử dụng PhoneGap.available để thay thế như sau : function onLoad() { var intervalID = window.setInterval( function() { if (PhoneGap.available) { window.clearInterval(intervalID); onDeviceReady(); } }, 500 ); } function onDeviceReady() { // use the phonegap api! } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 10 Phonegap cho người mới học 1.3.3.Menubutton Sự kiện menubutton được kích hạot khi người dung ấn vào nút Menu trên thiết bị android Để xác định sự kiện này, thì ta cần đăng ký 1 event listener như sau : document.addEventListener(“menubutton”, onMenuButton, false); function onMenuButton(){ //handle the menu button } Cũng giống như các events khác, ta không nên đăng ký kiểu như thế này cho tới khi ta xác định được sự kiện deviceready PhoneGap menubutton Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 11 Phonegap cho người mới học 1.3.4.Pause Khi sự kiện pause được kích hoạt là khi 1 ứng dụng được đặt vào chế độ chạy nền Để xác định sự kiệ này, ta đăng kí 1 event listener như sau : document.addEventListener(“pause”, onPause, false); function onPause(){ //handle the pause event } Hay ta làm theo như đúng tiêu chuẩn giống như ở trên như sau : PhoneGap pause Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 12 Phonegap cho người mới học 1.3.5.Resume Sự kiện resume được kích hoạt khi 1 ứng dụng đang ở trạng thái tạm dừng (chạy nền) được kích hoạt trở lại làm việc Để xác định sự kiệ này, ta đăng kí 1 event listener như sau : document.addEventListener(“resume”, onResume, false); function onResume(){ //handle the resume event } Cũng giống như các events khác, ta không nên đăng ký kiểu như thế này cho tới khi ta xác định được sự kiện deviceready PhoneGap resume Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 13 Phonegap cho người mới học 1.3.6.Searchbutton Sự kiện searchbutton được kích hoạt khi người dùng ấn vào nút Search trên thiết bị android Để xác định sự kiệ này, ta đăng kí 1 event listener như sau : document.addEventListener(“searchbutton”, onSearchButton, false); function onSearchButton(){ //handle the search button } Cũng giống như các events khác, ta không nên đăng ký kiểu như thế này cho tới khi ta xác định được sự kiện deviceready PhoneGap searchbutton Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 14 Phonegap cho người mới học 1.3.7.Online Sự kiện online được kích hoạt khi 1 ứng dụng phonegap đang online (điều này có nghĩa là nó đang được kết nối internet).đây là 1 sự kiện mới được thêm vào trong phiên bản 0.9.6 và nó chỉ được hỗ trợ trên các thiết bị iOS, Android, and BlackBerry Để xác định sự kiệ này, ta đăng kí 1 event listener như sau : document.addEventListener(“online”, isOnline, false); function isOnline(){ //handle the online event } Cũng giống như các events khác, ta không nên đăng ký kiểu như thế này cho tới khi ta xác định được sự kiện deviceready PhoneGap online Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 15 Phonegap cho người mới học 1.3.8.Offline Sự kiện offline được kích hoạt khi 1 ứng dụng phonegap đang offline (điều này có nghĩa là nó không kết nối internet).đây là 1 sự kiện mới được thêm vào trong phiên bản 0.9.6 và nó chỉ được hỗ trợ trên các thiết bị iOS, Android, and BlackBerry Để xác định sự kiệ này, ta đăng kí 1 event listener như sau : document.addEventListener(“offline”, isOffline, false); function isOffline(){ //handle the offline event } Cũng giống như các events khác, ta không nên đăng ký kiểu như thế này cho tới khi ta xác định được sự kiện deviceready PhoneGap offline Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 16 Phonegap cho người mới học 1.3.9.Một ví dụ đơn giản về sự phản hồi lại các sự kiện events Ta tạo ra ứng dụng đơn giản, phản hồi lại các sự kiện pause và resume events : PhoneGap Event Example Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 17 Phonegap cho người mới học Chương trình chạy như thế nào event listener là 1 khóa quan trọng, nó dùng để xác định khi nào sự kiện deviceready event được kích hoạt và khi sự kiện này được kích hoạt thì ta biết được rằng ta có thể gọi 1 cách an toàn các API còn lại của phonegap khi nó được kích hoạt, thì sự kiện deviceready event làm chạy hàm onDeviceReady() function và lần lượt trong hàm này đăng ký 2 event listener mới, 1 cái cho sự kiện pause event và cái thứ 2 cho sự kiện resume event 1.3.10.Một ví dụ đơn giản về việc phản hồi lại các sự kiện Button Events PhoneGap Button Example Chương trình chạy như thế nào Chương trình đơn giản là đầu tiên tiến hành kiểm tra để chắc chắn rằng ứng dụng phonegap đã sẵn sàng hay chưa, và sau đó đăng ký 3 event listeners, từng cái 1 dành cho các nút của thiết bị như Search, Menu, và Back buttons Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 19 Phonegap cho người mới học II.Cách làm việc với thiết bị, mạng network, và các thông báo notifications 2.1.Cách lấy thông tin từ thiết bị Phonegap có 1 runtime object được gọi là đối tượng thiết bị device, để lưu giữ thông tin có ích về thiết bị.sau đây là những thuộc tính của đối tượng device :  device.name – là tên của thiết bị (ví dụ như my iphone)  device.phonegap – phiên bản của phonegap  device.platform – loại của thiết bị (ví dụ như iphone)  device.uuid – số id của thiết bị  device.Version – phiên bản hệ điều hành OS đang chạy quan trọng phải chú ý rằng : device được gán thành đối tượng window object, do vậy nó hoàn toàn có phạm vi toàn cục.hiểu theo cách khác, cả 2 biến sau đều tham chiếu tới cùng thiết bị device : //both of these reference the same device var myPhoneName = window.device.name; var myPhoneName = device.name; trong phần này ta sẽ học lấy về các thông tin sau :  tên của thiết bị device  phiên bản phonegap  ID quốc tế dùng để xác định thiết bị duy nhất (UUID)  Phiên bản hệ điều hành của thiết bị 2.1.2.Cách lấy về tên của thiết bị Device Name Để lấy về tên của thiết bị ta sử dụng device.name như sau: var myPhoneName = device.name; giá trị này được trả về được thiết lập bởi nhà sản xuất và có thể biến đổi từ sản phẩm này đến sản phẩm khác và biến đổi ngay cả trên cùng 1 phiên bản sản phẩm.ví dụ, đây là 1 danh sách của các giá trị trả về cho các loại điện thoại khác nhau :  Android Nexus One trả về là Passion ( đây là tên mã sản phẩm)  Android Motorola Droid trả về là voles Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 20 Phonegap cho người mới học  BlackBerry Bold 8900 trả về là 8900  iPhone trả về là tên được thiết lập trong iTunes( ví dụ như Tom‟s phone ) thuộc tính device.name được hỗ trợ trong các thiết bị Android, BlackBerry, và iPhone 2.1.3.Cách lấy về thông tin phiên bản phonegap để lấy về thông tin phiên bản phonegap trên thiết bị, ta sử dụng thuộc tính device.phonegap như sau : var myDevicePhoneGap = device.phonegap; thuộc tính device.phonegap được hỗ trợ trên các thiết bị Android, Blackberry, và iPhone 2.1.4.Cách lấy về nền tảng thiết bị Device Platform cách lấy về tên của hệ điều hành trên thiết bị, ta sử dụng device.platform như sau: var myDevicePlatform = device.platform; phụ thuộc vào thiết bị device, câu lệnh này trả về các thứ sau :  android  blackberry  iphone  webOS Chú ý: theo kinh nghiệm của lập trình viên thì các thiết bị iphone trả về là ios và 1 vài thiết bị blackberry trả về phiên bản hệ điều hành để thay thế cho tên của hệ điều hành.ví dụ nó có thể trả về 1.10.3.5 thay cho blackberry 2.1.5.Cách lấy về ID quốc tế của thiết bị UUID mọi thiết bị điều phải có số UUID, số này được thêm vào thiết bị bởi nhà sản xuất. UUID có thể có những chiều dài khác nhau phụ thuộc vào thiết bị, nó có thể luôn luôn được định nghĩa như là 1 mẫu model và nền tảng platform.ví dụ, android sử dụng 1 số kiểu int ngẫu nhiên 64-bit; blackberry sử dụng mã PIN 9 kí tự; và iphone sử dụng 1 chuỗi string là giá trị của hàm băm hash cách lấy UUID của thiết bị, ta sử dụng device.uuid như sau : var myDeviceID = device.uuid; thuộc tính device.uuid được hỗ trợ trên các thiết bị Android, BlackBerry, và iPhone Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 21 Phonegap cho người mới học 2.1.6.Cách lấy về thông tin phiên bản hệ điều hành cách lấy về tên phiên bản hệ điều hành của thiết bị, ta sử dụng device.version như sau : var myDeviceOS = device.version; phụ thuộc vào hệ điều hành, ta sẽ lấy được về các giá trị khác nhau.ví dụ trên android, hệ điều hành Froyo OS trả về là 2.2 và Éclair OS trả về là 2.1, 2.0.1 hay 2.0. BlackBerry Bold 9000 sử dụng OS 4.6 thì trả về là 4.6.0.282 và 1 iphone chạy IOS 3.2 trả về là 3.2 thuộc tính device.version được hỗ trợ trên các thiết bị Android (2.1 and higher), BlackBerry, and iPhone 2.1.7.Ví dụ về cách lấy thông tin của thiết bị ta tạo ra 1 đoạn mã đơn giản dùng để cho phép ta sử dụng các phần tử device để lấy về các thông tin về thiết bị : My Device

Loading device properties...

Cách thức chương trình hoạt động Trong ví dụ này, ta tạo ra 1 tài liệu HTM đơn giản, đầu tiên tải về thư viện phonegap.js.tiếp theo ta viết 1 hàm onLoad() function dùng để đăng ký 1 event handler bằng cách sử dụng addEventListener.đặc biệt, ta muốn tuân theo sự kiện deviceready event, và khi nó được kích hoạt thì nó sẽ chạy hàm onDeviceReady() function. Hàm onDeviceReady() function làm 2 thứ : thứ nhất là nó điền vào 1 đoạn văn vào trong document DOM có id là “props” bằng cách sử dụng getElementById, sau đó nó in ra thông tin về thiết bị vào trong phần tử DOM đó Nếu ta sử dụng JQuery, thì ta có thể đơn giản viết như sau : function onDeviceReady() { $(“#props”).html(„Device Name: „ + device.name + „
‟ + „Device PhoneGap: „ + device.phonegap + „
‟ + „Device Platform: „ + device.platform + „
‟ + „Device UUID: „ + device.uuid + „
‟ + „Device Version: „ + device.version + „
‟); } 2.2.Cách kiểm tra 1 mạng network Với 1 người lập trình nền web hay destop, thì ta thường giả định rằng kết nối mạng network luôn luôn được bật thông qua kết nối có dây hoặc không dây.tuy nhiên khi ta bắt đầu làm việc với các thiết bị di động, ta không thể luôn luôn giả định như vậy.tín hiệu kết nối có thể không tồn tại hoặc có thể rất yếu không ổn định, hay người dùng có thể chuyển đổi từ cellular sang wifi hay ngược lại May mắn cho ta là phonegap API có chứa 1 đối tượng là Connection object, đối tượng này cho phép ta truy cập vào thông tin kết nối cellular và WiFi của thiết bị Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 23 Phonegap cho người mới học Cách xác định dạng kết nối Để xác định dạng của kết nối mạng network thì ta sẽ phải sử dụng connection.type như sau : function checkConnection(){ var myState = navigator.network.connection.type; //return a specific state } Hàm connection.type sẽ trả về 1 trong số danh sách các dạng kết nối có thể sau :  UNKNOWN  ETHERNET  WIFI  CELL_2G  CELL_3G  CELL_4G  NONE 1 ý tưởng tốt để làm việc với các bảng thông điệp để thông báo tới người dùng.ta sẽ làm như sau : function checkConnection() { var networkState = navigator.network.connection.type; var states = {}; states[Connection.UNKNOWN] = „Unknown connection‟; states[Connection.ETHERNET] = „Ethernet connection‟; states[Connection.WIFI] = „WiFi connection‟; states[Connection.CELL_2G] = „Cell 2G connection‟; states[Connection.CELL_3G] = „Cell 3G connection‟; states[Connection.CELL_4G] = „Cell 4G connection‟; states[Connection.NONE] = „No network connection‟; alert(„Connection type: „ + states[networkState]); } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 24 Phonegap cho người mới học ở ví dụ trên, nếu dạng kết nối là NONE thì thông báo sẽ chứa thông điệp là „No network connection‟ ví dụ về cách kiểm tra mạng network khả dụng Connectivity Example

A dialog box will report the network state.

Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 25 Phonegap cho người mới học Cách thức ví dụ hoạt động Đầu tiên ta load thư viện phonegap và sau đó đăng ký 1 event handler là sự kiện deviceready Khi thiết bị đã ở trạng thái sẵn sàng thì ta chạy navigator.network.isReachable trên google.com.website này luôn luôn sống và nó là công cụ tốt để kiểm tra kết nối mạng network (hay theo cách khác, ta có thể không muốn kiểm tra trên 1 server vì nó có thể chết bất cứ lúc nào khi vào lúc ta tiến hành kiểm tra) Tiếp theo, ta thiết lập 1 đối tượng đơn giản có chứa thông báo trạng thái network status từ phonegap giống như các chỉ mục keys, với các thông điệp ta tùy chỉnh giống như các giá trị values – đây là cách ta tránh khỏi bất cứ thông điệp khó hiểu nào được gửi tới người sử dụng thiết bị Tiếp theo, ta chạy 1 hàm JavaScript alert() chứa thông điệp về kết nối.nó sẽ được pop-up trên thiết bị và người dùng có thể tắt nó Cuối cùng, để chắc chắn ta tiến hành chạy hàm onLoad() tử thẻ 2.3.Cách sử dụng các thông báo NOTIFICATIONS Trong những ví dụ mà ta đã làm từ trước, ta đã sử dụng 1 hàm tiêu chuẩn của javascript là alert() để hiện thị thông tin tới người sử dụng( đặc biệt nhất là thông tin về trạng thái của kết nối mạng network).mặc dù ta có thể sử dụng loại hệ thống thông báo này trên thiết bị, tuy nhiên phonegap mang tới tận 4 loại thông báo notifications khác nhau mà ta có thể tận dụng :  Alerts  Confirmation dialogs  Beeps  Vibrations 2.3.1.Cách sử dụng Alerts Để hiện thị ra 1 thông báo alert tùy chỉnh hay 1 hộp tương tác dialog box, ta sử dụng hàm notification.alert như sau : navigator.notification.alert(message,callback,[title],[button]); hàm này cần bắt buộc phải có 2 tham số truyền vào và 2 tham số tùy chọn : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 26 Phonegap cho người mới học  Message – 1 chuỗi string chứa thông điệp (ví dụ như “The network status is WIFI only”  Callback – là hàm function gọi lại được gọi khi thông báo alert bị bỏ qua  Title – 1 chuỗi string chứa tên tiêu đề của hộp alert (tùy chọn)  Button – 1 chuỗi string chứa tên của nút button (ví dụ như OK) (tùy chọn) Hàm notification.alert có hỗ trợ trên các thiết bị Android, BlackBerry OS 4.6, webOS,iphone Đây là 1 ví dụ hơi phức tạp bao gồm chứa tham số callback : function gameOverDismissed() { // calculate or store their final score... } navigator.notification.alert( [AU: Be sure you replace all tabs in your code with five spaces.] „Game Over!‟, // message gameOverDismissed, // callback „Game Over‟, // title „Done‟ // buttonName ); Nếu ta đang làm việc trên blackberry hay webOS thì chú ý rằng ta sẽ chỉ có thể gửi đi 1 thông điệp (không tùy chỉnh được tiêu đề titles, tên của nút button, hay khả năng sử dụng hàm callback) như sau : //BlackBerry 4.6 / webOS navigator.notification.alert(„Game Over! „); 2.3.2.Cách sử dụng hộp thoại tương tác Confirmation Dialogs 1 hộp thoại confirmation dialog cũng giống với 1 alert, ngoại trừ rằng nó chứa nhiều nút buttons.ví dụ như 1 hộp thoại confirmation dialog đưa ra câu hỏi “Do you wish to continue?” Thì có 2 button là Yes và No Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 27 Phonegap cho người mới học Để tạo ra 1 hộp thoại confirmation dialog, ta sử dụng hàm notification.confirm.ta sẽ cần đóng gói nó trong 1 hàm function, bởi vì nó thường được gọi từ 1 link hay 1 button trên giao diện HTML như sau : // process the confirmation dialog result function onConfirm(button) { alert(„You selected button „ + button); } // Show a custom confirmation dialog // function showConfirm() { navigator.notification.confirm( „Game Over!‟, // message onConfirm, // callback to invoke with index of button pressed „Game Over‟, // title „Restart,Exit‟ // buttonLabels ); } 2.3.3.Cách sử dụng Beeps Thỉnh thoảng ta không cần tới 1 hiện thị thông báo – mà đơn giản chỉ cần 1 tiếng beep để ra hiệu thông báo khi người dùng làm gì đó.để tạo ra tiếng beep, ta sử dụng hàm notification.beep như sau : navigator.notification.beep(2); hàm này cần 1 tham số truyền vào, nó là 1 kiểu int dùng để xác định số tiếng beep mà ta muốn phát hàm này được hỗ trợ trong các thiết bị Android, BlackBerry, webOS, và iPhone Chú ý: android sẽ chơi bản nhạc thông báo Notification mặc định được thiết lập ở Settings ➪Sound and Display panel.còn iphone cũng sẽ từ chối tham số tiếng beep truyền vào Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 28 Phonegap cho người mới học 2.3.4.Cách sử dụng chế độ rung Vibrations thỉnh thoảng không phải lúc nào cũng thích hợp để thiết bị phát ra tiếng, do đó phonegap cung cấp 1 hàm sử dụng chế độ rung là notification.vibrate, hàm này cần 1 tham số để truyền vào là thời gian tính bằng mili giây như sau : navigator.notification.vibrate(2000); hàm này được hỗ trợ trong các thiết bị Android, BlackBerry, webOS, và iPhone Chú ý: iphone sẽ từ chối tham số truyền vào và nó sẽ rung theo thời gian được thiết lập sẵn 2.3.5.Ví dụ về cách sử dụng tất cả 4 loại thông báo Notifications Notifications

Show Alert

Show Confirmation

Play Beep

Vibrate

Cách thức ví dụ hoạt động ở ví dụ này, trong hàm onDeviceReady(), ta để nó trống rỗng bởi vì tài liệu document chính đã chứa 1 dãy các link dùng để gọi các hàm function và lần lượt chúng sẽ kích hoạt các thông báo khác nhau ví dụ, bằng cách ấn vào link đầu tiên hàm showAlert() sẽ được kích hoạt và nó sẽ hiện thị 1 thông báo alert tùy chỉnh.link thứ 2 sẽ kích hoạt hàm showConfirm() hiện thị ra 1 hộp thoại confirmation box Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 31 Phonegap cho người mới học III.Gia tốc kế Accelerometer 3.1.Thế nào là gia tốc kế Accelerometer ? gia tốc kế Accelerometer là 1 thiết bị dùng để ghi lại chuyển động trong không gian 3 chiều XYZ để hình dung được 3 chiều XYZ, thì ta đặt thiết bị lên trên 1 bề mặt phẳng giống như trên mặt bàn.ta giả sử rằng bề mặt này có rất ít ma sát và ví dụ như ta có thể đặt thiết bị sang trái và sang phải mà không cần phải nâng nó lên.mục đích của ví dụ này là giúp ta hình dung được nơi ta đặt thiết bị tại vị trí (0,0,0) trong không gian tọa độ.bất cứ cách nào mà ta dùng để di chuyển thiết bị thì sẽ dẫn đến 1 sự thay đổi trong hệ tọa độ nếu thiết bị là mỏng nằm trên mặt bàn và khi ta di chuyển nó sang trái hay sang phải thì chính là ta di chuyển nó dọc theo trục X.ta di chuyển nó sang trái là ta cho nó 1 kết quả âm, và ta di chuyển nó sang phải thì ta cho nó kết quả dương.nếu ta di chuyển thiết bị ra xa bàn hay tới gần chỗ ta thì chính là ta đang di chuyên nó trên trục Y.nếu di chuyển nó ra xa thì ta được kết quả dương theo trục Y, và nếu di chuyển nó lại gần thì ta được kết quả âm trục Z được miêu tả là chiều lên xuống và được thêm vào làm chiều thứ 3 của hệ trục tọa độ.nếu ta cầm lấy thiết bị và cầm nó tiến đến mặt thì ta được kết quả dương theo trục Z.nếu ta cho thiết bị xuống dưới mặt bàn thì ta được kết quả âm theo trục Z tất nhiên rất là khó khăn khi ta dịch chuyển 1 thiết bị theo chỉ 1 trục mà không gây ảnh hưởng tới các trục khác.nếu ta cầm thiết bị lên ( ví như di chuyển nó tới gần mặt) thì ta nhận được kết quả dương đối với trục Z, nhưng cũng giống như vậy khi ta mang nó gần cơ thể hơn thì thu được kết quả âm theo trục Y…… giờ hình dung xem, chuyện gì sẽ xảy ra nếu ta tung thiết bị quay trở lại bề mặt bàn - nhớ đùng tung quá mạnh ta có thể làm vỡ nó.khi đó gia tốc kế accelerometer bên trong thiết bị sẽ xác định tất cả chuyển động dọc theo trục XYZ 3.2.Cách sử dụng gia tốc kế Accelerometer nhớ rằng gia tốc kế có thể xác định được chuyển động, độ nghiêng, và gia tốc do đó nó dùng để tạo ra các ứng dụng sáng tạo  Làm thế nòa để tạo ra 1 ứng dụng dùng để xác định chuyển động của người và giữ các vết của chúng trong lúc người sử dụng đang thực hiện? tất cả những gì người dùng phải làm là bật ứng dụng lên và đặt thiết bị vào trong túi Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 32 Phonegap cho người mới học  Dành cho các vị trí có ánh sáng thấp, thì ta có thể tự động chụp 1 bức ảnh với camera của thiết bị nếu thiết bị vẫn hoạt động tốt  Ta có thể xây dựng 1 game mà trong đó ta điều khiển các bộ phận có tương tác với độ nghiêng hay chuyển động của thiết bị 3.3.Các ứng dụng dùng gia tốc kế Accelerometer nếu ta có 1 chiếc iphone, và ta hầu như chắc chắn biết đến hay đã từng chơi “DoodleJump” như trong hình dưới. “DoodleJump” là 1 game dễ gây nghiện nó cho phép nhân vật của ta nhảy từ mức này tới mức khác bằng cách sử dụng gia tốc kế để xác định chuyển động sang trái/phải 1 game khá phổ biến khác là “Super Monkey Ball” như trong hình 6-2. Ý tưởng nằm đằng sau game này là hướng dẫn 1 chú khỉ nhỏ dễ thương vượt qua các chướng ngại vật khác nhau bằng cách nghiêng hay lắc iphone Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 33 Phonegap cho người mới học Trên thiết bị android, ta cũng có “Hyperspace” như trong hình 6-3, trong đó ta sử dụng nghiêng hay chuyển động để điều khiển 1 trái bóng để đi xuyên qua các chướng ngại vật. tất nhiên, có vô số các ứng dụng sử dụng gia tốc kế accelerometer Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 34 Phonegap cho người mới học Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 35 Phonegap cho người mới học 3.4.Cách sử dụng đối tượng gia tốc kế ACCELERATION OBJECT đối tượng gia tốc kế ACCELERATION OBJECT là 1 đối tượng chỉ có thể đọc và nó chứa dữ liệu gia tốc kế được chụp lại tại 1 điểm xác định trong 1 thời điểm.và đối tượng này có các thuộc tính :  X - đại lương chuyển động trên trục X, được trình bày là 1 số  Y - đại lương chuyển động trên trục Y, được trình bày là 1 số  Z - đại lương chuyển động trên trục Z, được trình bày là 1 số  Timestamp – mốc thời gian lúc tạo ra, được trình bày trong mili giây Đối tượng này được tạo ra và được cư trú trong phongegap và nó trả về 1 phương thức accelerometer method như ví dụ sau : navigator.accelerometer.getCurrentAcceleration(onSuccess, onError); //you now have access to an acceleration object //which contains x, y, z, and timestamp data function onSuccess(acceleration) { alert(„Acceleration X: „ + acceleration.x + „\n‟ + „Acceleration Y: „ + acceleration.y + „\n‟ + „Acceleration Z: „ + acceleration.z + „\n‟ + „Timestamp: „ + acceleration.timestamp + „\n‟); }; Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 36 Phonegap cho người mới học function onError() { alert(„Sorry! Error!‟); }; 3.5.Cách sử dụng các phương thức ACCELEROMETER METHODS 3.5.1.Phương thức getCurrentAcceleration Để lấy về gia tốc kế hiện tại theo trục XYZ thì ta phải sử dụng phương thức accelerometer.getCurrentAcceleration như sau : navigator.accelerometer.getCurrentAcceleration(accelerometerSuccess, accelerometerError); dữ liệu acceleration data được trả về thông qua hàm accelerometerSuccess callback : function onSuccess(acceleration) { alert(„Acceleration X: „ + acceleration.x + „\n‟ + „Acceleration Y: „ + acceleration.y + „\n‟ + „Acceleration Z: „ + acceleration.z + „\n‟ + „Timestamp: „ + acceleration.timestamp + „\n‟) }; function onError() { alert(„ooooops!‟); }; navigator.accelerometer.getCurrentAcceleration(onSuccess, onError); Chú ý: trên các thiết bị IOS, thì việc gọi phương thức getCurrentAcceleration() sẽ không làm việc như cách mà ta nghĩ,dùng để thay thế cho current acceleration thì nó sẽ báo cáo về giá trị cuối cùng được báo cáo từ lời gọi PhoneGap accelerometer.để thay thế, ta sẽ cần sử dụng phương thức watchAcceleration() Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 37 Phonegap cho người mới học 3.5.2.Phương thức watchAcceleration Phương thức watchAcceleration cho phép ta lấy về dữ liệu gia tốc kế ở 1 khoảng thời gian chính xác.nếu ta thiết lập 1 biến chứa lời gọi phương thức và chuyển tiếp vào trong 1 tham số tần suất như là 1 trong những lựa chọn, thì ta sẽ lấy về dữ liệu gia tốc kế dựa trên 1 chu kì chuẩn như sau : function onSuccess(acceleration) { alert(„Acceleration X: „ + acceleration.x + „\n‟ + „Acceleration Y: „ + acceleration.y + „\n‟ + „Acceleration Z: „ + acceleration.z + „\n‟ + „Timestamp: „ + acceleration.timestamp + „\n‟); }; function onError() { alert(„onError!‟); }; var options = { frequency: 1000 }; // Update every second var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options); đoạn code ở trên sẽ tạo ra 1 thông báo alert theo chu kì từng giây một.1 hàm hữu dụng có thể là 1 vài thứ giống như ở dưới mà trong đó các phần tử DOM luôn được làm mới bên trong HTML, và do vậy nó cho ta biết sự in dữ liệu ra màn hình hữu dụng như sau : function onSuccess(acceleration) { var myX = document.getElementById(„my_x‟); var myY = document.getElementById(„my_y‟); var myZ = document.getElementById(„my_z‟); var myT = document.getElementById(„my_timestamp‟); myX.innerHTML(acceleration.x); myY.innerHTML(acceleration.y); myZ.innerHTML(acceleration.z); myT.innerHTML(acceleration.timestamp); } function onError() { alert(„oooops!‟); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 38 Phonegap cho người mới học }; var options = { frequency: 1000 }; // Update every second var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options); để đoạn code trên hoạt đọng, ta phải chắc chắn là tạo ra các phần tử DOM tương ứng thích hợp như sau :
Chú ý: trong iOS thì gia tốc kế được quan tâm đặc biệt, do vậy phonegap sẽ bị giới hạn mức chu kỳ nhỏ nhất là 40 mili giây và lớn nhất là 1000 mili giây.do vậy nếu ta yêu cầu 1 cập nhật có chu kỳ là 3000 mili giây(hay là 3 giây) thì phonegap sẽ yêu cầu 1 chu kỳ là 1000 mili giây trên thiết bị nhưng sẽ gọi hàm callback thành công lại dựa vào yêu cầu là chu kỳ 3000 mili giây 3.5.3.Phương thức clearWatch Để ngừng việc xem các dữ liệu gia tốc kế được tạo bởi phương thức watchAcceleration(), thì ta phải sử dụng phương thức clearWatch() và tham chiếu tới biến mà ta vừa tạo ra từ trước như sau : watchID); navigator.accelerometer.clearWatch( thông thường, ta sẽ kích hoạt sự kiện này thông qua 1 nút click như sau : Tất nhiên, ta cũng có thể gán sự kiện này tới 1 vài loại chu kỳ như sau : thu thập dữ liệu trong 30 giây rồi ngừng lại Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 39 Phonegap cho người mới học 3.6.Lựa chọn cấu hình ACCELEROMETER OPTION Để thiết lập tần số là 5 giây, ta làm như sau : var options = { frequency: 5000 }; // Update every 5 seconds var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options); để thiết lập tần số thành nửa giây thì ta sử dụng như sau : var options = { frequency: 500 }; // Update every .5 seconds var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options); 3.7.Ví dụ về cách sử dụng gia tốc kế ACCELEROMETER Acceleration Example
Waiting for accelerometer...
Cách thức ví dụ hoạt động Khi ứng dụng vừa load xong thì hàm startWatch() được kích hoạt.hàm này sử dụng phương thức watchAcceleration() để khởi tạo việc xem dữ liệu gia tốc kế và báo cáo lại thông tin về tọa độ trục XYZ và timestamp rồi in ra hiện thị HTML Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 41 Phonegap cho người mới học IV.Ví trí địa lý Geolocation 4.1.Thế nào là vị trí địa lý Geolocation ? Geolocation bao hàm cách xác định vị trí địa lý thật của 1 thiết bị - trong trường hợp này là điện thoại smartphone mà ta sử dụng.cách thông thường nhất để xác định vị trí địa lý của 1 thiết bị là sử dụng tính năng GPS chứa bên trong smartphone – dùng để xác định kinh độ và vĩ độ Tuy nhiên, 1 vài thiết bị có thể sử dụng những dịch vụ khác để suy luận ra 1 ví trí – ví dụ như : 1 địa chỉ IP, xác định tần số radio (RFID), địa chỉ truy cập wifi (MAC), hay trạm phát sóng.bởi vì có rất nhiều phương thức khác nhau được sử dụng để thu thập các tọa độ ví trí, do vậy không ai có thể đảm bảo rằng phonegap API sẽ trả về vị trí thật sự của thiết bị 4.2.Cách sử dụng Geolocation Lí do hiển nhiên nhất để sử dụng Geolocation gần đây là xu hướng dùng để xác định nơi mà có 1 vài thứ xảy ra.ví dụ như dữ liệu Geolocation được thêm vào các bức ảnh hay trên các mạng xã hội, … Tuy nhiên các ứng dụng Geolocation chử yếu chỉ rõ các vị trí ở thế giới thật ( giống như nhà hàng, quán bar, …) và kết hợp chúng với thiết bị trên tay người sử dụng Theo đó có 3 cách sáng tạo mà ta có thể thêm dữ liệu geolocation vào bất cứ ứng dụng nào :  Không chỉ thêm kinh độ và vĩ độ mà còn thêm vào tiêu đề và độ cao vào các bức ảnh  Cho phép người dùng tích vào bất cứ tọa độ do đó họ có thể lưu giữ được dấu vết quãng đường mình đã đi 4.3.Các mẫu ứng dụng về Geolocation Các ứng dụng về Geolocation nổi tiếng là “foursquare” (hình 8-1) và “Gowalla” (hình 8-2).cả 2 ứng dụng đều là miễn phí và tương thích với các nền tảng thiết bị khác nhau.ta có thể đăng ký và bắt đầu sử dụng chúng.nếu ta đang ở trong 1 nhà hàng ăn hay 1 quán bar thì ta có thể sử dụng chúng để tích vào và sử dụng facebook hay twitter để thông báo cho bạn bè biết nơi ta đang có mặt Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 42 Phonegap cho người mới học Cả 2 ứng dụng “Gowalla” và “foursquare” đều hướng tới mỗi trường mạng xã hội – những người sử dụng không chỉ tích vào vị trí của mình mà còn truy cập được vào các cuộc hẹn và các lời đề nghị được tạo bởi vị trí của các nhà bán lẻ. Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 43 Phonegap cho người mới học Tất nhiên, nếu ta là người dùng facebook hay google+, thì ta có thể tham gia vào trong các games liên quan đến geolocation.như hình 8-3, các địa điểm trong facebook cho phép ta đăng ký 1 vị trí và sau đó nói cho những người bạn khác nơi mà ta có mặt Trên google+, ta có thể dễ dàng đăng ký 1 địa điểm bằng cách tích vào ô checkbox ở góc phía trên bên phải của trang như hình 8-4.sau đó ta có thể lựa chọn 1 ví trí từ danh sách các địa điểm lân cận và thêm 1 bản ghi chú và 1 bức ảnh và đăng nó lên Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 44 Phonegap cho người mới học 4.4.Các đối tượng POSITION, POSITIONERROR, và COORDINATES PhoneGap Geolocation API sử dụng 3 đối tượng chỉ đọc chứa các thông tin geolocation :  Position  PositionError  Coordinates Mỗi đối tượng trong các đối tượng trên được tạo ra và tính toán khi ta sử dụng các phương thức khác nhau, và dữ liệu được trả về giống như 1 phần của các hàm gọi lại callback 4.4.1.Đối tượng Position Object Đối tượng Position Object chứa các tọa độ được tạo ra bởi geolocation API và nó gồm 2 thuộc tinh sau :  Coords – đây là 1 tập các tọa độ địa lý (như kinh độ, vĩ độ, độ cao,..)  Timestamp – thời điểm được tạo tính bằng mili giây Ví dụ gọi hàm geolocation.getCurrentPosition() như ở ví dụ dưới thì kết quả trả về gồm có kinh độ, vĩ độ, độ cao, độ chính xác, độ chính xác độ cao, tiêu đề, tấc độ, và timestamp, được truyền vào hàm onSuccess : var onSuccess = function(position) { alert(„Latitude: „ + position.coords.latitude + „\n‟ + „Longitude: „ + position.coords.longitude + „\n‟ + „Altitude: „ + position.coords.altitude + „\n‟ + „Accuracy: „ + position.coords.accuracy + „\n‟ + „Altitude Accuracy: „ + position.coords.altitudeAccuracy + „\n‟ + „Heading: „ + position.coords.heading + „\n‟ + „Speed: „ + position.coords.speed + „\n‟ + „Timestamp: „ + new Date(position.timestamp) + „\n‟); } function onError(error) { alert(„code: „ + error.code + „\n‟ + „message: „ + error.message + „\n‟); } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 45 Phonegap cho người mới học navigator.geolocation.getCurrentPosition(onSuccess, onError); 4.4.2.Đối tượng PositionError như ta nhìn thấy trong ví dụ trước thì ta cũng có khả năng truy cập vào 1 hàm onError callback.hàm này trả về 2 thuộc tính của vấn đề là error code và error message error code sẽ là 1 trong những lỗi đã được định nghĩa trước như sau :  PositionError.PERMISSION_DENIED  PositionError.POSITION_UNAVAILABLE  PositionError.TIMEOUT Và error message sẽ được miêu tả chi tiết lỗi gặp phải 4.4.3.Đối tượng Coordinates Object Đối tượng Coordinates Object bao gồm 1 tập các thuộc tính chỉ đọc.ta đã gặp chúng trong ví dụ trước như là 1 phần của đối tượng Position object.trong thực tế, thì dữ liệu Coordinates được đính thêm vào đối tượng Position object và sau đó được trả về thông qua hàm onSuccess Các thuộc tính của đối tượng Coordinates object:  Vĩ độ latitude – là kiểm số thực  Kinh độ longitude - là kiểm số thực  Dộ cao altitude – độ cao tính bằng m so với mực nước biển  Dộ chính xác accuracy – là độ chính xác của việc đọc vĩ độ/kinh độ  Dộ chính xác altitudeAccuracy – là độ chính xác của độ cao  Tiêu đề heading – là hướng di chuyển  Tấc độ speed – là tấc độ so với mặt đất (m/s) 4.5.Ví dụ minh họa về geolocation Device Properties Example

Watching geolocation...

Cách ví dụ hoạt động Khi ứng dụng được tải xong thì phương thức watchPosition() được kích hoạt và cứ mỗi 3 giây thì thiết bị lại nhận được 1 cập nhật mới về kinh độ và vĩ độ Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 47 Phonegap cho người mới học 4.6.Cách cải thiện giao diện và trải nghiệm của người dùng Nếu ta nhìn vào giao diện của ứng dụng geolocation mà ta đã tạo ra ở trên thì ta sẽ nhận thấy nó không được đẹp và nó trông giống như hình 8-5.thực tế thì, tất cả những gì nó thực hiện là thêm liên tục các thông tin về geolocation vào trong màn hình cho tới khi ta tắt nó Để tiến hành giao diện UI, đầu tiên ta phải chắc chắn rằng project của ta có các thư mục jQTouch cần thiết ở bên trong nó như đã được mô tả trong chương trước.lưu ý đặt lên đầu đoạn code sau đoạn script tải phonegap.js: Tiếp theo, ta cần 1 đoạn HTML đặt trong thẻ như sau :

Geolocation

Watching geolocation...

Kết quả được làm đẹp sẽ trông như hình 8-6 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 49 Phonegap cho người mới học Đây vẫn chưa phải là giao diện UI đẹp, nhưng nó nhìn đẹp hơn ví dụ gốc.làm cách nào ta có thể cải tiến nó ? đơn giản để làm được điều này, ta có thể đơn giản hóa dữ liệu trả về từ hàm onSuccess function.để thay thế việc in lan man toàn bộ thông tin, ta có thể làm như sau : function onSuccess(position) { var element = document.getElementById(„geolocation‟); element.innerHTML =‟Position: „ + position.coords.latitude + „, „ + + position.coords.longitude + „
‟ + „
‟ + element.innerHTML; } Kết quả sẽ giống như hình 8-7.thông tin sẽ trở nên gọn gàng hơn Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 50 Phonegap cho người mới học Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 51 Phonegap cho người mới học V.Media 5.1.Các Media Files là gì ? Media API cho phép ta ghi lại và chơi các file âm thanh audio trên 1 thiết bị.đặc biệt là ta có thể chạy các files audio được load trực tiếp trên thiết bị hay chơi các files audio tải về thông qua internet Chú ý: 1 điều quan trọng cần phải nhớ rằng là thực thi PhoneGap hiện tại không theo chuẩn của W3C giành cho media, và bất cứ các thực thi trong tương lai có thể xung đột với các APIs hiện tại.xa hơn nữa thì các Media API chỉ tương thức với các thiết bị Android và iOS 5.2.Cách sử dụng các Media Files Có khả năng chơi music hat các audio files khác từ trong smartphone 1 cách khá thuận tiện.ví dụ, nếu ta đang trên 1 hành trình dài và không có 1 quyển sách nào trên tay, không thành vấn đề, ta có thể nghe 1 cuốn sách audio Xa hơn, khả năng ghi lại audio cũng trở nên thuận tiện.nếu ta đang chờ cho 1 cuộc hẹn nào đó và cần ghi lại 1 vài lời nhắc nhở sau đó thì ta có thể sử dụng thiết bị giống như 1 máy ghi chú.chất lương của audio được ghi lại khá ổn, file xuất ra là theo định dạng mp3, nên thật dễ dàng kết hợp chặt chẽ với các công cụ chỉnh sửa audio Theo đó có 3 cách để thêm việc chạy/ghi âm lại media vào ứng dụng :  Tạo ra 1 trình ghi âm đơn giản giúp ích cho việc nhớ nhở  Kết hợp chặt chẽ với các tính năng recording/playback với 1 ứng dụng ghi chú giống như Evernote  Tạo ra 1 trình chơi audio đơn giản để chạy các files trên web 5.3.Các ứng dụng mẫu sử dụng media API Các ứng dụng tiêu chuẩn trên iOS như “Voice Memos” và “iPod” (như hình 9-1) cho phép ta ghi âm lại các ghi chú bằng audio và chơi các audio files Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 52 Phonegap cho người mới học Tất nhiên, chỉ vì apple cung cấp những app này miễn phí thì không có nghĩa là những app khác giống như vậy không tồn tại.hình 9-2 chỉ ra rằng có vô số các app như vậy trên app store.và tất cả chúng cung cấp cùng những tính năng cơ bản như nhau - record, pause, play, và stop recording.1 vài có thêm khả năng chia sẻ các file ghi âm qua e-mail, các dịch vụ chia sẻ media Nếu ta tìm kiếm các ứng dụng music apps, thì ta cũng có kha khá 1 danh sách các apps như hình 9-3 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 53 Phonegap cho người mới học 1 lựa chọn phổ biến là “Pandora” như hình 9-4, ứng dụng này hướng tới dịch vụ music trên web.và dịch vụ “Pandora” đưa ra 1 cách thú vị tới cùng 1 bản nhạc.điều này có nghĩa là khi ta muốn nghe music của nhóm nhạc Creedence Clearwater Revival (CCR).thì ta tạo ra 1 trạm “station” dành cho ban nhạc này và sau đó “Pandora” sẽ tìm kiếm âm nhạc chứ không chỉ chọn lựa các bản ghi âm của CCR mà còn tìm kiếm các bài hát khác từ các ban nhạc khác cùng thể loại nhạc mà ta muốn tìm.sau đó ta có thể chia sẻ trạm “radio station” mới này cho những người khác Đa số (không phải tất cả ) các ứng dụng âm nhạc phổ biến đều có mặt trên android.chú ý rằng, như trong hình 9-5 thì giao diện của “Pandora” rất trực quan và đẹp Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 54 Phonegap cho người mới học 5.4.Đối tượng MEDIA OBJECT var media = new Media(src, mediaSuccess, [mediaError], [mediaStatus]); Đối tượng PhoneGap Media object gồm 4 tham số, 3 trong số đó là tùy chọn :  src – là 1 URL (là URL dẫn tới 1 file trên internet) chứa nội dụng audio  mediaSuccess – (tham số tùy chọn) đây là 1 hàm callback được gọi sau khi 1 đối tượng Media object được hoàn thành xong thao tác hiện tại như play, record, và stop (ví dụ như ta đang play 1 bản nhạc thì phải khi chơi xong hết bản nhạc ấy thì các lệnh trong hàm mediaSuccess mới được thực hiện )  mediaError – (tham số tùy chọn) đây là 1 hàm callback được gọi khi xảy ra lỗi  mediaStatus - (tham số tùy chọn) đây là 1 hàm callback được gọi để xác định những thay đổi trạng thái các tham số chỉ đọc :  position : là vị trí trong phạm vị phát audio.chú ý rằng nó không được cập nhập trong suốt quá trình chạy mà phải gọi phương thức getCurrentPosition() để cập nhập  duration : là tổng số thời gian của file media tính theo giây Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 55 Phonegap cho người mới học 5.5.Cách sừ dụng các phương thức methods trong phần này thì ta học cách sử dụng các phương thức chính trong media API.các phương thức này cho phép ta thao tác play, record, và pause,… Chú ý: nếu ta làm việc với phiên bản Phonegap 0.9.4 trở về trước thì ta phải chắc chắn rằng các hàm callback phải trong phạm vi toàn cục 5.5.1.phương thức media.getCurrentPosition để lấy về vị trí hiện tại trong phạm vi 1 audio file, ta sử dụng phương thức media.getCurrentPosition như sau : media.getCurrentPosition(mediaSuccess,[mediaError]); tham số thứ 1 là hàm mediaSuccess là 1 hàm callback được gọi với vị trí position hiện tại (được tính bằng giây) và tham số thứ 2 tùy chọn là mediaError là 1 hàm callback được gọi trong trường hợp xảy ra lỗi phương thức getCurrentPosition() là 1 hàm không đồng bộ (nghĩa là nó không tự gọi lại liên tục theo chu kì mà muốn như vậy ta phải thiết lập bằng tay) dùng để trả về vị trí hiện tại của audio file nằm dưới 1 đối tượng Media object, và nó cũng cập nhật tham số position trong phạm vi đối tượng Media object. Phương thức này hỗ trợ các nền tảng :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ mẫu : // Audio player // var my_media = new Media(src, onSuccess, onError); setInterval(function,mi llisec,lang)hàm này // Update media position every second có tác dụng gọi lặp đi lặp lại 1 hàm function nào đó theo 1 chu kỳ Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 56 thời gian millisec Phonegap cho người mới học var mediaTimer = setInterval(function() { // get media position my_media.getCurrentPosition( // success callback position) { function( position > -1) { if ( console.log(( position) + " sec"); } }, // error callback function(e) { console.log("Error getting pos=" + e); } ); }, 1000); 5.5.2.Phương thức media.getDuration media.getDuration(); Phương thức getDuration() là 1 hàm không đồng bộ (nghĩa là nó không tự gọi lại liên tục theo chu kì mà muốn như vậy ta phải thiết lập bằng tay) dùng để trả về khoảng thời gian của audio file được tính theo giây nếu đã biết.còn nếu khoảng thời gian là chưa xác định thì nó trả về giá trị là -1 Phương thức này hỗ trợ các nền tảng :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 57 Phonegap cho người mới học Ví dụ mẫu : // Audio player // var my_media = new Media(src, onSuccess, onError); // Get duration var counter = 0; var timerDur = setInterval(function() { counter = counter + 100; clearInterval(id_of_setinterval) xóa bỏ đi sự lặp lại của hàm function được lặp bởi setInterval với var id_of_setinterval = setInterval(function,milisec) if (counter > 2000) { clearInterval(timerDur); } var dur = my_media.getDuration(); if (dur > 0) { clearInterval(timerDur); document.getElementById('audio_duration').innerHTML = (dur) + " sec"; } }, 100); 5.5.3.Phương thức media.pause Phương thức này dùng để tạm dừng việc chạy 1 audio file media.pause(); hàm media.pause() là 1 hàm không đồng bộ dùng để tạm dừng 1 audio file phương thức này hỗ trợ các nền tảng :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 58 Phonegap cho người mới học Ví dụ mẫu về tạm dừng chạy audio file sau khi chạy được 10 giây : // Play audio // function playAudio(url) { // Play the audio file at url ( var my_media = new Media url, // success callback function() { console.log("playAudio():Audio Success"); }, // error callback function(err) { console.log("playAudio():Audio Error: "+err); ) } ; // Play audio my_media.play(); // Pause after 10 seconds setTimeout(function() { media.pause(); }, 10000); setTimeout(code,millisec,lang)  hàm hẹn giờ gọi hàm (không thực hiện lặp lại theo chu kì) } 5.5.4.Phương thức media.play Phương thức này dùng để khởi chạy hay tiếp tục chạy 1 audio file media.play(); hàm media.play() là 1 hàm không đồng bộ.để thực sự chạy được 1 file thì ta cần chuyển tiếp vào 1 URL hay 1 đường dẫn path tới nơi chứa file như sau : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 59 Phonegap cho người mới học // Play audio // function playAudio(url) { // Play the audio file at url var my_media = new Media(url, // success callback function() { console.log("playAudio():Audio Success"); }, // error callback function(err) { console.log("playAudio():Audio Error: "+err); }); // Play audio my_media.play(); } Chú ý : Trong BlackBerry WebWorks :  Các thiết bị blackberry hỗ trợ giới hạn các kênh audio cùng lúc.các thiết bị CDMA chỉ hỗ trợ 1 kênh audio.những thiết bị khác hỗ trợ 2 kênh audio cùng lúc.do vậy việc cố gắng chơi nhiều hơn 2 audio files cùng lúc thì kết quả là audio file bật trước đó sẽ bị ngừng lại Trong iOS :  numberOfLoops được chuyển tiếp vào trong lựa chọn options của phương thức play để định nghĩa số lần mà ta muốn media file được chơi : var myMedia = new Media("http://audio.ibeat.org/content/p1rj1s/p1rj1s_-_rockGuitar.mp3") myMedia.play({ numberOfLoops: 2 }) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 60 Phonegap cho người mới học 5.5.5.Phương thức media.release ta có thể giải phóng các nguồn audio nằm bên dưới hệ điều hành bằng cách sử dụng phương thức release().đây là 1 điều đặc biệt quan trọng bởi vì có 1 số hữu hạn các thực thể opencore được dành cho trình chạy media.các thư viện OpenCore hỗ trợ phát media như audio,video, các định dạng ảnh image.ta luôn luôn gọi hàm giải phóng này khi ta không còn cần tới 1 nguồn media.như ví dụ sau : media.release(); do vậy khi xử lý hoàn thành thì ta nên làm như sau : var my_file = new Media(src, onSuccess, onError); my_file.play(); my_file.stop(); my_file.release(); 5.5.6.Phương thức media.seekTo dùng để thiết lập vị trí hiện tại trong phạm vi 1 audio file media.seekTo(milliseconds); tham sô :  milliseconds: là vị trí được thiết lập làm vị trí phát trong phạm vi audio tính bằng mili giây hàm media.seekTo là 1 hàm không đồng bộ dùng để cập nhật vị trí hiện tại của audio file nằm dưới 1 đối tượng media object.cũng cập nhật tham số _position trong phạm vi đối tượng media object phương thức này hỗ trợ các nền tảng :  Android  BlackBerry WebWorks (OS 6.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ mẫu : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 61 Phonegap cho người mới học // Audio player // var my_media = new Media(src, onSuccess, onError); my_media.play(); // SeekTo to 10 seconds after 5 seconds setTimeout(function() { my_media.seekTo(10000); }, 5000); 5.5.7.Phương thức media.startRecord Dùng để ghi âm lại 1 audio file : media.startRecord(); hàm media.startRecord() là 1 hàm không đồng bộ ví dụ mẫu : // Record audio // function recordAudio() { var src = "myrecording.mp3"; var mediaRec = new Media(src, // success callback function() { console.log("recordAudio():Audio Success"); }, // error callback function(err) { console.log("recordAudio():Audio Error: "+ err.code); }); // Record audio mediaRec.startRecord(); } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 62 Phonegap cho người mới học Chú ý : Trong BlackBerry WebWorks :  Các thiết bị blackberry ghi lại audio trong nhiều định dạng có chất lượng khác nhau.các file này phải kết thúc với đuôi mở rộng là .amr Trong iOS :  File để ghi âm phải tồn tại rồi và phải có dạng là .wav và file API có thể được sử dụng để tạo ra file này 5.5.8.Phương thức media.stop Dùng để dừng phát 1 audio file media.stop(); hàm media.stop là 1 hàm không đồng bộ dùng để ngừng phát 1 audio file : phương thức này hỗ trợ các nền tảng sau :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ mẫu : / Play audio // function playAudio(url) { // Play the audio file at url var my_media = new Media(url, // success callback function() { console.log("playAudio():Audio Success"); }, // error callback Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 63 Phonegap cho người mới học function(err) { console.log("playAudio():Audio Error: "+err); }); // Play audio my_media.play(); // Stop after 10 seconds setTimeout(function() { my_media.stop(); }, 10000); } 5.5.9.Phương thức media.stopRecord Dùng để dừng việc ghi âm lại 1 audio file media.stopRecord(); hàm media.stopRecord là 1 hàm không đồng bộ dùng để ngừng việc ghi âm 1 audio file phương thức sau hỗ trợ các nền tảng sau :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ mẫu : // Record audio // function recordAudio() { var src = "myrecording.mp3"; var mediaRec = new Media(src, // success callback function() { console.log("recordAudio():Audio Success"); }, Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 64 Phonegap cho người mới học // error callback function(err) { console.log("recordAudio():Audio Error: "+ err.code); }); // Record audio mediaRec.startRecord(); // Stop recording after 10 seconds setTimeout(function() { mediaRec.stopRecord(); }, 10000); } 5.5.10.Kiểm soát lỗi MediaError 1 đối tượng MediaError được tả về trong hàm mediaError callback khi xảy ra lỗi Các thuộc tính của đối tượng :  Code : 1 trong những mã code thông báo lỗi error codes được định nghĩa từ trước sẽ được liệt kê ra  Message : thông tin về lỗi Error message mô tả chi tiết về lỗi Các mã error codes bao gồm :  MediaError.MEDIA_ERR_ABORTED  MediaError.MEDIA_ERR_NETWORK  MediaError.MEDIA_ERR_DECODE  MediaError.MEDIA_ERR_NONE_SUPPORTED Cách tiếp cận thân thiện cho vấn đề kiểm soát lỗi này là thiết lập 1 mảng array chứa các trạng thái lỗi sử dụng các constants giống như là các chỉ mục key, và tương ứng với nó là các thông báo lỗi tự định nghĩa.theo cách này ta có thể hiện thị những thông báo lỗi dễ hiểu tới người dùng như sau : funciton onError(error){ var errors = {}; Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 65 Phonegap cho người mới học errors[MediaError.MEDIA_ERR_ABORTED]= „Stopped playing!‟; errors[MediaError.MEDIA_ERR_NETWORK]= „Network error!‟; errors[MediaError.MEDIA_ERR_DECODE] = „Could not decode file!‟; errors[MediaError.MEDIA_ERR_NONE_SUPPORTED] = „Format not supported!‟; alert(„Media error: „ + errors[error]); alert(„code: „ + error.code + „\n‟ + „message: „ + error.message + „\n‟); } 5.5.11.Ví dụ về việc sử dụng media api 5.5.11.1.Ví dụ xây dựng 1 trình chơi audio đơn giản Media Example Play Audio Pause Playing Audio Stop Playing Audio

5.5.11.2.Cách xây dựng 1 ứng dụng ghi âm audio đơn giản Device Properties Example Start Recording

Stop Recording

5.5.11.3.Cải thiện giao diện và trải nghiệm Vi dụ trên đơn giản chỉ là các đường links sơ sài và trông không trực quan và khó sử dụng như hình 9-7 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 69 Phonegap cho người mới học Để cải thiện giao diện người dùng, đầu tiên ta phải đảm bảo rằng project của ta cần thiết phải có các thư mục jQTouch folders ở trong nó, như đã nói đến ở trong các chương trước.đặt đoạn code này vào trước đoạn load phonegap.js: Và sau đó thêm đoạn HTML sau vào thẻ : div id=”home” class=”current”>

Audio Player

  • Play
  • Pause
  • Stop

Chú ý rằng đoạn code này có gán các lớp classes vào các phần tử
  • .nút Play có class tên là whitebutton và 2 nút khác có tên class là graybutton.các lớp class này là những phần được thiết lập trong jQTouch bằng css.kết quả sẽ giống như hình 9-8 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 71 Phonegap cho người mới học Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 72 Phonegap cho người mới học VI.Lưu trữ Storage Ta đang là nhà phát triển HTML5, thì hầu như ta chạy ứng dụng trong các thiết lập cấu hình nằm ở phía client. Ví dụ : nếu ta sử dụng trình duyệt Chrome or Safari và vào trang html5demos.com/database, thì ta sẽ nhìn thấy trang page này được làm đầy bởi các dòng tweets.nhìn thoáng qua thì ta cảm tưởng trang page này xuất hiện bởi được hỗ trợ bởi 1 database như thông lệ giống kiểu MySQL.tuy nhiên khi ta ấn chuột phải vào trang page  ấn vào Inspect Element.ta sẽ thấy như trong hình 11-1 Khi ta ấn vào Resources tab và sau đó lăn chuột xuống vị trí databases, ta sẽ nhìn thấy 1 html5demos database có sẵn và bên trong nó có 1 bảng tên là tweets. Nếu ta ấn vào bên phải pane và đây là kết quả của lệnh SQL : select * from tweets, ta lấy được 1 danh sách giống với như cái trong hình 11-1 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 73 Phonegap cho người mới học Như ta có thể thấy, các trường fields cũng tương tự với những gì ta đã sử dụng trong MySQL hay 1 SQL database khác.tất nhiên, ta có thể chỉ cần ấn vào biểu tượng icon của bảng tweets đề xem mọi thứ được lưu trong bảng này Web Database ( về bản chất là 1 hệ thống của Sqlite3 ) rất phù hợp với các lưu trữ dữ liệu phức tạp ( theo cách khác, khi ta muốn giữ vết của rất nhiều các cột thông tin trên từng phần tử ), nhưng thỉnh thoảng các yêu cầu dữ liệu không quá phức tạp Hiện tại, ta chỉ có thể muốn lưu trữ 1 vài thông tin rất đơn giản ( như trong 1 dạng 1 cặp key/value ), và chỉ giữ nó xung quanh 1 khoảng thời gian ngắn ( theo cách hiểu khác, cho tới khi người dùng đóng trình duyệt hay ứng dụng ).nếu yêu cầu đề ra là cần thiết hơn về tấc độ, thì phương thức lưu giữ session và local là những gì ta cần Có 1 ví dụ nằm ở html5demos.com/storage như hình 11-2 chỉ ra kết quả khi đánh thêm vào 1 giá trị hello cho biến sessionStorage, và 1 giá trị của goodbye cho biến localStorage Nếu ta vẫn mở Resources tab, thì di chuyển xuống phần Session Storage để nhìn thấy giá trị value của hello được lưu trữ ở đó như hình 11-3.và trong hình 11-4, ta có thể thấy giá trị của goodbye được lưu trữ ở Local Storage Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 74 Phonegap cho người mới học 6.1.Điểm khác biệt giữa Session Storage và Local Storage ? Các đối tượng Session Storage sẽ được xóa khi ta đóng trình cửa sổ trình duyệt nhưng các đối tượng Local Storage thì vẫn được tồn tại 1 điều cần phải nhớ rằng các đối tượng Storage thường tốt nhất nên từ 5MB đến 10MB dữ liệu, phụ thuộc vào trình duyệt được sử dụng.bởi vì ta sẽ xây dựng các ứng dụng apps trên 1 phone, ta nên giữ các đối tượng Storage nhỏ hơn 4MB cho an toàn.nếu ta đang xây dựng web databases, thì giữ giới hạn là 5MB, nhưng ta có thể giữ nó nhỏ hơn nếu ta muốn Câu hỏi đặt ra tiếp là nếu HTML5 hỗ trợ cả các lựa chọn database và local storage, thì tại sao ta lại phải để ý tới hệ thống lưu trữ của phonegap ? Câu trả lời là 1 vài thiết bị sẽ hỗ trợ các tính năng này và trong trường hợp đó thì PhoneGap API sẽ trì hoãn trên hệ thống xử lý của thiết bị đó.các thiết bị khác không hỗ trợ điều này thì trong trường hợp đó, hệ thống của phonegap sẽ nhảy vào Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 75 Phonegap cho người mới học 6.2.Cách sử dụng local storage Dữ liệu được lưu trữ bằng cách sử dụng local storage được lưu dưới dạng các cặp key/value. Để ghi 1 value vào trong bảng local storage thì ta sử dụng mã code như sau: window.localStorage.setItem("key_name", value); // ví dụ: window.localStorage.setItem(„Lớp‟,‟toán tin 2-k52‟); để lấy về 1 giá trị từ bảng local storage, ta sử dụng mã code như sau: window.localStorage.getItem("key_name"); // ví dụ: window.localStorage.getItem(„Lớp‟); để lấy về tên của khóa key của 1 giá trị local storage tại 1 vị trí nào đó trong bảng window.localStorage.key(0) // lấy về tên của khóa key của dòng giá trị local storage ở vị tri 0 (hay vị trí đầu tiên) window.localStorage.key(0) // kết quả là „Lớp‟ window.localStorage.key(1) // kết quả là „ho và tên‟ window.localStorage.key(2) // kết quả là „sinh ngày‟ Để xóa 1 dòng giá trị trong bảng local storage, ta xóa dựa vào từ khóa key của dòng giá trị window.localStorage.removeItem("key"); // ví dụ: window.localStorage.removeItem("Lớp"); Để xóa toàn bộ dữ liệu trong bảng giá trị local storage, ta làm như sau: Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 76 Phonegap cho người mới học window.localStorage.clear(); 6.3.Cách sử dụng đối tượng DATABASE OBJECT 6.3.1.Cách tạo và Cách mở 1 database Phương thức này có nhiệm vụ mở một database có sẵn hoặc tạo mới nếu nó chưa tồn tại. Phương thức này được mô tả như sau: Database openDatabase( in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback ); Tham số: - name: tên của database. - version: phiên bản. (Hai database trùng tên nhưng khác phiên bản thì khác nhau) - displayname: mô tả. - estimatedSize: dung lượng được tính theo đơn vị byte. - creationCallback: phương thức callback được thực thi sau khi database mở/tạo. Ví dụ tạo một database với tên “mydb” và dung lượng là 5 MB: var db = openDatabase("mydb", "1.0", "My First DB", 5 * 1024 * 1024); Trong thế giới của SQlite, ta tạo ra 1 database bằng cách mở nó.để mở ra 1 database, ta sử dụng phương thức window.openDatabase() như sau : var myDB = window.openDatabase(name, version, displayname,size); lệnh sau có 4 tham số : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 77 Phonegap cho người mới học  Name – đây là tên của database mà ta muốn tạo ra  Version – đây là phiên bản của database  Displayname – đây là tên hiện thị của database  Size - đây là kích thước của database ( được tính theo bytes) Ví dụ, ta có thể chạy dòng lệnh sau : var myDB = window.openDatabase(“photos”, “1.0”, “Photos DB”, 1000000); dòng lệnh này tạo ra 1 MB database được gọi là photos và gán nó vào 1 biến myDB.đặc biệt là ta sẽ nhìn thấy dạng này được đính kèm vào 1 hàm function hay là trên onDeviceReady() listener như sau : document.addEventListener(“deviceready”, onDeviceReady, false); function onDeviceReady() { var myDB = window.openDatabase(“photos”, “1.0”, “Photos DB”, 1000000); } 6.3.2.Cách chạy 1 sql Query Chú ý: không thể thực hiện được truy vấn SQL Query, khi truy vấn này đặt ngoài 1 giao dịch Transactions. Khi ta chạy 1 chuỗi truy vấn SQL query, thì những gì mà ta thực sự làm là sử dụng đối tượng SQLTransaction object.đối tượng này bao hàm các phương thức cho phép ta thực thi các câu lệnh SQL dựa vào 1 database đã được mở từ trước Đây là dạng cơ bản của phương thức executeSql() : myDB.executeSql(„SELECT * FROM table1‟); định nghĩa tổng quát của đối tượng SQLTransaction – đối tượng này không được sử dụng 1 cách độc lập mà nó phải được nhúng trong các phương thức như transaction(), readTransaction(), và changeVersion() Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 78 Phonegap cho người mới học typedef sequence ObjectArray; interface SQLTransaction { void executeSql(in DOMString sqlStatement, in optional ObjectArray arguments, in optional SQLStatementCallback callback, in optional SQLStatementErrorCallback errorCallback); }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLStatementCallback { void handleEvent(in SQLTransaction transaction, in SQLResultSet resultSet); }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLStatementErrorCallback { boolean handleEvent(in SQLTransaction transaction, in SQLError error); }; Khi phương thức executeSql(sqlStatement, arguments, callback, errorCallback) được gọi thì tiến trình xử lý sẽ chạy theo thuật toán sau ( thuật toán này tương đối đơn giản và nó không thực sự xử lý bất kì SQL nào ) 1. Nếu phương thức không được gọi trong suốt quá trình thực thị của 1 SQLTransactionCallback,SQLStatementCallback, or SQLStatementErrorCallback thì nó sẽ văng ra 1 INVALID_STATE_ERR exception ( do phương thức này được gọi bên trong 1 SQLTransactionErrorCallback do vậy nó văng ra 1 exception.điều khiển SQLTransactionErrorCallback này chỉ được gọi khi 1 giao dịch transaction thất bại và do đó không có bất cứ lệnh SQL nào có thể được thêm vào(thực thi) 2. Cấu trúc tiến xử lý SQL (đây chính là chuỗi lệnh query) như đã biết sẽ là tham số đầu tiên và là tham số bắt buộc trong phương thức sqlStatement, bằng cách sử dụng tham số thứ 2 là mảng array, thể thu về cấu trúc lệnh query.nếu tham số thứ 2 bị bỏ qua hay là rỗng, thì xử lý liên quan đến mảng array tham số là rỗng 3. Xếp hàng lệnh trong giao dịch transaction, theo đó tham số thư 3 nếu có sẽ là hàm callback của tập các kết quả của câu lệnh và tham số thứ 4 nếu có sẽ là hàm callback thông báo lỗi Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 79 Phonegap cho người mới học Chú ý: trong ví dụ trên, thì myDB được sử dụng chỉ vì nó đã được sử dụng từ ví dụ trước.ta cũng sẽ sử dụng bất cứ biến nào cũng được và chắc rằng ta đã mở nó lên.chú ý rằng ta có thể sử dụng bất cứ câu lệnh SQL hợp lệ nào mà ta muốn.ví dụ này chỉ thể hiện 1 câu lệnh select nhưng ta có thể chạy những câu lệnh khác theo sau đây là câu lệnh drop dùng để xóa 1 bảng : myDB.executeSql(„DROP TABLE IF EXISTS table1)‟); đây là câu lệnh tạo ra 1 bảng – câu lệnh create : myDB.executeSql(„CREATE TABLE IF NOT EXISTS table1 (id unique, firstname varchar, lastname varchar)‟); theo sau là lệnh insert : myDB.executeSql(„INSERT INTO TABLE (id, firstname, lastname) VALUES (1, “Thomas “, “Myer “)‟); Đây là câu lệnh delete : myDB.executeSql(„DELETE FROM TABLE where id=1‟); Chú ý: như ta đã thấy ở trên, phương thức executeSql với những câu lệnh truy vấn này ta chỉ sử dụng 1 tham số duy nhất (mà theo định nghĩa nó có gồm tới 4 tham số ) do đặc thù các câu lệnh DROP, CREATE, INSERT, DELETE ta không quan tâm tới kết quả trả về không có gì là ngạc nhiên ở đây.nếu ta biết SQL, thì ta không có vấn đề gì trong việc để tạo table, hay thêm mới dữ liệu, và nhận về dữ liệu.tất nhiên, ta sẽ phải xem cách mà ta phải đơn xen các dấu ngoặc lồng nhau – nếu ta đang sử dụng dấu ngoặc đơn ở ngoài, thì ta buộc phải sử dụng dấu ngoặc lép trên các giá trị ở bên trong câu lệnh Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 80 Phonegap cho người mới học 6.3.3.Cách phân tích và tiền xử lý các câu lệnh SQL (phòng chống SQL injection) để phòng trống SQL injection ta nên sử dụng thêm tham số mảng array thứ 2 trong phương thức executeSql() vì khi đó các giá trị được thêm vào trong câu truy vấn không được thêm vào 1 cách trực tiếp ( ngăn chặn việc thoát kiểu kí tự ) mà nó phải được chuyển tiếp thông qua 1 mảng array rồi mới được truyền vào.cách bước nó thực thi như sau : 1. Tiến hành phân tích cấu trúc SQL như 1 cấu trúc SQL thông thường với ngoại lệ là dấu hỏi chấm ? có thể sử dụng đặt trong cấu trúc SQL này, nó là 1 kí tự đại diện 2. Kết hợp mỗi điểm đặt dấu ? với giá trị của các tham số trong tham số thứ 2 tương ứng cùng 1 vị trí ( đo đó điểm đặt dấu hỏi ? đầu tiên tương ứng với giá trị đầu tiên trong tham số thứ 2, và tổng quát lên thì điểm đặt dấu hỏi ? thứ n tương ứng với giá trị thứ n trong tham số thứ 2 ) – ( chú ý rằng việc kết hợp các điểm đặt dấu hỏi ? được thực hiện ở mức chuỗi kí tự, chứ không phải là sự trùng khớp chuỗi, do vậy nớ cung cấp 1 cách linh hoạt để thêm vào các tham số bên trong 1 câu lệnh mà không bị nguy cơ tấn công bởi SQL injection 3. Nếu đối tượng database object mà đối tượng SQLTransaction or SQLTransactionSync object được tạo ra từ nó 4. Mặc khác nếu ngữ pháp của câu lệnh SQL là không đúng ( ngoại trừ cho cách sử dụng kí tự ? ), hay câu lệnh sử dụng các tính năng không được hỗ trợ hay 1 số phần tử trong tham số mảng array không bằng với số điểm đặt ? trong câu lệnh hay câu lênh không thể phân tích được vì 1 vài lí do nào đó, thì câu lệnh bị đóng mác là lỗi (Error code 5.).Tác nhân cũng phải xét tới câu lệnh xem nó có sử dụng các tính năng BEGIN, COMMIT, và ROLLBACK đang không được hỗ trợ hay không ( nếu có nó sẽ đóng mác câu lệnh lỗi ) do vậy nó không cho phép các câu lệnh này làm nhiễu loạn các giao dịch rõ ràng được quản lý bởi database API của chính nó 5. Mặt khác, nếu chế độ được sử dụng tạo ra đối tượng SQLTransaction or SQLTransactionSync object là chỉ đọc nhưng hành động của câu lệnh lại chỉnh sửa database, thì nó đánh mác câu lệnh lỗi (Error code 5.).chú ý nhưng hành động của câu lệnh lại chỉnh sửa database được xét tới ở đây là UPDATE, SELECT, DROP do vậy 1 câu lệnh như "UPDATE test SET id=0 WHERE 0=1" vẫn sẽ được xử lý 6. Trả về cấu trúc câu lệnh Ví dụ như : tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES ( ?,?)", [1,"peter"]); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 81 Phonegap cho người mới học tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES ( ?,?)", [2,"paul"]); 6.3.4.Các giao dịch Transactions tại sao ta sử dụng các giao dịch transactions để thay thế cho việc chỉ chạy câu lệnh SQL ? bởi vì transactions mang tới cho ta khả năng rollback.điều này có nghĩa là nếu 1 giao dịch transaction – cái mà chứa 1 hay nhiều câu lệnh SQL mà gặp thất bại thì sự cập nhật vào database không bao giờ được thực hiện giống như là giao dịch transaction đó chưa bao giờ xảy ra cũng có các hàm error và success callbacks trên giao dịch transaction, do vậy ta có thể quản lý các lỗi này nhưng quan trọng nhất phải biết rằng các giao dịch transactions có khả năng khôi phục rollback lại thay đổi Bạn cần thực thi các câu SQL trong ngữ cảnh của một transaction. Một transaction cung cấp khả năng rollback khi một trong những câu lệnh bên trong nó thực thi thất bại. Nghĩa là nếu bất kì một lệnh SQL nào thất bại, mọi thao tác thực hiện trước đó trong transaction sẽ bị hủy bỏ và database không bị ảnh hưởng gì cả. Interface Database hỗ trợ hai phương thức giúp thực hiện điều này là transaction() và readTransaction(). Điểm khác biệt giữa chúng là transaction() hỗ trợ read/write, còn readTransaction() là read-only. Như vậy sử dụng readTransaction() sẽ cho hiệu suất cao hơn nếu như bạn chỉ cần đọc dữ liệu. Chú ý: ta sử dụng transaction() cho các câu lệnh SQL liên quan đến việc đọc ghi trong database như INSERT, REPLACE, CREATE, DROP, DELETE và để tăng hiệu suất ta sử dụng readTransaction() cho các câu lệnh truy vấn SQL chỉ liên quan tới đọc dữ liêu trong database như SELECT void transaction( in SQLTransactionCallback callback, in optional SQLTransactionErrorCallback errorCallback, in optional SQLVoidCallback successCallback ); giao dịch transaction đơn giản là 1 hàm function có chứa 1 vài code như sau : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 82 Phonegap cho người mới học var db = openDatabase('mydb', '1.0', 'my first database', 2 *1024 * 1024); db.transaction(function ( tx) {   // here be the transaction // do SQL magic here using the tx object }); chú ý ở đây TX là 1 đối tượng transaction object nếu ta cần chạy toàn bộ nhóm câu lệnh truy vấn vào 1 thời điểm,, thì ta có thể tạo ra 1 gia dịch transaction, sau đó gọi ra chuỗi truy vấn như sau : populateDB, errorDB, successDB); myDB.transaction( function populateDB(tx) { tx.executeSql(„DROP TABLE IF EXISTS table1‟); tx.executeSql(„CREATE TABLE IF NOT EXISTS table1 (id unique, data varchar)‟); tx.executeSql(„INSERT INTO table1 (id, data) VALUES (1, “testing 1”)‟); tx.executeSql(„INSERT INTO table1 (id, data) VALUES (2, “testing 2”)‟); } function errorDB(err) { alert(“Error processing SQL: “+err); } function successDB() { alert(“success!”); } Chú ý rằng gọi 1 hàm JavaScript function để thực thi các câu lệnh truy vấn riêng biệt và bao hàm lời gọi các hàm success và error callback functions Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 83 Phonegap cho người mới học 6.4.Cách xem 1 tập kết quả 1 trong những thứ ta thường làm nhiều hơn thông thường, là ta sẽ làm với database là lưu trữ và cách nhận giá trị từ nó. Phương thức giao dịch transaction cung cấp cho ta 1 hàm success callback.phương thức executeSql() cũng cung cấp cho ta các hàm success và error callbacks.trong hàm success callback ta sẽ nhìn thấy tập kết quả. Nếu ta đã sử dụng và làm việc với mySQL (hay 1 vài SQL database khác), thì ta có thể nghĩ mọi việc cần làm đều giống như vậy. Những gì mà ta lấy lại từ hàm success callback là 1 đối tượng SQLResultSet object – là đối tượng chứa 3 thuộc tính sau :  insertId – đây là row ID mà câu lệnh SQL của đối tượng SQLResultSet được thêm vào trong cơ sở dữ liệu (điều này chỉ được áp dụng nếu ta đã chạy 1 câu lệnh insert)  rowAffected – đây là số dòng được thay đổi bởi câu lệnh SQL ( điều này trả về 0 nếu không có dòng nào chịu tác động cũng giống như 1 câu lệnh select )  rows – đây là 1 danh sách các kết quả được lưu dưới dạng đối tượng SQLResultSetRowList được biểu diễn dưới các dòng và được trả về định nghĩa chung cho đối tượng SQLResultSet object được trả về bởi lệnh truy vấn select : interface SQLResultSet { readonly attribute long insertId; readonly attribute long rowsAffected; readonly attribute SQLResultSetRowList rows; }; Và định nghĩa chung cho thuộc tính rows – thuộc tính này là 1 kiểu đối tượng SQLResultSetRowList : interface SQLResultSetRowList { readonly attribute unsigned long length; getter any item(in unsigned long index); }; Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 84 Phonegap cho người mới học Như đã thấy ở trên item ở đây là 1 phương thức get chứ không phải 1 thuộc tính do vậy ta mới có cách viết results.rows.item() trong ví dụ sau, ta chạy 1 truy vấn SQL select đơn giản và báo cáo lại những gì sẽ được trả về : function queryDB(tx) { tx.executeSql(„SELECT * FROM test‟, [], querySuccess, errorDB); } Theo định nghĩa về SQLTransaction ở trên SELECT * FROM test‟ là tham số bắt buộc function querySuccess(tx, results) { đầu tiên kiểu DOMString, do câu lệnh select // this will be empty -- no rows were inserted. ta cần phải nhận về kết quả nên ta phải sử alert(“Insert ID = “ + results.insertId); dụng tham số thứ 3, do vậy tham số thứ 2 là // this will be 0 -- select statement tham số mảng array ta để là rỗng nên viết là alert(“Rows Affected = “ + results.rowAffected); [], và tham số thứ 3 là querySuccess có // the number of rows returned by the select statement alert(“# of rows = “ + results.rows.length); chứa thông tin về kết quả trả về nên buộc ta } phải truyền vào phương thức executeSql.không giống như ở trên phương function errorDB(err) { thức executeSql chỉ thực thi các lệnh CREATE hay INSERT nên ta không quan alert(“Error processing SQL: “+err.code); tâm lắm tới thông tin kết quả trả về, do vậy ta } hay sử dụng nó với 1 tham số duy nhất db.transaction( queryDB, errorDB); ta có thể truy cập các giá trị được lưu trữ trong các dòng trả về này bằng cách sử dụng phương thức item().mỗi lúc ta sử dụng nó, ta sẽ lấy về 1 dòng row của dữ liệu được định nghĩa bởi chỉ mục index mà ta chuyển tiếp vào nó.ta có thể làm vài thứ với 1 đối tượng Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 85 Phonegap cho người mới học JavaScript object với các thuộc tính này tương ứng với các tên cột database từ câu lệnh select do vậy để viết lại hàm querySuccess() từ ví dụ trên, ta sẽ sử dụng như sau : function querySuccess(tx, results) { //first get the number of rows in the result set var len = results.rows.length; { for (var i=0;i Database Example

    Names

    Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 90 Phonegap cho người mới học VII.Files 7.1.Hệ thống FILESYSTEMS Bất chấp nhà sản xuất hay hệ điều hành, mọi smartphone hay thiết bị cần phải có 1 hệ thống filesystem và Phonegap API cung cấp cho ta 1 vài cách để truy cập tới hệ thống filesystem này Vào thời điểm hiện tại, khả năng truy cập này còn khá nhiều hạn chế.ví dụ, rất khó (hay có lẽ là không thể ) để nhảy ra ngoài hộp cát sandbox mà ứng dụng bị chứa ở bên trong.tuy nhiên, ta giả định rằng ta không ở đây để học về cách bẻ khóa điện thoại ( ví dụ như bẻ khóa để cho điện thoại có khả năng hỗ trợ bộ nhớ lên tới 16 GB ) Những gì chương này tập trung là cách để truy cập vào hệ thống filesystem vì vậy mà ta có thể đọc 1 file và ghi 1 vài dữ liệu vào file đó Đối tượng PhoneGap‟s FileSystem object miêu tả thông tin về hệ thống filesystem, và nó có 2 thuộc tính sau :  Name – đây là tên của hệ thống filesystem (DOMString)  Root – đây là thư mục gốc của hệ thống filesystem (DirectoryEntry) Tên của hệ thống filesystem phải là độc nhất trong danh sách các hệ thống file được lộ ra.thuộc tính root chứa 1 đối tượng DirectoryEntry object – diễn tả thư mục gốc của hệ thống filesystem Các nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Đối tượng này được trả về trong hàm success callback của phương thức requestFileSystem().theo ví dụ sau : window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onSuccess, onFail); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 91 Phonegap cho người mới học function onSuccess(fileSystem){ alert(fileSystem. name); alert(fileSystem. root.name); } function onFail(event){ target.error.code); alert(event. } Thuộc tính root chứa 1 đối tượng DirectoryEntry 7.2.Tìm hiểu về các thư mục dẫn DIRECTORIES và các files Có 2 loại phần tử được tìm thấy trong filesystems : đó là thư mục dẫn directories và các files.các thư mục dẫn Directories đươc diễn tả bởi các đối tượng DirectoryEntry objects và các files được biểu diễn bởi đối tượng FileEntry objects ở phần này ta học về các phần sau :  Cách sử dụng đối tượng DirectoryEntry object  Cách sử dụng FileEntry object  Cách sử dụng các đánh dấu flags  Cách sử dụng LocalFileSystem 7.2.1.Cách sử dụng đối tượng DirectoryEntry Object Đối tượng này miêu tả 1 thư mục dẫn directory trên 1 hệ thống filesystem.và nó có các thuộc tính sau :  isFile – luôn luôn là false (boolean)  isDirectory – luôn luôn là true (boolean)  name – đây là tên của DirectoryEntry không bao gồm đường dẫn dẫn tới nó (DOMString) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 92 Phonegap cho người mới học  fullPath – đây là đường dẫn tuyệt đối từ gốc root của đối tượng DirectoryEntry object (DOMString) Chú ý: thuộc tính sau đã được định nghĩa trong W3C, nhưng nó không được hỗ trợ bởi Cordova  filesystem – là hệ thống filesystem mà nó chứa đối tượng DirectoryEntry ở trong nó (FileSystem) hơn thế, đối tượng DirectoryEntry còn hỗ trợ các phương thức sau :  getMetadata : tìm kiếm thông tin metadata về 1 thư mục dẫn directory  setMetadata : thiết lập thông tin metadata trên 1 thư mục dẫn directory  moveTo : chuyển 1 thư mục dẫn directory tới 1 vị trí khác trên hệ thống filesystem  copyTo : sao chép 1 thư mục dẫn tới 1 vị trí khác trên hệ thống filesystem  toURI : trả về 1 URL mà có thể dùng để xác định vị trí 1 thư mục dẫn  remove : xóa 1 thư mục dẫn.và thư mục dẫn này phải trống rỗng  getParent : tìm kiếm thư mục dẫn cha  createReader : tạo ra 1 đối tượng DirectoryReader mới mà có thể đọc các thực thể từ 1 thư mục dẫn  getDirectory : tạo ra hay tìm kiếm 1 thư mục dẫn  getFile : tạo ra hay tìm kiếm 1 file  removeRecursively : xóa 1 thư mục dẫn và tất cả phần tử chứa trong nó nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) 7.2.2.getMetadata phương thức sử dụng để tìm kiếm thông tin metadata về 1 thư mục dẫn directory.nó có 2 tham số là 2 hàm callback :  successCallback - đây là 1 hàm callback được gọi với 1 Metadata object (Function) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 93 Phonegap cho người mới học  errorCallback – đây là 1 hàm callback được gọi nếu có 1 lỗi xảy ra trong quá trình lấy về đối tượng Metadata object. Đây là 1 ví dụ : function onSuccess(metadata) { alert(“Last Modified: “ + metadata.modificationTime); } function onFail(error) { alert(error.code); } // Request the metadata object for this entry entry.getMetadata(onSuccess, onFail); 7.2.3.setMetadata phương thức thiết lập thông tin metadata trên 1 thư mục dẫn directory, hiện tại chỉ hoạt động trên iOS các tham số truyền vào :  successCallback – 1 hàm callback được gọi khi thông tin metadata được thiết lập thành công (Function)  errorCallback – 1 hàm callback được gọi khi thông tin metadata không được thiết lập thành công (Function)  metadataObject – 1 đối tượng mà chứa các keys và values của metadata (Object) ví dụ như : function success() { console.log("The metadata was successfully set."); } function fail() { alert("There was an error in setting the metadata"); } // Set the metadata entry.setMetadata(success, fail, { "com.apple.MobileBackup": 1}); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 94 {„key‟ : value} Phonegap cho người mới học Chú ý : trong iOS thì chỉ thuộc tính mở rộng "com.apple.MobileBackup" được hỗ trợ.thiết lập giá trị là 1 để không bật tính năng file được backup lên iCloud.thiết lập là 0 để bật tính năng file được backup lên iCloud 7.2.4.moveTo phương thức này được sử dụng để chuyển 1 thư mục dẫn directory tới 1 vị trí khác trên hệ thống filesystem.sẽ xảy ra lỗi khi ta cố thực hiện các thao tác sau :  di chuyển 1 thư mục dẫn bên trong thư mục cha của nó với 1 tên là khác với tên hiện tại của nó thì không được cho phép  di chuyển 1 thư mục dẫn bên trong chính nó hay bên trong bất cứ cấp con nào của nó  di chuyển 1 thư mục dẫn tới 1 path mà đã được sử dụng bởi 1 file  di chuyển thư mục dẫn tới 1 path mà đã được sử dụng bởi 1 thư mục dẫn rỗng các tham số dành cho phương thức này :  parent – đây là thư mục cha để di chuyển thư mục dẫn này (DirectoryEntry)  newName – đây là 1 tên mới của thư mục dẫn.nếu tên này không được định nghĩa thì nó mặc định là tên hiện tại (DOMString)  successCallback - là 1 hàm callback mà được gọi với đối tượng DirectoryEntry object của thư mục dẫn mới (Function)  errorCallback - là 1 hàm callback mà được gọi nếu có 1 lỗi xảy ra khi cố gắng di chuyển thư mục dẫn, hàm này được gọi với 1 đối tượng FileError object (Function). Ví dụ : function success(entry) { alert(“New Path: “ + entry.fullPath); } function fail(error) { alert(error.code); } function moveDirectory(entry) { Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 95 Phonegap cho người mới học var parent = document.getElementById(„parent‟).value, newName = document.getElementById(„newName‟).value, parentEntry = new DirectoryEntry({fullPath: parent}); // move the directory to a new directory and rename it parentEntry, newName, success, fail); entry.moveTo( } 7.2.5.copyTo phương thức này được sử dụng để sao chép 1 thư mục dẫn tới 1 vị trí khác trên hệ thống filesystem.bất kì thao tác nào sau đây cũng gây ra lỗi :  nếu ta cố gắng sao chép 1 thư mục dẫn vào bên trong chính nó ở bất cứ cấp nào  nếu ta cố gắng sao chép 1 thư mục dẫn vào bên trong thư mục cha của nó với 1 tên mà khác với tên hiện tại thì không được cho phép Chú ý: sao chép thư mục luôn luôn là đệ qui và só sẽ thực hiện sao chép toàn bộ nội dung có trong thư mục các tham số cho phương thức này :  parent – đây là thư mục cha mà thực hiện sao chép thư mục dẫn (DirectoryEntry)  newName – là tên mới của thư mục dẫn.nếu nó không được định nghĩa thì mặc định nó là tên hiện tại (DOMString)  successCallback - là 1 hàm callback mà được gọi với đối tượng DirectoryEntry object của thư mục dẫn mới (Function)  errorCallback - là 1 hàm callback mà được gọi nếu có 1 lỗi xảy ra khi cố gắng di chuyển thư mục dẫn, hàm này được gọi với 1 đối tượng FileError object (Function). Ví dụ : function success(entry) { alert(“New Path: “ + entry.fullPath); } function fail(error) { Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 96 Phonegap cho người mới học alert(error.code); } function copyDirectory(entry) { var parent = document.getElementById(„parent‟).value, newName = document.getElementById(„newName‟).value, parentEntry = new DirectoryEntry({fullPath: parent}); // copy the directory to a new directory and rename it parentEntry, newName, success, fail); entry.copyTo( } 7.2.6.toURI phương thức này dùng để trả về 1 URL mà có thể dùng để xác định vị trí 1 thư mục dẫn ví dụ : // Get the URI for this directory var uri = entry.toURI(); alert(uri); 7.2.7.remove phương thức này dùng để xóa 1 thư mục dẫn.và thư mục dẫn này phải trống rỗng 1 trong các thao tác sau sẽ gây lỗi :  nếu ta cố thử xóa 1 thư mục dẫn mà nó không rỗng  Nếu ta cố thử xóa thư mục gốc root của 1 hệ thống filesystem Các tham số dành cho phương thức này :  successCallback – đây là 1 hàm callback mà được gọi sau khi thư mục dẫn được xóa thành công.nó được gọi với không chứa tham số nào (Function)  errorCallback - đây là 1 hàm callback mà được gọi nếu 1 lỗi xảy ra khi ta cố xóa 1 thư mục dẫn.đươc gói với 1 đối tượng FileError object. (Function) ví dụ : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 97 Phonegap cho người mới học function success(entry) { alert(“Removal succeeded”); } function fail(error) { alert(„Error removing directory: „ + error.code); } // remove this directory entry.remove(success, fail); 7.2.8.getParent phương thức này được sử dụng để tìm kiếm thư mục dẫn cha mà đang chứa thư mục dẫn hiện tại.phương thức này gồm 2 tham số :  successCallback - đây là 1 hàm callback mà được gọi với đối tượng DirectoryEntry object cha của thư mục dẫn này  errorCallback - đây là 1 hàm callback mà được gọi khi có lỗi xảy ra và được gọi với đối tượng FileError object ví dụ : function success(parent) { alert(“Parent: “ + parent.name); } function fail(error) { alert(„Failed to get parent: „ + error.code); } // Get the parent DirectoryEntry entry.getParent(success, fail); 7.2.9.createReader phương này được sử dụng để tạo ra 1 đối tượng DirectoryReader mới mà có thể đọc các thực thể từ 1 thư mục dẫn ví dụ : // create a directory reader var directoryReader = entry.createReader(); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 98 Phonegap cho người mới học 7.2.10.getDirectory phương này được sử dụng để tạo ra hay tìm kiếm 1 thư mục dẫn.sẽ có lỗi xảy ra nếu ta cố gắng thực hiện :  tạo ra 1 thư mục dẫn mà thư mục cha tức thời của nó vẫn chưa tồn tại các tham số truyền vào phương thức này :  path – đây là 1 path chỉ tới thư mục dẫn để được tìm thấy hay được tạo ra.nó có thể là đường dẫn path tương đối hay tuyệt đối từ đối tượng DirectoryEntry. (DOMString) này  options – đây là các cấu hình dùng để định nghĩa thư mục dẫn được tạo ra nếu nó không tồn tại (Flags)  successCallback - đây là 1 hàm callback mà được gọi với đối tượng DirectoryEntry object (Function)  errorCallback - đây là 1 hàm callback mà được gọi khi có lỗi xảy ra và được gọi với đối tượng FileError object (Function) ví dụ : function success(parent) { alert(“Parent: “ + parent.name); } function fail(error) { alert(“Unable to create new directory: “ + error.code); } // Retrieve an existing directory, or create it if it does not already exist entry.getDirectory(“sampleFiles”, {create: true, exclusive: false}, success, fail); 7.2.11.getFile phương thức này được sử dụng để tạo ra hay tìm kiếm 1 file .nếu ta cố gắng tạo ra 1 file mà thư mục cha của nó chưa tồn tại thì sẽ gây ra lỗi các tham số dành cho phương thức này :  path - đây là 1 path chỉ tới file dẫn để được tìm thấy hay được tạo ra.nó có thể là đường dẫn path tương đối hay tuyệt đối từ đối tượng DirectoryEntry. (DOMString)  options – đây là các cấu hình dùng để định nghĩa file được tạo ra nếu nó không tồn tại (Flags) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 99 Phonegap cho người mới học  successCallback - đây là 1 hàm callback mà được gọi với đối tượng FileEntry object (Function)  errorCallback - đây là 1 hàm callback mà được gọi khi có lỗi xảy ra và được gọi với đối tượng FileError object (Function) ví dụ : function success(parent) { alert(“Parent: “ + parent.name); } function fail(error) { alert(“Failed to retrieve file: “ + error.code); } // Retrieve an existing file, or create it if it does not exist entry.getFile(“sample_data.txt”, {create: true, exclusive: false}, success, fail); 7.2.12.removeRecursively phương thức này được sử dụng để xóa 1 thư mục dẫn và tất cả phần tử chứa trong nó.trong trường hợp lỗi ví dụ như ta cố xóa 1 thư mục dẫn mà có chứa 1 file không thể bị xóa thì 1 vài nội dung của thư mục dẫn có thể bị xóa.nếu ta cố gắng xóa thư mục gốc root của filesystem thì cũng sẽ gây ra lỗi các tham số dành cho phương thức này :  successCallback – 1 hàm callback sẽ được gọi sau khi đối tượng DirectoryEntry được xóa, và được gọi với không tham số nào cả (Function)  errorCallback - đây là 1 hàm callback mà được gọi khi có lỗi xảy ra và được gọi với đối tượng FileError object (Function) ví dụ : function success(parent) { alert(“Delete succeeded!”); } function fail(error) { alert(“Failed tod elete directory or it‟s contents: “ + error.code); } // remove the directory and all it‟s contents Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 100 Phonegap cho người mới học entry.removeRecursively(success, fail); 7.3.metadata đối tượng này cung cấp thông tin về trạng thái của 1 file hay của 1 thư mục dẫn thuộc tính :  modificationTime – đây là thời điểm gần nhất mà file hay thư mục dẫn bị chỉnh sửa (Date) thông tin chi tiết : đối tượng Metadata object miêu tả thông tin về trạng thái của 1 file hay 1 thư mục dẫn.ta có thể lấy về 1 thực thể của đối tượng Metadata object bằng cách gọi phương thức getMetadata của 1 đối tượng DirectoryEntry or FileEntry object. Nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ : function win( metadata) { console.log("Last Modified: " + metadata.modificationTime); } // Request the metadata object for this entry entry.getMetadata(win, null); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 101 Phonegap cho người mới học 7.4.FileError 1 đối tượng FileError được thiết lập khi 1 lỗi xảy ra trong bất cứ phương thức File API nào Các thuộc tính :  Code – là 1 mã code lỗi được định nghĩa trước liệt kê như ở dưới Các hằng số :  FileError.NOT_FOUND_ERR  FileError.SECURITY_ERR  FileError.ABORT_ERR  FileError.NOT_READABLE_ERR  FileError.ENCODING_ERR  FileError.NO_MODIFICATION_ALLOWED_ERR  FileError.INVALID_STATE_ERR  FileError.SYNTAX_ERR  FileError.INVALID_MODIFICATION_ERR  FileError.QUOTA_EXCEEDED_ERR  FileError.TYPE_MISMATCH_ERR  FileError.PATH_EXISTS_ERR Thông tin mô tả : Đối tượng FileError object chỉ là 1 tham số duy nhất trong bất kì hàm File API's error callbacks nào.các nhà phát triển phải đọc thuộc tính code để xác định dạng lỗi 7.5.Flags Đối tượng này được sử dụng để cung cấp các tham số cho phương thức getFile và getDirectory của đối tượng DirectoryEntry – các phương thức này dùng để tìm kiếm hay tạo ra các files và thư mục 1 cách tương ứng Các thuộc tính :  Create – được sử dụng để xác định file hay thư mục có được tạo hay không nếu nó không tồn tại (boolean) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 102 Phonegap cho người mới học  Exclusive – được sử dụng kèm với việc tạo ra, nó sẽ gây ra lỗi trong việc tạo file or directory nếu đường dẫn path mục tiêu đã tồn tại (boolean) Các nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ : // Get the data directory, creating it if it doesn't exist. dataDir = fileSystem.root.getDirectory("data", {create: true}); // Create the lock file, if and only if it doesn't exist. { } lockFile = dataDir.getFile("lockfile.txt", create: true, exclusive: true ); 7.6.LocalFileSystem Đối tượng này cho biết 1 cách để lấy về thư mục gốc root của file systems Các phương thức :  requestFileSystem – yêu cầu 1 filesystem (Function)  resolveLocalFileSystemURI – lấy về 1 đối tượng DirectoryEntry or FileEntry bằng cách sử dụng URI địa phương (Function) các hằng số :  LocalFileSystem.PERSISTENT – được sử dụng cho lưu trữ mà không bị xóa bỏ bởi tác nhân người dùng  LocalFileSystem.TEMPORARY – được sử dụng cho lưu trữ mà không đảm bảo tính bền vững Thông tin chi tiết : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 103 Phonegap cho người mới học  Các phương thức của đối tượng LocalFileSystem object được định nghĩa trên đối tượng window object Các nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ : function onSuccess(fileSystem) { console.log(fileSystem.name); } // request the persistent file system window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onSuccess, onError); window.resolveLocalFileSystemURI("file:///example.txt", onSuccess, onError); 7.7.DirectoryReader 1 đối tượng mà liệt kê các files và các thư mục dẫn trong 1 thư mục Các phương thức :  readEntries – đọc các thực thể bên trong 1 thư mục dẫn các nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Các tham số cho phương thức này :  successCallback – là 1 hàm callback mà được chuyển tiếp 1 mảng của các đối tượng FileEntry và DirectoryEntry objects (Function) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 104 Phonegap cho người mới học  errorCallback - là 1 hàm callback mà được gọi nếu 1 lỗi xảy ra khi nhận về danh sách các thư mục liệt kê.được với 1 đối tượng FileError object. (Function) ví dụ : function success( entries) { var i; for (i=0; i< entries.length; i++) { console.log( entries[i].name); } } function fail(error) { alert("Failed to list directory contents: " + error.code); } // Get a directory reader var directoryReader = dirEntry.createReader(); // Get a list of all the entries in the directory directoryReader.readEntries(success,fail); 7.8.Cách sử dụng đối tượng FileEntry Object đối tượng này biểu diễn 1 file trên 1 hệ thống filesystem.và nó có các thuộc tính sau :  isFile – luôn luôn là true (boolean)  isDirectory – luôn luôn là false (boolean)  name – đây là tên của đối tượng FileEntry object, không bao gồm đường dẫn chỉ tới nó (DOMString)  fullPath – đây là đường dẫn đầy đủ tuyệt đối chỉ từ gốc root của đối tượng FileEntry object (DOMString) các phương thức :  getMetadata – tìm kếm thông tin metadata về 1 file Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 105 Phonegap cho người mới học  setMetadata – thiết lập metadata trên 1 file  moveTo – di chuyển 1 file vào 1 vị trí khác trên hệ thống filesystem  copyTo – sao chép 1 file tới 1 vị trí khác trên hệ thống filesystem  toURL – trả về 1 URL mà có thể được sử dụng để xác định vị trí 1 file  remove – xóa 1 file  getParent – tìm kiếm thư mục cha  createWriter – tạo ra 1 đối tượng FileWriter object mà có thể được sử dụng để viết vào 1 file  file – tạo ra 1 đối tượng File object chứa các thuộc tính của file các nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) 7.8.1.getMetadata đây là phương thức được sử dụng để tìm kiếm metadata về 1 file.nhớ rằng metadata của file nằm tách biệt với data thật sự của nó và metadata có thể là các thông tin về thời điểm tạo file, kích thước của file hay hơn thế các tham số của phương thức này chính là 2 hàm callback :  successCallback – 1 hàm callback được gọi với 1 đối tượng Metadata object  errorCallback – 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. Ví dụ : function success(metadata) { alert(“Last Modified: “ + metadata.modificationTime); } function fail(error) { alert(error.code); } // Request the metadata object for this entry entry.getMetadata(success, fail); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 106 Phonegap cho người mới học 7.8.2.moveTo phương thức này được sử dụng để chuyển 1 file tới 1 vị trí khác trên hệ thống filesystem.sẽ xảy ra lỗi khi ta cố thực hiện các thao tác sau :  cố thử di chuyển 1 file vào trong thư mục cha của nó với 1 tên khác với tên hiện tại  cố thử di chuyển 1 file vào path được dùng bởi 1 thư mục dẫn  cố thử di chuyển 1 file lên trên đầu của 1 file đã tồn tại mà không thực hiện xóa file đã tồn tại đó trước tiên các tham số :  parent – tên thư mục cha mà dùng để di chuyển file (DirectoryEntry)  newName – tên mới của file.nếu không được thiết lập mặc định nó là tên hiện tại (DOMString)  successCallback – 1 hàm callback sẽ được gọi với đối tượng FileEntry object mới (Function)  errorCallback - 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. (Function) ví dụ : function success(entry) { alert(“New Path: “ + entry.fullPath); } function fail(error) { alert(error.code); } function moveFile(entry) { var parent = document.getElementById(„parent‟).value, parentEntry = new DirectoryEntry({fullPath: parent}); // move the file to a new directory and rename it entry.moveTo(parentEntry, “new_file.txt”, success, fail); } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 107 Phonegap cho người mới học 7.8.3.copyTo sao chép 1 file tới 1 vị trí khác trên hệ thống filesystem .sẽ xảy ra lỗi khi ta cố thực hiện các thao tác sau :  sao chép 1 file vào bên trong thư mục cha của nó với tên khác với tên hiện tại các tham số :  parent – thư mục cha mà dùng để sao chép file (DirectoryEntry)  newName - tên mới của file.nếu không được thiết lập mặc định nó là tên hiện tại (DOMString)  successCallback – 1 hàm callback sẽ được gọi với đối tượng FileEntry object mới (Function)  errorCallback - 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. (Function) ví dụ : function success(entry) { alert(“New Path: “ + entry.fullPath); } function fail(error) { alert(error.code); } function copyFile(entry) { var parent = document.getElementById(„parent‟).value, parentEntry = new DirectoryEntry({fullPath: parent}); // copy the file to a new directory and rename it entry.copyTo(parentEntry, “file.copy.txt”, success, fail); } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 108 Phonegap cho người mới học 7.8.4.toURI trả về 1 URL mà có thể được sử dụng để xác định vị trí 1 file ví dụ : // Request the metadata object for this entry var uri = entry.toURI(); console.log(uri); 7.8.5.remove phương thức này được sử dụng để xóa 1 file các tham số là 2 hàm callback :  successCallback – đây là 1 hàm callback được gọi nếu file được xóa thành công, nó được gọi không cùng với tham số nào  errorCallback - 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. (Function) ví dụ : function success(entry) { alert(“Removal succeeded”); } function fail(error) { alert(„Error removing file: „ + error.code); } // remove the file entry.remove(success, fail); 7.8.6.getParent tìm kiếm thư mục cha DirectoryEntry đang chứa file các tham số :  successCallback – 1 hàm callback được gọi với đối tượng cha DirectoryEntry của file Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 109 Phonegap cho người mới học  errorCallback - 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. (Function) ví dụ : function success(parent) { console.log("Parent Name: " + parent.name); } function fail(error) { alert(error.code); } // Get the parent DirectoryEntry entry.getParent(success, fail); 7.8.7.createWriter ta có thể viết 1 file vào 1 thư mục dẫn bằng cách sử dụng phương thức createWriter.nó tạo ra 1 đối tượng FileWriter object được liên kết với file này các tham số :  successCallback – 1 hàm callback được gọi với 1 đối tượng FileWriter object (Function)  errorCallback - 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. (Function) ví dụ : function success(writer) { writer.write("Some text to the file"); } function fail(error) { alert(error.code); } // create a FileWriter to write to the file entry.createWriter(success, fail); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 110 Phonegap cho người mới học 7.8.8.file trả về 1 đối tượng File object dùng để miêu tả trạng thái hiện tại của file các tham số :  successCallback – 1 hàm callback được gọi với 1 đối tượng File object. (Function)  errorCallback - 1 hàm callback được gọi nếu có 1 lỗi xảy ra , nó được gọi với đối tượng FileError object. (Function) ví dụ : function success(file) { console.log("File size: " + file.size); } function fail(error) { alert("Unable to retrieve file properties: " + error.code); } // obtain properties of a file entry.file(success, fail); 7.9.Cách đọc các files - FileReader ta sử dụng đối tượng FileReader object để đọc 1 file.đối tượng FileReader object là 1 cách để đọc các files từ hệ thống filesystem của thiết bị.các files có thể được đọc giống như là các kí tự text, hay dữ liệu chuỗi string dựa vào mã hóa Base64-encoded đối tượng này sẽ có các thuộc tính sau :  readyState – đây là 1 trong 3 trạng thái (EMPTY, LOADING, or DONE) mà tiến trình đọc có thể đang ở trạng thái như vậy  result – được sử dụng để lấy các nội dung của file mà ta đang đọc  error – được sử dụng cho 1 đối tượng có chứa lỗi  onloadstart – được gọi khi tiến trình đọc vừa bắt đầu  onload – được gọi khi tiến trình đọc đã hoàn thành Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 111 Phonegap cho người mới học  onabort – được gọi khi tiến trình đọc đột ngột bị ngưng lại ( ví dụ như bằng cách gọi phương thức abort() )  onerror – được gọi khi tiến trình đọc thất bại  onloadend – được gọi khi yêu cầu được hoàn thành ( có thể yêu cầu này thành công hoặc thất bại )  onprogress – được gọi trong khi đang đọc file, báo cáo về tiến trình xử lý (progess.loaded/progress.total). (Function) các phương thức :  abort : dừng lại việc đọc file  readAsDataURL: đọc file và trả về dữ liệu như dữ liệu URL mã hóa base64 encoded  readAsText : đọc các text file những người dùng đăng ký các event listners để nhận về các sự kiện loadstart, progress, load, loadend, error and abort events các nền tảng hỗ trợ :  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) 7.9.1.readAsDataURL ta có thể đọc 1 file và trả về dữ liệu như là dữ liệu được mã hóa Base64-encoded, phương thức này thường dùng để đọc các ảnh images và các files nhị phân khác. Tham số truyền vào là file là đối tượng file object để đọc Ví dụ : file) { function win( var reader = new FileReader(); reader.onloadend = function(evt) { console.log("read success"); console.log(evt.target.result); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 112 Phonegap cho người mới học }; file); reader.readAsDataURL( }; var fail = function(evt) { console.log(error.code); }; entry.file(win, fail); 7.9.2.abort ta có thể dừng việc đọc 1 file bằng cách sử dụng phương thức abort như ví dụ sau : file) { function success( var reader = new FileReader(); reader.onloadend = function(event) { alert(“read success”); alert(event.target.result); }; file); reader.readAsText( reader.abort(); } function fail(error) { console.log(error.code); } entry.file(success, fail); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 113 Phonegap cho người mới học 7.9.3.readAsText các tham số :  File – là đối tượng file object để đọc  Encoding – phương thức giải mã sử dụng giải mã nội dung của file.mặc định là UTF8 ta cũng có thể đọc 1 file và trả về dạng text, đây là phương thức tốt nhất cho việc đọc các TXT files như ví dụ sau : function success(file) { var reader = new FileReader(); reader.onloadend = function(evt) { alert(“read success”); alert(evt.target.result); }; reader.readAsText(file); } var fail = function(event) { console.log(error.code); } entry.file(sucess, fail); ví dụ đầy đủ : FileReader Example

    Example

    Read File

    7.10.Cách đọc các files – FileWriter Ta có thể sử dụng đối tượng FileWriter object để ghi lên các files. 1 đối tượng FileWriter object sẽ tạo ra 1 file và khi được tạo, file này có thể được sử dụng để ghi lại nhiều lần vào nhiều thời điểm. Đối tượng FileWriter object có các thuộc tính position và length, do vậy ta có thể tìm kiếm và ghi tới bất cứ vị trí nào trên file. Theo mặc định, thì đối tượng FileWriter object sẽ ghi lên tại vị trí bắt đầu của file, và sẽ ghi đè lên dữ liệu đã tồn tại. ta có thể thiết lập append (không bắt buộc – có giá trị kiểu Boolean) thành true để khởi tạo việc bắt đầu ghi vào vị trí cuối của file (không ghi đè lên vị trí dữ liệu đã tồn tại) FileWriter object có các thuộc tính sau:  readyState – đây là 1 trong 3 trạng thái mà reader có thể là (INIT, WRITING, hay DONE)  fileName – đây là tên cùa file sẽ được ghi (DOMString)  length – là độ dài của file sẽ được ghi (long)  position – đây là vị trí hiện tại của con trỏ file (long)  error – đây là 1 đối tượng object chứa đựng lỗi nếu có (FileError)  onwritestart – được gọi khi tiến trình thực hiện ghi bắt đầu (Function)  onwrite – được gọi khi yêu cầu hoàn toàn được hoàn thành (Function)  onprogress – được trong khi vẫn thực hiện ghi file, báo cáo lại tiến trình thực hiện (progess.loaded/progress.total). (Function)  onabort – được gọi khi tiến trình thực hiện ghi bị ngừng lại (Function)  onerror – được gọi khi tiến trình thực hiện ghi thất bại (Function)  onwriteend – được gọi khi yêu cầu được hoàn thành (có thể thành công hay thất bại) (Function) đối tượng FileWriter object có các phương thức sau: Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 116 Phonegap cho người mới học  abort – dùng để ngừng tiến trình thực hiện ghi  seek – dùng để di chuyển con trỏ file tới vị trí nào đó  truncate – dùng để rút ngắn file lại theo 1 chiều dài nào đó  write – dùng để ghi dữ liệu vào file với UTF-8 encoding. Các nền tảng hỗ trợ:  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) Ví dụ: Seek function win(writer) { // fast forwards file pointer to end of file writer.seek(writer.length); }; var fail = function(evt) { console.log(error.code); }; entry.createWriter(win, fail); Truncate function win(writer) { writer.truncate(10); }; var fail = function(evt) { console.log(error.code); }; entry.createWriter(win, fail); Write Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 117 Phonegap cho người mới học function win(writer) { writer.onwrite = function(evt) { console.log("write success"); }; writer.write("some sample text"); }; var fail = function(evt) { console.log(error.code); }; entry.createWriter(win, fail); Append function win(writer) { writer.onwrite = function(evt) { console.log("write success"); }; writer.seek(writer.length); writer.write("appended text"); }; var fail = function(evt) { console.log(error.code); }; entry.createWriter(win, fail); Abort function win(writer) { writer.onwrite = function(evt) { console.log("write success"); }; writer.write("some sample text"); writer.abort(); }; var fail = function(evt) { console.log(error.code); }; entry.createWriter(win, fail); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 118 Phonegap cho người mới học ví dụ đầy đủ: FileWriter Example

    Example

    Write File

    7.11.Cách truyền dẫn files – FileTransfer Đối tượng FileTransfer object mang lại cho ta 1 cách để tải files lên 1 server từ xa bằng cách sử dụng 1 yêu cầu HTTP multi-part POST request. Cả 2 giao thức HTTP và HTTPS đều được hỗ trợ. Các tham số tùy chọn có thể được định nghĩa bằng cách chuyển tiếp 1 đối tượng FileUploadOptions object tới phương thức upload. Khi upload thành công, thì hàm success callback sẽ được gọi với 1 tham số được truyền vào là đối tượng FileUploadResult object. Nếu có 1 lỗi xảy ra, thì hàm error callback sẽ được gọi với 1 tham số được truyền vào là đối tượng FileTransferError object. Hơn thế, ta cũng có thể tải về 1 file từ server và lưu trữ nó trên thiết bị (chỉ hỗ trợ iOS và Android) Các nền tảng hỗ trợ:  Android  BlackBerry WebWorks (OS 5.0 and higher)  iOS  Windows Phone 7 ( Mango ) 7.11.1.upload var ft = new FileTransfer(); ft.upload(fileURI, serverURL, onUploadSuccess, onUploadError, fileUploadOptions); với :  fileURI – là đường dẫn đầy đủ của file trên thiết bị  serverURL – là URL của server ma file sẽ được tải lên (phải được mã hóa bằng cách sử dụng encodeURI()) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 120 Phonegap cho người mới học  onUploadSuccess – là 1 hàm callback sẽ được gọi với 1 tham số truyền vào là 1 đối tượng Metadata object. (Function)  onUploadError – là 1 hàm callback sẽ được gọi khi 1 lỗi xảy ra khi nhận về đối tượng Metadata, được truyền vào tham số là 1 đối tượng FileError object. (Function)  fileUploadOptions – là 1 đối tượng định nghĩa các thiết lập cấu hình : o chunkedMode: có kiểu Boolean dùng để điều khiển có hay không sự truyền dẫn của yêu cầu HTTP request được thực thi mà không cần bộ nhớ đệm. nếu giá trị này không được thiết lập, thì nó mặc định là true. (Boolean) o fileKey: định nghĩa tên của phần tử form mà file sẽ được tải lên server. Nếu không được thiết lập thì nó mặc định là file (DOMString) o fileName: tên file mà được tải lên server. Nếu không được thiết lập, nó sẽ mặc định tên là image.jpg. (DOMString) o mimeType: là kiểu MIME type của dữ liệu mà ta đang tải lên. Nếu không được thiết lập, nó mặc định sẽ là image/jpeg. (DOMString) o params: là 1 tập tùy chọn các cặp key/value mà được nhúng vào trong phần header của yêu cầu HTTP request (Object) o headers: 1 tập ánh xạ của header name => header value, dùng để định nghĩa nhiều giá trị cho phần header, sử dụng 1 mảng array của các giá trị (Object) hàm onUploadSuccess được chuyển tiếp vào 1 đối tượng result object – đối tượng này có thể được sử dụng để xác định trạng thái của tiến trình upload. Đối tượng result object có các thuộc tính sau:  bytesSent: số bytes đã được gửi lên server  responseCode: mã phản hồi HTTP response được trả về từ phía server  response: phản hồi HTTP response được trả về từ phía server Chú ý: iOS không hỗ trợ các thuộc tính responseCode và bytesSent trong đối tượng result object ví dụ: // !! Assumes variable fileURI contains a valid URI to a text file on the device var win = function(r) { console.log("Code = " + r.responseCode); console.log("Response = " + r.response); console.log("Sent = " + r.bytesSent); } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 121 Phonegap cho người mới học var fail = function(error) { alert("An error has occurred: Code = " + error.code); console.log("upload error source " + error.source); console.log("upload error target " + error.target); } var options = new FileUploadOptions(); options.fileKey="file"; options.fileName=fileURI.substr(fileURI.lastIndexOf('/')+1); options.mimeType="text/plain"; var params = {}; params.value1 = "test"; params.value2 = "param"; options.params = params; var ft = new FileTransfer(); ft.upload(fileURI, encodeURI("http://some.server.com/upload.php"), win, fail, options); File Transfer Example

    Example

    Upload File

    Cách thiết lập Upload Headers (chỉ hỗ trợ iOS và Android) function win(r) { console.log("Code = " + r.responseCode); console.log("Response = " + r.response); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 123 Phonegap cho người mới học console.log("Sent = " + r.bytesSent); } function fail(error) { alert("An error has occurred: Code = " + error.code); console.log("upload error source " + error.source); console.log("upload error target " + error.target); } var uri = encodeURI("http://some.server.com/upload.php"); var options = new FileUploadOptions(); options.fileKey="file"; options.fileName=fileURI.substr(fileURI.lastIndexOf('/')+1); options.mimeType="text/plain"; var params = {}; params.headers={'headerParam':'headerValue'}; options.params = params; var ft = new FileTransfer(); ft.upload(fileURI, uri, win, fail, options); Chú ý: khi upload lên 1 Nginx server thì ta phải chắc chắn rằng ta đã thiết lập cấu hình chunkedMode thành false 7.11.2.download var ft = new FileTransfer(); ft.download(source, target, successCallback, errorCallback); với :  source – là URL của server mà ta tải file từ đó về thiết bị (URL này phải được mã hóa bằng cách sử dụng encodeURI())  target – đường dẫn đầy đủ của file trên thiết bị  successCallback – 1 hàm callback được gọi với 1 tham số được truyền vào là đối tượng FileEntry object. (Function)  errorCallback – 1 hàm callback được gọi khi có 1 lỗi xảy ra trong quá trình nhận về Metadata. Được truyền vào tham số là 1 đối tượng FileError object. (Function) Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 124 Phonegap cho người mới học ví dụ: // !! Assumes filePath is a valid path on the device var fileTransfer = new FileTransfer(); var uri = encodeURI("http://some.server.com/download.php"); fileTransfer.download( uri, filePath, function(entry) { console.log("download complete: " + entry.fullPath); }, function(error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code" + error.code); } ); 7.11.3.abort Dùng để hủy bỏ 1 tiến trình truyền dẫn file đang được thực hiện. hàm onerror callback sẽ được gọi với 1 tham số truyền vào là đối tượng FileTransferError object Các nền tảng hỗ trợ:  Android  iOS 7.11.4.onprogress Được gọi với 1 sự kiện ProgressEvent bất cứ khi nào 1 khúc dữ liệu mới được truyền đi. Các nền tảng hỗ trợ:  Android  iOS Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 125 Phonegap cho người mới học ví dụ: fileTransfer.onprogress = function(progressEvent) { if (progressEvent.lengthComputable) { loadingStatus.setPercentage(progressEvent.loaded / progressEvent.total); } else { loadingStatus.increment(); } }; fileTransfer.download(...); // or fileTransfer.upload(...); 7.12.FileTransferError 1 đối tượng FileTransferError object được trả về thông ưua 1 hàm error callback khi có 1 lỗi xảy ra trong tiến trình tải lên hay tải xuống 1 file Các thuộc tính:  code – 1 trong các mã lỗi được định nghĩa trước (Number)  source – URL dẫn tới nguồn (String)  target – URL dẫn tới đích (String)  http_status – mã trạng thái HTTP status code. Thuộc tính này sẽ chỉ xuất hiện khi 1 mã phản hồi được nhận về từ kết nối HTTP connection. (Number) các hằng số:  FileTransferError.FILE_NOT_FOUND_ERR  FileTransferError.INVALID_URL_ERR  FileTransferError.CONNECTION_ERR  FileTransferError.ABORT_ERR Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 126 Phonegap cho người mới học VIII.Camera PhoneGap Camera API cung cấp cho 1 ứng dụng khả năng làm việc với các images hay khả năng chụp ảnh từ camera hay nhận file ảnh từ kho ảnh trong thiết bị.khi lấy về 1 ảnh image thì API có thể trả về 1 URL chỉ tới image file trên thiết bị hay chuỗi base64-encoded string dùng để biểu diễn nội dung bên trong 1 image API cung cấp 1 phương thức đơn là navigator.camera.getPicture – dùng để lấy về 1 ảnh image và 1 đối tượng cameraOptions object được sử dụng để định nghĩa các tham số xung quanh việc ảnh image được nhận về như thế nào, cách nó được định dạng như thế nào , … Các ứng dụng Apps cũng có thể sử dụng PhoneGap Capture API để chụp ảnh bằng cách sử dụng camera. Camera và Capture APIs là khác nhau  do vậy nó sẽ ảnh hưởng tới đánh giá của ta trước khi lựa chọn cái nào là cần thiết cho ứng dụng 8.1.Cách truy cập 1 ảnh Picture Để nhận về 1 ảnh picture từ thiết bị thì 1 ứng dụng nên thực thi các chức năng sau : navigator.camera.getPicture( onCameraSuccess, onCameraError,cameraOptions ); giống như các thư viện PhoneGap APIs khác thì lời gọi getPicture đòi hỏi rằng ta phải chuyển vào 2 hàm functions mà được thực thi trên lời gọi success và failure.trong trường hợp này, đây là các hàm onCameraSuccess và onCameraErrorfunctions.hàm onCameraSuccess function được thực thi khi 1 ảnh image được nhận về ( ta sẽ làm rõ hơn về nơi mà images được chứa ở đó và cách mà ta cấu hình API trong chương “cách thiết lập các cấu hình trong Camera” ở phần sau ).hàm onCameraError function được thực thi khi người dùng hủy bỏ tiến trình nhận về 1 ảnh image ngay khi bắt đầu hay khi 1 lỗi xảy ra trong tiến trình ví dụ 11-1 chỉ ra hàm Camera API đang được sử dụng với các cấu hình mặc định.theo như tài liệu trên trang chủ của Phonegap thì tham số cameraOptions là không bắt buộc nhưng nó sẽ là true hoặc false trên 1 vài thiết bị. Example 11-1 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 127 Phonegap cho người mới học

    Example 11-1

    Using the PhoneGap Camera API

    Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 128 Phonegap cho người mới học Trong ứng dụng này, đây chỉ là 1 trang page đơn giản với 1 nút button mà người dùng có thể nhấn vào để chụp 1 bức ảnh bằng camera.khi nút button được nhấn vào thì hàm take Photofunction được thực thi – nó đơn giản gọi phương thức getPicture và chuyển tiếp vào trong đó 2 hàm onCameraSuccess và onCameraErrorfunctions Trong ví dụ này thì ta chuyển tiếp vào 1 đối tượng cameraOptions object rỗng do đó phương thức getPicture sẽ chỉ sử dụng các cấu hình mặc định để lấy image từ camera và trả về 1 file URI chỉ tới nơi mà image được lưu giữ sau khi nó được chụp.khi 1 image được lấy về từ camera thì hàm onCameraSuccess function được gọi và chuyển tiếp vào URI chỉ tới image file mà vừa mới được tạo ra.trong ứng dụng, ta hầu như sẽ làm 1 vài điều gì đó với image URI, nhưng trong trường hợp này thì tất cả những gì ứng dụng làm là hiện thị ra 1 thông báo và chỉ ra file URI được chuyển tiếp vào hàm function Hình 11-1 chỉ ra ví dụ 1-11 chạy trên 1 Apple iPhone Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 129 Phonegap cho người mới học Khi ta ấn vào nút Take a Picture thì sẽ xuất hiện 1 nháy chớp màn hình và sau đó ứng dụng camera có sẵn trong thiết bị sẽ được mở và cho phép ta chụp 1 bức ảnh.sự chớp nháy này có thể sẽ khá lâu, do vậy ứng dụng của ta cần hiện thị 1 màn hình “please wait” screen sau khi gọi ra API này.khi 1 bức hính được chụp thì iOS sẽ hiện thị 1 màn hình xem trước như trong hình 11-2.tại đây ta có thể chụp lại bức hình hay ấn vào nút button để trả lại ứng dụng Phonegap Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 130 Phonegap cho người mới học Chú ý trên hình là không có cách nào để hủy bỏ tiến trình xử lý.nếu người dùng khởi tạo 1 tiến trình chụp ảnh trong ứng dụng phonegap đang chạy trên IOS thì không có cách nào để hủy bỏ tiến trình này mà không phải chụp 1 bức hình Trên thiết bị IOS, sau khi đã chụp xong hình thì ứng dụng sẽ hiện thị ra 1 thông báo hiện thị ra file URI cho image file vừa mới được tạo ra như hình 11-3 Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 131 Phonegap cho người mới học 1 trong những thứ mà ta phải chú ý về phiên bản IOS của ứng dụng là file URI trả về ứng dụng một tham chiếu tới 1 vị trí lưu tạm.nếu ta nhìn vào hình 11-3, ta sẽ nhìn thấy file URL như sau : file://localhost/var/mobile/Applications/169DF9CB-25D0-4EC8-85B2380A6342E08D/tmp/photo_001.jpg Trong file URI này thì file://localhost/var/mobile/Applications/location là vùng hệ thống file system được cấp phát cho dữ liệu của ứng dụng. 169DF9CB-25D0-4EC8-85B2380A6342E08D là 1 đánh dấu duy nhất được kết hợp với mỗi ứng dụng IOS.thư mục tmp là vị trí lưu trữ tạm và khi ứng dụng đóng thì vị trí lưu trữ tạm này sẽ bị xóa và ta sẽ mất truy Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 132 Phonegap cho người mới học cập vào image file.nếu ứng dụng của ta cần truy cập vào image file sau đó thì nó sẽ cần tạo ra 1 bản copy của image file trước khi ứng dụng đóng Khi chạy ví dụ 1-11 trên thiết bị Android hay BlackBerry thì ta sẽ có vấn đề.trong bài test thì trên Android thì nó chụp 1 bức hình nhưng sau đó làm treo ứng dụng phonegap và trả về thông tin về bức ảnh cho ứng dụng.trên BlackBerry thì nó không được chụp ảnh và khi ta ấn vào nút button thì không có chuyện gì xảy ra.nhìn bên ngoài thì giá trị mặc định của Camera.DestinationType trong cameraOptions trong cả 2 nền tảng đều là DATA_URL.do đó nó sẽ là nguyên nhân gây ra treo ứng dụng khi 1 bức hình được chụp ở độ phân giải tối đa.lỗi lớn này đã được xác định và được sửa lại trong PhoneGap 1.4. Để khiến ứng dụng hoạt động trên thiết bị Android và BlackBerry thì ta phải sửa lại lời gọi trong phương thức getPicture bằng cách nhúng vào 1 đối tượng cameraOptions object đơn giản như sau : function takePhoto() { navigator.camera.getPicture(onCameraSuccess, onCameraError, {quality: 50, destinationType: Camera.DestinationType.FILE_URI } ); } Với sự cài đặt này thì ta có thể chạy ứng dụng trên BlackBerry và sau đó ấn vào nút Take a Picture nhìn giống hình sau : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 133 Phonegap cho người mới học Khi ấn vào nút camera ở giữa đáy màn hính thì ảnh chụp sẽ được trả về cho ứng dụng PhoneGap như hình 11-5.chú ý ở hình trên thì image file được lưu trữ tại vị trí lưu trữ BlackBerry photo mặc định, không giống với IOS, thì bất kì ảnh nào được chụp bởi ứng dụng sẽ được lưu trữ sẵn luôn khi ứng dụng bị tắt Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 134 Phonegap cho người mới học Nếu ta không muốn ảnh được lưu trữ sau khi ứng dụng tắt thì ta sẽ cần xóa nó bằng tay bằng cách sử dụng PhoneGap File API Hình 11-6 chỉ ra cách ví dụ 11-1 chạy trên 1 thiết bị android.trong trường hợp này thì ảnh sẽ được chụp và hiện thị xem trước . Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 135 Phonegap cho người mới học Ta có thể đặt câu hỏi lại chính mình là ta làm cái gì với image file URI này khi ta lấy nó từ camera ? câu trả lời là, nó là 1 con trỏ chỉ tới 1 image file, do đó khi ứng dụng biết được nơi chứa file thì nó có thể đọc file hay copy file tới 1 chỗ khác ( bằng cách sử dụng PhoneGap File API ) hay chuyển tiếp file URI tới UI của ứng dụng phonegap để hiện thị ảnh trong phạm vi ứng dụng Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 136 Phonegap cho người mới học Ví dụ 11-2 là 1 phiên bản có chỉnh sửa đôi chút so với ví dụ 11-1.trong phiên bản này khi image URI được trả về cho ứng dụng thì 1 thẻ HTML image được viết vào trong trang index.html page vì vậy ảnh được chụp sẽ xuất hiện trên màn hình Example 11-2 Example 11-2

    Example 11-2

    Using the PhoneGap Camera API

    Những sự thay đổi chính là ở trong hàm onCameraSuccess function như sau : function onCameraSuccess(imageURL) { //Get a handle to the image container div ic = document.getElementById('imageContainer'); //Then write an image tag out to the div using the //URL we received from the camera application. ic.innerHTML = ''; } Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 138 Phonegap cho người mới học 8.2.Cách thiết lập các cấu hình trong Camera Options Giờ ta biết được cách chụp ảnh bằng camera, giờ ta nói về các cấu hình mà ta có thể sử dụng để thiết lập cách mà tiến trình này hoạt động.như ta đã nói tới từ trước thì khi gọi phương thức getPicture thì người lập trình có thể chuyển tiếp vào trong 1 đối tượng cameraOptions object dùng để định nghĩa các tham số điều khiển cách mà bức hình được lấy về.đối tượng cameraOptions object có các thuộc tính sau : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 139 Phonegap cho người mới học  quality  destinationType  sourceType  allowEdit  encodingType  targetWidth  targetHeight  mediaType mỗi một thuộc tính cấu hình ở trên sẽ được mô tả chi tiết hơn trong phần ngay sau đây.giống với nhiều tính năng khác của PhoneGap APIs thì các cấu hình của API nào đó ( giống như allowEdit trong Camera API ) chỉ áp dụng được trên giới hạn 1 số các nền tảng mobile đây là 1 ví dụ mẫu về 1 đối tượng cameraOptions object đầy đủ mà ta có thể sử dụng : var cameraOptions = { quality : 75, sourceType : Camera.PictureSourceType.CAMERA, destinationType : Camera.DestinationType.FILE_URI, allowEdit : true, encodingType: Camera.EncodingType.JPEG, targetWidth: 1024, targetHeight: 768 }; khi chuyển tiếp vào hàm getPicture function,thì đối tượng cameraOptions object này nói cho getPicture, để phương thức này lấy ảnh về từ camera (sourceType), và trả về file URI dùng để chỉ tới image file đã được chụp (destinationType), cho phép người dùng chỉnh sửa lại bức hình trước khi trả nó về chương trình (allowEdit), trả về 1 ảnh dạng .jpeg file (encodingType), thiết lập image file đã được mã hóa sử dụng 75% chất lượng ảnh (quality) và thiết lập độ phân giải của ảnh là 1024 by 768 pixels (targetWidth và targetHeight). 8.2.1.Quality Khi làm việc với smartphone cameras thì độ phân giải quang học cao trong thấu kính camera sẽ cộng dồn, thêm vào bộ nhớ lưu trữ giới hạn và băng thông truyền dẫn trên thiết bị, do vậy cần thiết phải có cách nén các ảnh images này để chúng chiếm ít bộ nhớ lưu trữ hơn và giảm tải băng thông truyền dẫn.giống như là 1 phần của tiến trình nén này , các tiêu chuẩn như định nghĩa JPEG có hỗ trợ bằng cách sử dụng chất lượng ảnh để kiểm soát độ Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 140 Phonegap cho người mới học nén ảnh khi 1 ảnh image file được lưu trữ.bằng cách sử dụng các thiết lập chất lương ảnh khác nhau, định nghĩa theo % thì ta có thể tác động 1 cách rất linh hoạt tới kích thước vật lý của 1 image file 1 ảnh có chất lượng 100% thì hiện thị y nguyên ảnh chụp mà không giảm đi chất lượng ảnh và đưa cho ta bức ảnh chất lượng tốt nhất Trong nhiều trường hợp ta có thể sử dụng giá trị 50% tới 100% cho chất lượng ảnh.như ta có thể thấy ở phần phía sau, các nhà lập trình có thể có 1 image file URI được trả về từ lời gọi getPicture hay dữ liệu raw thực sự của bức ảnh dựa vào base64-encoded image file data.cách sử dụng image file URI là rất dễ dàng và nó chỉ là 1 con trỏ file và ta đã xem xét ở các ví dụ trước.khi lấy về dữ liệu gốc raw image data từ getPicture thì ta phải đối mặt với thực tế là thiết bị và bộ chuyển đổi JS trên thiết bị bị giới hạn về bộ nhớ.khi xử lý dữ liệu gốc raw data từ 1 ảnh có độ phân giải cao ở chất lượng 100% thì ta sẽ phải xử lý trên 1 chuỗi string cực lớn và ứng dụng rất có thể bị treo mà không báo cho ta biết tại sao.khi ta giảm thiểu chất lượng ảnh thì ta giảm thiểu lượng dữ liệu mà ứng dụng phải xử lý Không may mắn là không có hướng dẫn chính xác nào về số % chất lượng ảnh mà ta phải giảm thiểu để đảm bảo thiết bị không bị treo.ta phải ước chừng và kiểm tra thử để biết các giá trị này rất có thể khác nhau trên các nền tảng khác nhau và ngay trên các thiết bị khác nhau có cùng nền tảng.theo đại đa số những người làm việc trên phonegap thì khuyên sử dụng chất lượng ảnh 50% ( hay thấp hơn ) khi ta làm việc với dữ liệu gốc raw image data. Để thiết lập cameraOptions object sử dụng chất lượng ảnh 50% thì ta sử dụng : quality : 50 Chú ý: theo tài liệu phonegap thì cấu hình này không áp dụng được trên nền tảng Black-Berry 8.2.2.destinationType khi chụp 1 bức hình bằng cách sử dụng getPicture thì ứng dụng sẽ sử dụng destinationType để điều khiển kiểu dữ liệu nào về image, sẽ được trả về giống như 1 file URI dùng để chỉ tới image file được lưu trữ trong bộ nhớ của thiết bị : destinationType: Camera.DestinationType.FILE_URI Hay để lấy về dữ liệu ảnh theo giá trị kiểu chuỗi base64-encoded string thì ta sử dụng như sau : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 141 Phonegap cho người mới học destinationType: Camera.DestinationType.DATA_URL cách làm việc với file URIs là rất dễ dàng như ví dụ 11-2.ứng dụng có 1 con trỏ file pointer. Ứng dụng có thể sử dụng con trỏ này, để nhúng nó vào bên trong 1 thẻ HTML img phổ biến (trong phạm vi ứng dụng), hay khi sử dụng File API để copy file này tới 1 vị trí khác (dựa vào con trỏ).khi ta đã biết file này ở đâu thì việc truy cập vào image file để xử lý là hết sức đơn giản hình 11-8 chỉ ra output của ví dụ 11-1 khi cấu hính destinationType là Camera.DestinationType.DATA_URL được sử dụng.như ta có thể thấy, thì những gì ta phải làm, thực chất là làm việc với 1 chuỗi string rất lớn, như đã biết nó là nguyên nhân gây ra tràn bộ nhớ và làm treo chương trình nễu chuỗi string là quá lớn Cách sử dụng dữ liệu gốc raw image data thì ta vẫn có thể biểu diễn được hình ảnh ở trong UI nhưng hơn thế, ta có thể sẽ dùng nó để lưu trữ trong database hay upload dữ liệu này lên 1 server Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 142 Phonegap cho người mới học 8.2.3.sourceType tham số sourceType được sử dụng để định nghĩa nơi mà phương thức getPicture lấy ảnh về.khi sourceType bị bỏ qua thì phương thức getPicture sẽ đơn giản sử dụng Camera.SourceType.CAMERA để lấy ảnh về.ứng dụng có thể định nghĩa sử dụng thư viện ảnh trong thiết bị bằng cách sau : sourceType : Camera.SourceType.PHOTOLIBRARY lấy về các ảnh từ 1 album ảnh đã lưu, bằng cách sử dụng sau : sourceType : Camera.SourceType.SAVEDPHOTOALBUM trên hầu hết các nền tảng, cách định nghĩa sourceType là SAVEDPHOTOALBUM hay PHOTOLIBRARY thực chất là giống nhau.như hình 11-9, khi ứng dụng tạo ra 1 lời gọi getPicture thì thiết bị sẽ mở ứng dụng thư viện ảnh và cho phép người dùng đầu tiên là lựa chọn 1 album ảnh và sau đó lựa chọn 1 bức ảnh trước khi trả về 1 ảnh đã được chọn tới ứng dụng Phonegap Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 143 Phonegap cho người mới học Trên thiết bị IOS thì 2 thao tác này hơi khác biệt 1 chút.khi 1 sourceType được định nghĩa là PHOTOLIBRARY thì ứng dụng sẽ thực thi tương tự với những gì trong hình 11-9.khi định nghĩa sourceType là SAVEDPHOTOALBUM thì ứng dụng sẽ mở 1 thư viện ảnh iOS Camera Roll photo library cho phép người dùng lựa chọn 1 ảnh từ đó Chú ý: Camera.PictureSourceType.PHOTOLIBRARY và Camera.PictureSourceType.SAVEDPHOTOALBUM có tính năng giống hệt nhau trong Android và cấu hình sourceType không được hỗ trợ trong BlackBerry Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 144 Phonegap cho người mới học 8.2.4.allowEdit 1 ứng dụng IOS có thể sử dụng cấu hình allowEdit để chỉ dẫn phương thức getPicture cho phép người dùng chỉnh sửa ảnh đã được chọn, trước khi trả về cho ứng dụng Phonegap.để thiết lập 1 đối tượng cameraOptions object cho cấu hình này ta sử dụng như sau : allowEdit : true khi được kích hoạt trong ứng dụng thì sau khi camera chụp ảnh thì thiết bị sẽ hiện thị 1 màn hình tương tự với hình 11-10.tại đây, người dùng có thể chỉnh sửa lại bức ảnh.khi người dùng ấn vào nút Choose button thì ảnh đã được chỉnh sửa sẽ được trả về cho ứng dụng PhoneGap Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 145 Phonegap cho người mới học Chú ý: cấu hình allowEdit không hỗ trợ trong android, blackberry 8.2.5.encodingType 1 ứng dụng Phonegap sử dụng encodingType cameraOption để nói cho phương thức getPicture biết định dạng ảnh nào được chụp.cấu hình được hỗ trợ là JPEG và PNG, với JPEG là cấu hình mặc định trên hầu hết các thiết bị.để thiết lập phương thức getPicture trả về 1 JPEG file thì ta sử dụng như sau : encodingType: Camera.EncodingType.JPEG hay sử dụng PNG files, ta sử dụng như sau Camera.EncodingType.PNG Chú ý: đọc thêm tài của phonegap để biết thêm 8.2.6.targetHeight và targetWidth tham số targetHeight và targetWidth điều khiển chiều rộng và chiều cao của ảnh được nhận về bằng phương thức getPicture.ta có thể thiết lập 1 trong 2 targetHeight và targetWidth và sau đó bức ảnh sẽ được tự động được tỷ lệ dựa theo 1 trong 2 tham số này.nếu ta định nghĩa cả 2 tham số trên thì ảnh sẽ được tỷ lệ dựa theo tham số mà kết quả của nó ở trong tỷ lệ nhỏ nhất. không có cách nào để theo lập trình xác định được độ phân giải camera hay tỉ lệ được hỗ trợ trước khi chụp 1 bức hình để định nghĩa đối tượng cameraOptions object mà định nghĩa targetHeight và targetWidth cho ảnh, ta sử dụng mã code sau : targetHeight: 100, targetWidth: 100 8.2.7.mediaType trong nhiều smartphones hiện đại ngày nay, chúng có thể chứa nhiều loại media types trong 1 photo library thì PhoneGap Camera API hỗ trợ bổ sung 1 giá trị mediaType trong cameraOptions object trong trường hợp mà sourceType đã thiết lập là PHOTOLIBRARY hay SAVEDPHOTOALBUM.tham số này hỗ trợ các cấu hình sau :  DEFAULT : trả về thông tin ảnh bằng cách sử dụng định dạng được định nghĩa trong giá trị destinationType  ALLMEDIA : cho phép lựa chọn tất cả các dạng media Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 146 Phonegap cho người mới học  PICTURE : cho phép lựa chọn chỉ các ảnh  VIDEO : cho phép chỉ lựa chọn video Khi cấu hình là video thì chỉ file URI được trả về cho chương trình vì lí do giới hạn bộ nhớ 8.2.8.saveToPhotoAlbum dùng để lưu ảnh vào photo album trên thiết bị sau khi chụp xong saveToPhotoAlbum : true 8.3.Làm việc với các vấn đề xảy ra với camera với bất cứ môi trường lập trình nào thì cũng tồn tại 1 vài chỗ mà mọi thứ có thể hoạt động không như mong đợi hoặc bị lỗi.mục đích của phần này là làm nổi bật cách mà ta xử lý khi Camera API gặp lỗi khi hàm onCameraError function được kích hoạt thì Camera API chuyển tiếp 1 đối tượng error object mà cần để truy vấn xác định nguyên nhân gây ra lỗi.như hình 11-11 thì lỗi là 1 thông báo đơn giản.trong trường hợp này thì người dùng ấn vào nút Cancel button trên hình 11-10, do đó không có thông tin về ảnh được trả lại ứng dụng phonegap Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 147 Phonegap cho người mới học Khi ứng dụng chạy trên thiết bị mà không có camera thì ta sẽ nhìn thấy lỗi giống như hình 11-12 sau : Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 148 Phonegap cho người mới học Nếu ứng dụng đang chạy trên thiết bị không có camera thì nó không đảm bảo hàm onCamera Errorfunction sẽ được thực thi bởi Camera API.nếu ứng dụng lỗi và ta không chắc tại sao thì đừng quên rằng lệnh console log có thể chứa các thông tin trợ giúp.hình 11-13 chỉ ra 1 đoạn trong iOS console với việc chạy ví dụ 11-1.chú ý rằng khi ta ấn vào nút Take a Picture button thì console logs ghi lại 1 lỗi dùng để xác định rằng source type 1 ( camera ) không sẵn sàng Đây là 1 trong các ví dụ khó hiểu mặc dù trên thiết bị có hỗ trợ 1 camera thì Apple đã quyết định rằng nó không đủ quan trọng để nhúng vào các chức năng có trong bản giả lập.trong Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 149 Phonegap cho người mới học trường hợp này để có thể test trên giả lập IOS thì ứng dụng của ta sẽ cần kiểm tra xem thiết bị nào đang chạy và đang sử dụng 1 photo library Nếu ứng dụng của ta dường như đang chạy đúng nhưng khi ta chụp 1 bức hình thì chẳng có chuyện gì xảy ra hay ứng dụng bị treo, đây hầu như chắc chắn là được gây ra bởi việc ứng dụng trả về dữ liệu gốc raw camera data chứ không phải là file URI và thiết bị không có khả năng để xử lý 1 chuỗi string quá lớn như vậy.khi chuyện đó xảy ra thì hãy thử làm giảm chất lượng hình ảnh xuống 50% hay nhỏ hơn để xem nó có sửa được vấn đề này không.nếu nó sửa được thì ta sẽ phải làm 1 vài việc dùng để xác định xem thiết lập cấu hình chất lương hình ảnh nào là tối ưu cho ứng dụng và thiết bị có thể xử lý được nó Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 150 Phonegap cho người mới học IX.Splashscreen Cho phép lập trình viên hiện thị hay ẩn đi màn hình splash screen của ứng dụng Các phương thức:  Show  Hide 10.1.Cách phần quyền Permissions Android app/res/xml/config.xml iOS Cordova.plist Add an entry under the Plugins dictionary - with the key "SplashScreen" and value "CDVSplashScreen". New projects should already have this key. 10.2.Cách thiết lập Android:  Sao chép ảnh màn hình splash screen vào trong các thư mục res/drawable của Android project. Và các kích thước của file ảnh sẽ là: a. xlarge (xhdpi): nhỏ nhất là 960x720 b. large (hdpi): nhỏ nhất là 640x480 c. medium (mdpi): nhỏ nhất là 470x320 d. small (ldpi): nhỏ nhất là 426 x 320  trong phương thức onCreate method của lớp class kế thừa (extends) DroidGap thêm vào 2 dòng sau: super.setIntegerProperty("splashscreen", R.drawable.splash); super.loadUrl("file:///android_asset/www/index.html", 10000); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 151 Phonegap cho người mới học dòng đầu tiên 'super.setIntegerProperty' thiết lập ảnh để hiện thị cho màn hình splashscreen. Nếu ta đã đặt tên bức ảnh là bất cứ thứ gì khác splash.png thì ta phải sửa lại dòng này. Dòng thứ 2 vẫn giữ không thay đổi và chú ý tới tham số thứ 2 là giá trị độ trễ timeout dành cho màn hình splash screen. Trong ví dụ trên, màn hình splash screen sẽ được hiện thị trong 10 giây. Nếu ta muốn tắt màn hình splash screen khi ta nhận được sự kiện "deviceready" event thì ta nên sử dụng phương thức navigator.splashscreen.hide() iOS:  sao chép ảnh màn hình splash screen vào trong thư mục Resources/splash của iOS project. Ta chỉ thêm ảnh dành cho thiết bị mà ta muốn hỗ trợ (iPad hay iPhone). Các kích thước của ảnh nên là: o Default-568h@2x~iphone.png (640x1136 pixels) o Default-Landscape@2x~ipad.png (2048x1496 pixels) o Default-Landscape~ipad.png (1024x768 pixels) o Default-Portrait@2x~ipad.png (1536x2008 pixels) o Default-Portrait~ipad.png (768x1024 pixels) o Default@2x~iphone.png (640x960 pixels) o Default~iphone.png (320x240 pixels) 10.3.show Hiện thị màn hình splash screen. navigator.splashscreen.show(); các nền tảng hỗ trợ:  Android  iOS „ Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 152 Phonegap cho người mới học ví dụ: Splashscreen Example

    Example

    10.4.hide ẩn đi màn hình splash screen. navigator.splashscreen.hide(); các nền tảng hỗ trợ:  Android  iOS Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 153 Phonegap cho người mới học ví dụ: Splashscreen Example

    Example

    Chú ý: 1 vài mẹo cho iOS: 1. trong Cordova.plist, ta cần hiệu chỉnh giá trị "AutoHideSplashScreen” thành false 2. sau đó, nếu ta muốn ẩn đi màn hình splash screen khoảng 2 giây, thì ta có thể làm như sau trong hàm hiệu chỉnh event deviceready setTimeout(function() { navigator.splashscreen.hide(); }, 2000); Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 154 Phonegap cho người mới học Ngô Quang Trung – email: [email protected] / www.phonegap.vn/forum 155
  • - Xem thêm -

    Tài liệu liên quan