Phát triển ứng dụng J2ME sử dụng các tính năng mở rộng của điện thoại Samsung
Bạn đang xem tài liệu "Phát triển ứng dụng J2ME sử dụng các tính năng mở rộng của điện thoại Samsung", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- phat_trien_ung_dung_j2me_su_dung_cac_tinh_nang_mo_rong_cua_d.doc
Nội dung text: Phát triển ứng dụng J2ME sử dụng các tính năng mở rộng của điện thoại Samsung
- Phát triển ứng dụng J2ME sử dụng các tính năng mở rộng của điện thoại Samsung Tóm tắt: Bài viết này trình bày cách lập trình sử dụng các tính năng riêng của các điện thoại Samsung để xây dựng các ứng dụng chạy trên các điện thoại này. Đặc tả MIDP được xây dựng để phát triển các ứng dụng cho điện thoại di động (ĐTDĐ) có thể tương thích với các điện thoại của các hãng sản xuất khác nhau. Tuy nhiên do đặc tả MIDP 1.0 còn một số giới hạn, đa số các hãng sản xuất ĐTDĐ đều cung cấp các thư viện API bổ sung để mở rộng thêm khả năng của các ứng dụng chạy trên các loại điện thoại này. Vì vậy nếu bạn viết ứng dụng trên ĐTDĐ Samsung, bạn nên tận dụng hết các tính năng mà điện thoại cung cấp cho bạn. Nếu game của bạn có sử dụng các tính năng của điện thoại Samsung, game của bạn sẽ hấp dẫn hơn và bạn sẽ được thêm điểm trong cuộc thi Mobile Games 2004. Tuy nhiên bạn cũng chú ý rằng một khi bạn sử dụng các tính năng riêng của điện thoại Samsung, ứng dụng của bạn sẽ không chạy trên ĐTDĐ của các hãng khác. Các đời điện thoại Samsung thường cung cấp các thư viện API bao gồm AudioClip để chơi nhạc, Vibration để tạo độ rung cho điện thoại, LCDLight để bật tắt màn hình điện thoại và cuối cùng là SMS giúp bạn có thể lập trình gửi các tin nhắn SMS. 1. Chơi nhạc với AudioClip Có lẽ âm thanh là một tính năng không thể thiếu được của các game, không chỉ các game trên máy để bàn mà còn cả cho các game chạy trên ĐTDĐ. Samsung cung cấp cho bạn lớp com.samsung.util.AudioClip để bạn có thể lập trình âm thanh cho các ứng dụng MIDP. Hiện nay điện thoại Samsung chỉ hỗ trợ kiểu định dạng .mmf (TYPE_MMF = 1). Để tạo đối tượng AudioClip, bạn dùng constructor sau: public AudioClip(int type, java.lang.String filename) throws java.io.IOException trong đó type luôn luôn bằng 1 (kiểu định dạng .mmf) và filename là tên tập tin .mmf. Để tạo tập tin mmf từ tập tin .midi, bạn hãy dùng chương trình PsmPlayer có trong CD của BTC (bài hướng dẫn sử dụng PsmPlayer được đăng kèm theo trong số báo này). Để kiểm tra điện thoại Samsung của bạn có hỗ trợ âm thanh hay không, bạn dùng phương thức tĩnh (static) AudioClip.isSupported(). AudioClip hỗ trợ 4 phương
- thức điều kiển là play() để chơi nhạc, stop() để dừng chơi, pause() giúp bạn tạm dừng và resume() cho phép bạn chơi tiếp đoạn nhạc đã được tạm dừng trước đó. Bạn chú ý là trong mỗi thời điểm chỉ có tối đa một đối tượng AudioClip chơi nhạc và đó là đối tượng được gọi play() sau cùng. Đoạn chương trình sau đây minh hoạ cách dùng AudioClip để chơi 3 file âm thanh .mmf, trong đó cũng minh hoạ cách xây dựng giao diện để bảo đảm tính logic, ví dụ như chỉ cho phép gọi play() khi đang stop, hoặc cho phép resume() chỉ sau khi bạn đã gọi pause() trước đó. Các bạn xem thêm hình minh hoạ khi chạy trong emulator cho X100:
- package org.javavietnam.j2me.samsungdemo; import javax.microedition.lcdui.*;
- import com.samsung.util.AudioClip; / * Demo AudioClip * @author Minh Nguyen */ public class AudioDemoForm extends List implements CommandListener { private Command cmdBack = new Command("Back", Command.BACK, 1); private Command cmdStart = new Command("Start", Command.SCREEN, 1); private Command cmdStop = new Command("Stop", Command.SCREEN, 1); private Command cmdPause = new Command("Pause", Command.SCREEN, 1); private Command cmdResume = new Command("Resume", Command.SCREEN, 1); private AudioClip audioClip = null; public AudioDemoForm() { super("Audio Demo", List.IMPLICIT); append("Joy", null); append("One Stop", null); append("Nguoi ta noi", null); setCommandListener(this); addCommand(cmdBack); addCommand(cmdStart); } public void commandAction(Command command, Displayable displayable) { if (command == cmdBack) { stopAudioClip(); Display.getDisplay(SamsungDemoMIDlet.instance).setCurrent(new MainForm()); } else if (command == cmdStart) { int currentIndex = getSelectedIndex(); String currentString = getString(currentIndex); String filename = null; if (currentString.equals("Joy")) { filename = "/joy.mmf"; } else if (currentString.equals("Nguoi ta noi")) { filename = "/nguoitanoi.mmf"; } else if (currentString.equals("One Stop")) { filename = "/onestop.mmf"; }
- playAudioClip(filename); } else if (command == cmdStop) { stopAudioClip(); } else if (command == cmdPause) { pauseAudioClip(); } else if (command == cmdResume) { resumeAudioClip(); } } public void playAudioClip(String filename) { stopAudioClip(); try { audioClip = new AudioClip(1, filename); audioClip.play(10, 5);// loop 10 times with maximum volume (5) addCommand(cmdStop); addCommand(cmdPause); removeCommand(cmdResume); } catch (Exception e) { e.printStackTrace(); } } public void stopAudioClip() { if (audioClip != null) { try { audioClip.stop(); audioClip = null; removeCommand(cmdStop); removeCommand(cmdPause); removeCommand(cmdResume); } catch (Exception e) { e.printStackTrace(); } } } public void pauseAudioClip() { if (audioClip != null) { try { audioClip.pause(); addCommand(cmdResume); addCommand(cmdStop);
- removeCommand(cmdPause); } catch (Exception e) { e.printStackTrace(); } } } public void resumeAudioClip() { if (audioClip != null) { try { audioClip.resume(); addCommand(cmdPause); addCommand(cmdStop); removeCommand(cmdResume); } catch (Exception e) { e.printStackTrace(); } } } } 2. Cảm nhận rung với Vibration Một trong những tính năng bạn có thể đưa vào game là tính năng rung của điện thoại. Rung là một tính năng đặc trưng của điện thoại và bạn sẽ không gặp tính năng này trong các game trên máy tính để bàn. Samsung cho phép bạn bật chế độ rung của điện thoại với lớp com.samsung.util.Vibration. Để kiểm tra xem điện thoại có hỗ trợ rung hay không, bạn gọi phương thức tĩnh (static method) Vibration.isSupported(). Lớp Vibration cũng cung cấp cho bạn 2 phương thức tĩnh (static method) Vibration.start() để bật rung và Vibration.stop() để tắt rung. Phương thức start() gồm 2 tham số như sau: public static void start(int duration, int strength) trong đó duration là số giây sẽ rung, phải là một giá trị dương và strength chỉ cường độ rung, có giá trị từ 1 đến 5. Tuy nhiên hiện nay giá trị strength này bị bỏ qua, nghĩa là chỉ có duy nhất một cường độ rung. Sau đây là đoạn chương trình minh hoạ tính năng rung trên điện thoại Samsung và hình chụp lúc chạy với bộ emulator cho E100, trong đó bạn chú ý icon trên cùng bên trái sáng lên báo hiệu đang rung
- package org.javavietnam.j2me.samsungdemo; import javax.microedition.lcdui.*;
- import com.samsung.util.Vibration; / * Demo Vibration * @author Minh Nguyen */ public class VibrationForm extends Form implements CommandListener { private Command cmdBack = new Command("Back", Command.BACK, 1); private Command cmdStart = new Command("Start", Command.SCREEN, 1); private Command cmdStop = new Command("Stop", Command.SCREEN, 1); Gauge gaugeDuration; Gauge gaugeStrength; public VibrationForm() { super("Vibration Demo"); gaugeDuration = new Gauge("Vibration Duration", true, 10, 5); this.append(gaugeDuration); // strength is between 1 to 5 so we set gauge's maxValue = 4 (from 0 to 4) gaugeStrength = new Gauge("Vibration Strength", true, 4, 4); this.append(gaugeStrength); setCommandListener(this); addCommand(cmdBack); addCommand(cmdStart); addCommand(cmdStop); } public void commandAction(Command command, Displayable displayable) { if (command == cmdBack) { Display.getDisplay(SamsungDemoMIDlet.instance).setCurrent(new MainForm()); } else if (command == cmdStart) { int duration = gaugeDuration.getValue(); int strength = gaugeStrength.getValue() + 1; Vibration.start(duration, strength); } else if (command == cmdStop) { Vibration.stop(); } } }
- 3. Bật tắt đèn màn hình với LCDLight Một tính năng nữa của Samsung cho phép bạn bật tắt màn hình ĐTDĐ với lớp com.samsung.util.LCDLight. Tính năng này rất hữu dụng cho các game có thời gian chờ lâu (ví dụ như các game đánh cờ). Một số màn hình điện thoại sẽ tự động tắt đèn màn hình sau một thời gian chờ kể từ khi nhấn phím cuối cùng (thường là sau 15 giây), bạn có thể lập trình để sau khoảng thời gian chờ này, chương trình tự động bật sáng đèn màn hình nhằm giúp người chơi dễ dàng theo dõi. Cũng giống như các tính năng khác, bạn gọi phương thức tĩnh LCDLight.isSupported() để kiểm tra điện thoại của bạn có hỗ trợ tính năng này hay không. Để bật sáng màn hình, bạn gọi phương thức tĩnh public static void on(int duration) trong đó duration là số giây bật sáng, phải là một số nguyên dương. Để tắt, bạn chỉ cần gọi method LCDLight.off(). Đoạn chương trình sau có kèm hình minh hoạ tính năng đèn màn hình, bạn chú ý icon bên trái, ở giữa có hình bóng đèn đang sáng lên.
- package org.javavietnam.j2me.samsungdemo; import javax.microedition.lcdui.*;
- import com.samsung.util.LCDLight; / * Demo LCDLight * @author Minh Nguyen */ public class LCDLightForm extends Form implements CommandListener { private Command cmdBack = new Command("Back", Command.BACK, 1); private Command cmdOn = new Command("On", Command.SCREEN, 1); private Command cmdOff = new Command("Off", Command.SCREEN, 1); Gauge gaugeDuration; public LCDLightForm() { super("LCDLight Demo"); gaugeDuration = new Gauge("LCDLight Duration", true, 10, 5); append(gaugeDuration); setCommandListener(this); addCommand(cmdBack); addCommand(cmdOn); addCommand(cmdOff); } public void commandAction(Command command, Displayable displayable) { if (command == cmdBack) { Display.getDisplay(SamsungDemoMIDlet.instance).setCurrent(new MainForm()); } else if (command == cmdOn) { int duration = gaugeDuration.getValue(); LCDLight.on(duration); } else if (command == cmdOff) { LCDLight.off(); } } } 4. Nhắn tin với SMS Tính năng cuối cùng cho phép bạn nhắn tin SMS, mặc dù tính năng này thường không được dùng khi viết game, bạn cũng có thể tham khảo để viết các ứng dụng khác cho điện thoại. Để gửi SMS bạn tạo một biến kiểu com.samsung.util.SM với constructor sau: public SM(java.lang.String dest,
- java.lang.String callback, java.lang.String textMessage) trong đó dest là địa chỉ đến, callback là địa chỉ callback và textMessage là nội dung tin nhắn. Sau khi có đối tượng SM, bạn dùng phương thức tĩnh SMS.send(SM sm) để gửi tin nhắn đi. Bạn tham khảo đoạn chương trình sau minh hoạ việc gửi tin nhắn với điện thoại Samsung package org.javavietnam.j2me.samsungdemo; import javax.microedition.lcdui.*; import com.samsung.util.SM; import com.samsung.util.SMS; / * Demo SMS * @author Minh Nguyen */ public class SMSForm extends Form implements CommandListener { private Command cmdBack = new Command("Back", Command.BACK, 1); private Command cmdSend = new Command("Send", Command.SCREEN, 1); TextField textFieldDest; TextField textFieldCallback; TextField textFieldMsg; public SMSForm() { super("SMS Demo"); textFieldDest = new TextField("Destination", "", 15, TextField.ANY); textFieldCallback = new TextField("Call back", "", 15, TextField.ANY); textFieldMsg = new TextField("Message", "", 128, TextField.ANY); this.append(textFieldDest); this.append(textFieldCallback); this.append(textFieldMsg); setCommandListener(this); addCommand(cmdBack); addCommand(cmdSend); } public void commandAction(Command command, Displayable displayable) {
- if (command == cmdBack) { Display.getDisplay(SamsungDemoMIDlet.instance).setCurrent(new MainForm()); } else if (command == cmdSend) { String dest = textFieldDest.getString(); String callback = textFieldCallback.getString(); String message = textFieldMsg.getString(); SM sm = new SM(dest, callback, message); SMS.send(sm); } } } 5. Kết luận Bài viết này đã trình bày cách lập trình sử dụng các tính năng riêng biệt của điện thoại Samsung. Với những kỹ thuật này, game của bạn sẽ hấp dẫn hơn và sẽ được chấm điểm cao hơn trong cuộc thi Mobile Games 2004 này. Mã nguồn toàn bộ chương trình này được opensource với giấp phép công cộng GPL và đặt tại CVS của JavaVietnam tại và bạn có thể download tại Ngoài ra nếu bạn có điện thoại Samsung, bạn có thể tải về chạy thử tại