Posts from the ‘Code Example’ Category

Phát triển game trên Blackberry

Trong bài này, tôi xin giới thiệu các bạn một game “space fighter”. Nó có hướng dẫn rất đầy đủ, bạn có thể tham khảo tại: http://www.toniwestbrook.com/archives/69. Giao diện của nó như sau:

Chúc các bạn thành công!

Vẽ Gradient trong Blackberry

Giao diện:

Code:

Read more…

Tạo Menu Sử dụng LayerMananger

Sau đây, tôi xin giới thiệu tới các bạn một kỹ thuật tạo menu cho game bằng hình ảnh sử dụng các class LayerManager và Sprite trong gói javax.microedition.lcdui.game. Lưu ý, trong ví dụ này, tôi giả định rằng, độ rộng màn hình bằng 240, chiều cao màn hình 308(đây là chiều rộng và chiều cao mặc định trong emulator của Sun Wireless Toolkit). Giao diện của nó như sau:

Ứng dụng bao gồm 2 class: MenuScreen và MenuMidlet, lớp MenuScreen như sau: Read more…

Xây dựng TabMenu trên J2ME

Trong bài viết này, tôi xin được giới thiệu đến các bạn cách tạo ra TabMenu. Các component của chúng ta sẽ hỗ trợ:

Các style của Tab: màu nền, màu chữ, font, padding.

Tự động cuộn ngang màn hình mà không cần phải quan tâm tới độ rộng màn hình.

Đầu tiên, ta có các biến về style của Tab:

int background = 0xffffff;
int bgColor = 0xcccccc;
int bgFocusedColor = 0x0000ff;
int foreColor = 0x000000;
int foreFocusedColor = 0xffffff;
int cornerRadius = 4;
int padding = 2;
int margin = 2;
Font font = Font.getDefaultFont();
int scrollStep = 20;

Read more…

scaling bitmaps trong JavaME

Hôm nay, tôi xin giới thiệu với các bạn đoạn code để scale một image, phương thức scaleImage() là phương thức bạn cần quan tâm.

import java.io.IOException;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;

Read more…

Lắng nghe các message SMS đang đến: Bất đồng bộ

Trong bài viết này, tôi xin giới thiệu cách thức để cài đặt một MIDlet lắng nghe các tin nhắn SMS đang đến. Luồng hoạt động ở bài viết này được thực hiện một cách bất đồng bộ:

1. Người dùng cài đặt ứng dụng SMSListenerMIDlet vào thiết bị và khởi động nó. Tạm gọi thiết bị này là thiết bị A. Lúc này,MIDlet vẫn chưa lắng nghe các message đang đến, do đó, nếu người dùng bây giờ đã gửi một tin nhắn từ một thiết bị khác – tạm gọi là thiết bị B – thì SMS sẽ không bị chặn bởi các MIDlet. Thay vào đó, nó sẽ đến trong inbox của thiết bị A.

2. Người dùng sẽ để MIDlet bắt đầu nghe các message SMS bằng cách chọn Options> Start listening. Bên trong MIDlet sẽ xảy ra các vấn đề sau:

  • Phương thức startListening() được gọi.
  • Phương thức này sẽ mở một connection với port chỉ định và đăng ký MIDlet để lắng nghe các tin nhắn đến.

3. Từ thiết bị B, người dùng bây giờ có thể gửi tin nhắn với port chỉ định tới thiết bị A, và MIDlet trong thiết bị A sẽ xảy ra các vấn đề sau:

  • Phương thức notifyIncomingMessage() được gọi là do thực thi WMA.
  • Để giảm thiểu thời gian phương thức notifyIncomingMessage(), một thread riêng biệt được tạo ra để tìm nạp message.
  • Một khi thread được bắt đầu, nó sẽ block phương thức receive() cho đến khi có một tin nhắn có sẵn. Điều này không nên dùng lâu dài, kể từ khi MIDlet đã được thông báo rằng có một tin nhắn đang chờ. Tuy nhiên, nó là cách thực hành tốt để đảm bảo rằng phương thức hệ thống notifyIncomingMessage() trả về nhanh chóng.
  • Khi một message SMS đã nhận được, phương thức processMessage() được gọi. Nó sẽ kiểm tra các kiểu tin nhắn thư (kiểu văn bản, nhị phân, hoặc tin nhắn multipart) và xử lý phù hợp. Trong thực tế, nó sẽ hiển thị nội dung tin nhắn lên màn hình. Ở ví dụ này, chỉ xử lý tin nhắn kiểu văn bản.

4. Lưu ý rằng các SMS được gửi với port chỉ định sẽ không bao giờ đến inbox của thiết bị A một khi MIDlet đang lắng nghe chúng. Và bây giờ, nếu người dùng ngừng việc lắng nghe (bằng cách chọn Options> Stop listening), các SMS tiếp theo với cổng được chỉ định sẽ rơi vào inbox của thiết bị A, thay vì MIDlet. Read more…

Lắng nghe các message SMS đang đến

Trong bài viết này, tôi xin trình bày cách để cài đặt một MIDlet lắng nghe các message SMS đang đến. Luồng hoạt động của nó được thực hiện một cách đồng bộ như sau:

  • Người dùng cài đặt ứng dụng SMSListenerMIDlet vào thiết bị và khởi động nó. Tạm gọi thiết bị này là thiết bị A. Lúc này, MIDlet vẫn chưa lắng nghe các message đang đến, do đó nếu lúc này, người dùng gửi một tin nhắn SMS từ một thiết bị khác – tạm gọi thiết bị này là thiết bị B – thì nó sẽ không bị chặn bởi MIDlet. Thay vào đó, SMS sẽ đến trong inbox của thiết bị A.
  • Người dùng sẽ để MIDlet lắng nghe các message đang đến bằng cách chọn Options -> Start listening. Bên trong MIDlet,sẽ xảy ra 2 vấn đề sau:
    • Phương thức startListening() được gọi. Nó sẽ mở một connection vào port chỉ định, tạo ra một thread mới, và kích hoạt nó chạy.
    • Trong phương thức run(), phương thức đồng bộ receive() được gọi, và nó sẽ được block cho đến khi có một tin nhắn available.
    • Từ thiết bị B, bây giờ người dùng có thể gửi SMS, và SMS này sẽ được bắt lấy bởi MIDlet trong A. Và trong MIDlet sẽ xảy ra các vấn đề sau:
      • Khi một tin nhắn đến, phương thức receive() được trả về và phương thức processMessage() được gọi.
      • Phương thức processMessage() kiểm tra kiểu SMS như (kiểu văn bản, nhị phân, hoặc tin nhắn multipart) và xử lý chúng phù hợp. Trong thực tế, nó sẽ hiển thị nội dung văn bản tải của tin nhắn lên màn hình. Trong ví dụ này, chỉ xử lý tin nhắn văn bản.
      • Lưu ý rằng các SMS được gửi với port chỉ định sẽ không bao giờ đến inbox của thiết bị A một khi MIDlet đang lắng nghe chúng. Và bây giờ, nếu người dùng ngừng việc lắng nghe (bằng cách chọn Options> Stop listening), các SMS tiếp theo với cổng được chỉ định sẽ rơi vào inbox của thiết bị A, thay vì MIDlet.

Code của nó như sau: Read more…

Kiểm tra thiết bị có hỗ trợ API gửi tin nhắn hay không

Để kiểm tra version của thiết bị có hỗ trợ API cho phép gửi hay nhận tin nhắn SMS hay không, bạn sử dụng phương thức System.getProperty(“wireless.messaging.version”). Bạn có thể tham khảo đoạn code sau:

import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Display;

[…]

String wmVersion = System.getProperty("wireless.messaging.version");
if (wmVersion != null) {
    // Wireless messaging is supported. Inform the user.
    Alert alert = new Alert("Supported",
        "Wireless messaging is supported. Version is: " + wmVersion,
        null, AlertType.INFO);
    Display.getDisplay(this).setCurrent(alert);
} else {
    // Wireless messaging is not supported. Inform the user.
    Alert alert = new Alert("Not supported",
        "Wireless messaging is not supported.", null,
        AlertType.INFO);
    Display.getDisplay(this).setCurrent(alert);
}

Tham khảo code từ forum Nokia

Chụp hình bằng Camera sử dụng Mobile API – jsr 135

I.Chụp ảnh sử dụng Mobile Media API(MMAPI)
Đặc tả Mobile Media API cung cấp các lớp hỗ trợ chụp ảnh trên thiết bị.
Đầu tiên, Player phải được tạo ra:
Player player;

player = Manager.createPlayer(“capture://video”);
Sau đó player phải được khởi tạo:
Player.relize();
Sau đó, bạn phải nhận “videocontrol” để biểu diễn image ở viewfinder:
VideoControl videoControl;

videoControl = (VideoControl) player.getControl ( “VideoControl”);

VideoControl có 2 kiểu hiển thị:
Vẽ lên đối tượng Canvas trong MIDP UI cấp thấp, hoặc có thể thêm vào trong Form trong MIDP UI cấp cao như một item. Ví dụ như ta sử dụng canvas:
videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, canvas);
Bắt đầu một player, để người dùng có thể thấy camera:
player.start();
Một khi VideoControl đã được kích hoạt, bạn có thể chụp ảnh:
byte[] pngData = videoControl.getSnapshot(null);
Tham số trong phương thức getSnapShot() là một chuỗi định dạng dữ liệu sẽ được sử dụng. Nếu nó bằng null, dữ liệu sẽ lấy định dạng PNG, định dạng này là định dạng chuẩn và tất cả các máy đều hỗ trợ định dạng này.
Sau đó, dữ liệu có thể sử dụng theo nhiều cách. Có thể là được lưu ở RMS để sử dụng sau, hoặc gửi qua giao thức HTTP đến Server, hoặc hiển thị trực tiếp như một hình ảnh. Để tạo hình ảnh, ta sử dụng phương thức createImage(byte[], int, int) của lớp Image:
Image photoImg = Image.createImage(pngData, 0, pngData.length);
Camera hình ảnh và dữ liệu hình ảnh chiếm dung lượng rất lớn trong bộ nhớ, nên nếu bạn không sử dụng nữa, bạn nên gán tham chiếu của nó bằng null. Read more…

Fit một Image đúng với kích thước màn hình

Nếu bạn muốn sử dụng một Image làm background trong ứng dụng J2ME, bạn thường gặp phải một vấn đề là: phải sử dụng một image cho mỗi kích thước màn hình khác nhau. Để tránh việc sử dụng nhiều image cho nhiều loại màn hình khác nhau, ta sử dụng cách sau để fit một image đúng với kích thước màn hình.

Đặc tả phương thức: Read more…