• Thứ Sáu, 13/08/2004 10:02 (GMT+7)

    Phát triển ứng dụng J2ME sử dụng các tính năng mở rộng của ĐTDĐ Samsung


    Đặc tả MIDP được xây dựng để phát triển ứng dụng cho điện thoại di động (ĐTDĐ) có thể tương thích với đ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 bị 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 khả năng của ứng dụng chạy trên ĐTDĐ của mình. Bài viết này giới thiệu các tính năng mở rộng cho ĐTDĐ Samsung. Lưu ý, một khi bạn sử dụng các tính năng riêng của ĐTDĐ Samsung, ứng dụng của bạn sẽ không chạy trên ĐTDĐ của các hãng khác.

    Thư viện API cho ĐTDĐ Samsung bao gồm AudioClip để chơi nhạc, Vibration để tạo rung, LCDLight để bật tắt màn hình và cuối cùng là SMS cho phép bạn lập trình gửi tin nhắn SMS.

    Chơi nhạc với Audioclip

    Âm thanh có lẽ là một tính năng không thể thiếu của game, không chỉ với game trên PC mà cả game trên ĐTDĐ. Samsung cung cấp lớp com.samsung.util.AudioClip để lập trình âm thanh cho ứng dụng MIDP. Hiện nay ĐTDĐ 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 có thể dùng chương trình PsmPlayer có trong CD của BTC Mobile Games 2004 (bài hướng dẫn sử dụng PsmPlayer được đăng trong số báo này).

    Để kiểm tra ĐTDĐ 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 còn hỗ trợ 4 phương thức điều khiển là play() để chơi nhạc, stop() dừng chơi, pause() tạm dừng và resume() chơi tiếp đoạn nhạc đã tạm dừng trước đó. Lưu ý ở 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 minh hoạ AudioClip chơi 3 file .mmf, trong đó cũng minh hoạ cách xây dựng tính logic của chương trình, ví dụ 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 đó.

                                         CHƯƠNG TRÌNH MINH HỌA VIBRATION  
     

    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();
            }
        }
    }

     

    Cảm nhận rung với Vibration

    Rung là một tính năng đặc trưng của ĐTDĐ. Samsung cho phép bạn bật chế độ rung của ĐTDĐ với lớp com.samsung.util.Vibration. Để kiểm tra điện thoại có hỗ trợ rung hay không, bạn gọi phương thức Vibration.isSupported(). Lớp Vibration còn cung cấp 2 phương thức: 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 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. Hình 1 là chương trình minh hoạ tính năng rung chạy với trình mô phỏng (emulator), bạn chú ý icon trên cùng bên trái sáng lên báo hiệu đang rung.

                                      CHƯƠNG TRÌNH MINH HỌA AUDIOCLIP                       
     

    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();
                }
            }
        }
    }

     

    Bật tắt đèn màn hình với LCDLIGHT

    Bạn có thể bật tắt màn hình đèn Đ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ụ các game đánh cờ). Một số ĐTDĐ 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 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 LCDLight.isSupported() để kiểm tra ĐTDĐ của mình 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 

    public static void LCDLight.on(int duration)

    trong đó duration là số giây bật sáng và phải là một số nguyên dương. Để tắt, bạn chỉ cần gọi method LCDLight.off(). Hình 2 là chương trình minh họa tính năng đèn màn hình chạy với emulator, bạn chú ý icon bên trái, ở giữa có hình bóng đèn đang sáng lên.

                                             CHƯƠNG TRÌNH MINH HOẠ SMS  
     

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

     

    Nhắn tin với SMS

    Tính năng cuối cùng là nhắn tin SMS, mặc dù tính năng này thường không dùng cho game, tuy nhiên bạn có thể tham khảo để viết các ứng dụng khác. Để gửi SMS, bạn tạo một đối tượng 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 SMS.send(SM sm) để gửi tin nhắn đi.

    Bạn có thể tải về toàn bộ mã nguồn các chương trình demo tại địa chỉ http://www.JavaVietnam.org/javavn/tutorial/j2me/SamsungDemo.zip

    Ngoài ra, nếu có ĐTDĐ Samsung, bạn cũng có thể tải về các chương trình demo tại địa chỉ wap http://www.javavietnam.org/javavn/wap/game.wml

                                          CHƯƠNG TRÌNH MINH HOẠ LCDLIGHT  
     

    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();
            }
        }
    }

     

    Nguyễn Ngọc Minh
    (minhnn - www.JavaVietnam.org)

    ID: A0408_133