Tải bản đầy đủ (.pdf) (30 trang)

chế tạo bộ đếm sản phẩmđề tài chương trình nghe nhạc trên mobile

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (813.62 KB, 30 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN: HỆ THỐNG NHÚNG



BÁO CÁO
CHUYÊN ĐỀ 1

ĐỀ TÀI
:
Chương trình nghe nhạc trên mobile.



Sinh viên thực hiện : Phan Văn Tuấn
Võ Văn Huy
Phùng Duy Thiện

Lớp : 07T1
















Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 2

MỤC LỤC

I. Giới thiệu Java và ứng dụng lập trình trên thiết bị di động: 3
I.1. Giới thiệu về Java: 3
I.2. Ứng dụng lập trình trên thiết bị di động bằng J2ME: 3
I.2.1. MIDlet: 4
I.2.2. Đồ họa trong J2ME: 4
1) Đồ họa mức cao: 5
2) Đồ họa mức thấp: 5
I.2.3. Lớp Canvas: 5
I.2.4. Lớp Graphics: 6
I.2.5. Lập trình Bluetooth: 6
II. Thư viện lập trình đa phương tiện trong J2ME: 6
III. Chương trình: 16
III.1. Nội dung các lớp: 16
III.1.1. Lớp startmusic: 16
III.1.2. Lớp logon: 18
III.1.3. Lớp screensave : 18
III.1.4. Lớp adjustvolume: 21
III.1.5. Lớp midlet playaudio: 22
IV. Kết quả: 25

V. Kết luận: 29





















Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 3


I. Giới thiệu Java và ứng dụng lập trình trên thiết bị di động:
I.1. Giới thiệu về Java:


Vào những năm 1990, Java được ra đời từ dự án xanh và ban đầu được xây dựng để
kiểm sóat các thí bị dân dụng và một số thiết bị cầm tay. Java được xây dựng chủ
yếu dựa trong bộ công cụ phát triển (Java Development Kit – JDK) như là thư viện
chuẩn trong đó chứa trình biên dịch, trình thông dịch,… Đây chính là nền tảng cho
việc phát triển ứng dụng Java. Hiện nay các nhà phát triển đã xây dựng nhiều nhánh
mới cho Java như:
J2EE ( Java 2 Platform Enterprise Edition): Phiên bản dành cho máy chủ lớn với sức
mạnh xử lý và dung lượng bộ nhớ lớn.
J2SE ( Java 2 Platform Standard Edition): Phiên bản chuẩn chạy trên các máy PC và
laptop.
J2ME ( Java 2 Platform Micro Edition): là phiên bản rút gọn của Java cho các thiết
di động giới hạn về bộ nhớ và bộ xử lý.

I.2. Ứng dụng lập trình trên thiết bị di động bằng J2ME:


Mục tiêu của J2ME là cho phép người lập trình viết các chương trình ứng ụng độc
lập với thiết bị di động, không cần quan tâm đến phần cứng. J2ME được xây dựng
bằng các tầng khác nhau để giấu đi việc thực hiện phần cứng khỏi nhà phát triển.
Sau đây là các tầng của J2ME được xây dựng trên CLDC:

 Tầng phần cứng thiết bị: đây là thiết bị di động với cấu hình phần cứng của
nó như bộ nhớ, tốc độ xử lý. Các thiết bị di động khác nhau có thể có các bộ
xử lý khác nhau với các mã linh khác nhau. Mục tiêu của J2ME là cung cấp
một chuẩn cho tất cả các loại thiết bị di động khác nhau.

 Tầng máy ảo Java: Khi mã nguồn Java đựoc biên dịch nó được chuyển đổi
thành mã bytecode. Mã bytecode này sau đó được chuyển thành mã ngôn ngữ
máy của thiết bị di động. Tầng máy ảo java bao gồm KVM ( K virtual
Machine) là bộ biên dịch mã bytecode có nhiệm vụ chuyển mã bytecode của

chương trình Java thành ngôn ngữ máy để chạy trên thiết bị di động. tầng này
cung cấp một số chuẩn hóa cho các thiết bị di động ứng dụng J2ME sau khi đã
biên dịch có thê họat động trên bất kì thiết bị di động nào có J2ME KVM.
 Phn cng thit bCác API khác
 Tầng cấu hình : tầng cấu hình của CLDC định nghĩa giao diện ngôn ngữ Java
cơ bản để cho phép chương trình java chạy trên thiết bị di động. Đây là một
tập các API định nghĩa lõi của ngôn ngữ J2ME . Người lập trình có thể sử
dụng các lớp và phương thức của các API này tuy nhiên các API hữu dụng
hơn được chứa trong tầng hiện trạng.
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 4

 Tầng hiện trạng: Tầng này cung cấp các API hữu dụng hơn cho người lập
trình. Mục đích của hiện trạng là xây trên lớp cấu hình và cung cấp nhiều thư
viện ứng dụng hơn. MIDP định nghia các API riêng biệt cho thiết bị di động.
Cũng có thể có các hiện trạng và các API khác ngòai MIDP được dùng cho
ứng dụng, cũng có thể có một hiện trạng định nghĩa các API cho việc tạo các
ứng dụng Bluetooth.

Hiện nay, MIDP có hai phiên bản là MIDP 1.0 và MIDP 2.0 và cung cấp:
- Các lớp và các kiểu dữ liệu
- Hỗ trợ đối tượng Display
- Hỗ trợ Form và giao diện người dùng
- Hỗ trợ Timer và Alert
- hỗ trợ Record Management System( RMS) cho việc lưu trữ dữ liệu.
Các tính năng nổi bật của MIDP 2.0 so với MIDP 1.0:
- Nâng cấp tính năng bảo mật, hỗ trợ giao thức HTTPS, kiểm sóat việc kết nối máy
di động với server.
- Thêm các API hỗ trợ Multimedia.

- Mở rộng các tính năng của Form

I.2.1. MIDlet:


Các ứng dụng J2ME được gọi là MIDlet ( Mobile Information Device Applet).
MIDlet là một lớp java mở rộng của lớp trừu tượng
javax.microedition.midlet.MIDlet và thực thi các phương thức startApp(),
pauseApp(), và destroyApp().
Đoạn chương trình tối thiểu của MIDlet:
import javax.microedition.midlet.*;
public class exMIDlet extend MIDlet {
public exMIDlet( ) { }
public void startApp( ) { }
public void pauseApp( ) { }
public void destroyApp( boolean unconditional ) { }

Trong đó :
o Phương thức exMIDlet là hàm constructor .
o Phương thức startApp( ) : được gọi bởi bộ quản lý ứng dụng khi MIDlet được khởi
tạo hay khi MIDlet trở về trạng thái tạm dừng.
o Phương thức pauseApp( ) : được gọi bởi bộ quản lý ứng dụng mỗi khi ứng dụng
cần được tạm dừng.
o Phương thức destroyApp( ): được gọi khi thoát khỏi MIDlet.

I.2.2. Đồ họa trong J2ME:


Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1

Trang 5

Các lớp MIDP cung cấp hai mức đồ họa: đồ họa mức thấp và đồ họa mức cao. Đồ
họa mức cao dùng cho văn bản hay form. Đồ họa mức thấp dùng cho các ứng dụng
games.

1) Đồ họa mức cao:
Đồ họa mức cao là lớp con của lớp Screen. Nó cung cấp các thành phần như text
box, form, list và alert.

a) TextBox:

Lớp Textbox cho phép người dùng nhập và sọan thảo văn bản. Người lập trình có
thể định nghĩa số ký tự tối đa, giới hạn dữ liệu nhập ( số, mật khẩu, imail,…) và hiệu
chỉnh nội dung của textbox.
b) Form:
Form là lớp hữu dụng nhất của các lớp Sreen bởi vì nó cho phép chứa nhiều item
trên cùng một màn hình. Các item có thể là datafield, TextField, ImageItem.
c) List:

Lớp List là một Screen chứa danh sách các lựa chọn, ngừoi sử dụng có thể tương tác
với List và chọn một hay nhiều item.

2) Đồ họa mức thấp:


Đồ họa mức thấp là lớp con của lớp Canvas. Lớp này cung cấp các phương thức đồ
họa cho phép vẽ lên màn hình hay vào một đệm hình cùng với các phương thức xử
lý sự kiện bàn phím. Lớp này dùng cho các ứng dụng trò chơi cần điều khiển về màn
hình.

Canvas và Graphics là hai lớp chủ yếu của các hàm API cấp thấp. Canvas là một
khung cho phép người lập trình có thể vẽ lên thiết bị trình bày cuũng như việc xử lý
sự kiện. Còn lớp Graphics cung cấp các đối tượng để vẽ.

I.2.3. Lớp Canvas:


Lớp Canvas là một lớp trừu tượng, ta phải tạo các canvas của riêng để vẽ trên lớp
mở rộng này và lớp Canvas cung cấp phương thức:
- paint (Graphics g) để thực hiện vẽ lên canvas.
- repaint() để thực hiện vẽ lại các hình đã hiện thị trên màn hình.
Mỗi lớp canvas tự động nhận sự kiện của phím bằng cách sử dụng các phương thức:
- void keyPressed (int keyCode): được gọi khi một phím được nhấn.
- void keyReleased( int keyCode): được gọi khi một phím được thả.
- void keyRepeated( int keyCode): được gọi khi một phím bị giữ.
- int getKeyCode(int gameAction): Lấy một mã phím phản hồi lại hành động game
xác định trên thiết bị.
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 6

- String getKeyName (int keyCode): Lấy tên của phím có giá trị mã phím là
keyCode.
- int getGameAction(int keyCode): Lấy một hành động game liên quan đến mã phím
được nhấn.
- void pointerDragged( int x, int y): được gọi khi rê chuột đến tọa độ x, y mới.
- void pointerPressed ( int x, int y) : được gọi khi nhấn chuột tới tọa độ x, y
- void pointerReleased ( int x, int y): được gọi khi thả chuột tới tọa độ x, y.

I.2.4. Lớp Graphics:



Đốii tượng Graphics có thể được sử dụng để vẽ: hình vuông, hình chữ nhật, cung
tròn, đường thẳng, ký tự, ảnh, văn bản trên đối tượng Canvas.
Các phương thức:
- void setColor(int red, int green, int blue)
- void drawArc(…): vẽ cung tròn.
- void drawRect(…): vẽ hình chữ nhật
- void drawString(…): Vẽ chuỗi.
- void drawImage(…): vẽ ảnh.

I.2.5. Lập trình Bluetooth:


Kĩ thuật bluetooth được dùng để truyền thông giữa điện thọai di động với điện thoại
di động, hoặc giữa điện thoại di động và máy tính.
Có 3 phương thức truyền thông được cài đặt trong kĩ thuật bluetooth:
- OBEX - Object Exchange: dùng để chuyển dữ liệu dùng file, hình ảnh.
- L2CAP- Logical Link Control and Adaptation Protocol: Dùng chuyển các gói dữ
liệu giữa client và server.
- RFCOMM- Radio Frequency COMMunication: Dùng để chuyển các luồng dữ liệu
đơn giản.
Sun Java cung cấp thư viện hàm API bluetooth: Bluetooth JSR82 API package và
bao gồm tất cả
các phương thức truyền thông nói trên.
một ứng dụng bluetooth bao gồm hai phần: server dùng để tạo dịch vụ bluetooth và
phần client
kết nối đến server và thực hiện truyền thông.







II. Thư viện lập trình đa phương tiện trong J2ME:
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 7


Thư viện lập trình đa phương tiện J2ME hỗ trợ các khả năng như âm thanh hay
\video cho ứng dụng trên thiết bị di động dựa trên nền tảng MIDP.

Thư viện lập trình đa phương tiện J2ME (MMAPI - Mobile Media API) là một gói
thư viện tùy chọn hỗ trợ các khả năng đa phương tiện như âm thanh hay video cho
ứng dụng trên thiết bị di động dựa trên nền tảng MIDP. Bài viết này sẽ trình bày
kiến trúc kỹ thuật của MMAPI cũng như các ví dụ thực tế để bạn đọc có thể thử các
khả năng của thư viện này.

Tổng quan về MMAPI
Thư viện MMAPI được thiết kế để có thể chạy trên bất kỳ máy ảo nào dựa trên
J2ME, bao gồm các máy ảo hỗ trợ CLDC (thường trên các điện thoại di động) hay
CDC (trên các máy trợ giúp số cá nhân PDA hay smartphone). Bộ công cụ lập trình
JaUmi của Samsung hỗ trợ lập trình cũng như kiểm tra các tính năng của thư viện
MMAPI.

MMAPI được thiết kế với những đặc tính sau:

– Hỗ trợ phát lại (playback) và ghi lại (recording) các tập tin đa phương tiện, hỗ trợ
định dạng âm thanh hay hình ảnh bất kỳ.– Sử dụng ít tài nguyên của hệ thống, chạy

được với những cấu hình rất thấp của các thiết bị dựa trên CLDC như ĐTDĐ.
– Không phân biệt nghi thức cũng như định dạng.
– Khả năng chỉ sử dụng một số tính năng: các lập trình viên có thể giới hạn những
tính năng trong chương trình, ví dụ như chỉ hỗ trợ tính năng âm thanh cơ bản hay chỉ
hỗ trợ một vài định dạng nào đó.
– Khả năng mở rộng: những khả năng mới có thể được thêm vào mà không được
làm ảnh hưởng đến các tính năng trước đó. Một số ví dụ như khả năng mở rộng thêm
các định dạng tập tin hay khả năng bổ sung các lớp điều khiển cho từng định dạng.


BẢNG 1: CÁC LỚP TRONG MMAPI



Gói



Lớp



Mô tả



javax.microedition.media





Manager




Điểm bắt đầu đ

nhận các đối t
ương
Player đ
ể xử lý các
tập tin
đa phương
tiện.




javax.microedition.media.protocol





ContentDescriptor





Mô t
ả kiểu nội dung
của dữ liệu.




javax.microedition.media.protocol





DataSource




Bi
ểu diễn một cách
trừu tượng khả n
ăng
x
ử lý các giao thức
bằng cách che
đi chi
ti
ết cách nhận dữ
liệu, ví dụ như t


m
ột tập tin hay từ
máy chủ. Đối tư
ợng


Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 8

Player s
ử dụng
những phương th
ức
của lớp này đ
ể nhận
các dữ liệu nhập.
– Khả năng tùy chọn cho các nhà sản xuất thiết bị: mặc dù thư viện này cung
cấp các tính năng cho nhiều mục đích khác nhau nhưng nó phải cho phép các
nhà sản xuất bỏ qua một số tính năng nếu như thiết bị của họ không hỗ trợ.

Việc xử lý tập tin đa phương tiện bao gồm 2 thành phần:
– Xử lý giao thức truyền: đọc dữ liệu từ một nguồn như tập tin hay máy chủ để
chuyển đến bộ phận xử lý nội dung.
– Xử lý nội dung: giải mã dữ liệu và xuất nó ra một thiết bị xuất như loa hay
màn hình video.
– Để dễ dàng lập trình 2 bộ phận xử lý trên, MMAPI cung cấp cho lập trình viên
2 kiểu đối tượng cấp cao:
– DataSource: trừu tượng hoá phần xử lý giao thức bằng cách che đi cách đọc
dữ liệu từ một nguồn nào đó.

– Player: lớp này đọc dữ liệu từ DataSource, xử lý và xuất ra. Lớp này cung cấp
các phương thức để điều khiển việc phát lại các tập tin âm thanh và hình ảnh.
MMAPI còn cung cấp một đối tượng thứ ba là Manager hoạt động theo cơ chế
“factory pattern” cho phép lập trình viên tạo ra các đối tượng Player từ các đối
tượng DataSource hoặc InputStream.
Chu kỳ sống của đối tượng Player gồm có 5 trạng thái sau: UNREALIZED,
REALIZED, PREFETCHED, STARTED, và CLOSED. Sáu phương thức sau
được dùng để thay đổi trạng thái của đối tượng Player: realize(), prefetch(),
start(), stop(), deallocate(), close().
Khi một đối tượng Player được tạo ra thì đầu tiên nó sẽ ở trạng thái UNREALIZED.
Khi gọi phương thức realize() thì đối tượng này sẽ chuyển sang trạng thái
REALIZED và khởi động những thông tin cần thiết để có thể nhận về nội dung tập
tin. Gọi prefetch() sẽ chuyển trạng thái sang PREFETCHED, ở trạng thái này đối
tượng Player sẽ tạo kết nối đến dữ liệu và thực thi những tác vụ khởi động khác. Khi
chúng ta gọi start() thì đối tượng sẽ bắt đầu xử lý dữ liệu và trạng thái được chuyển
thành STARTED. Khi toàn bộ nội dung đã được phát lại xong thì đối tượng Player
sẽ được chuyển về trạng thái PREFETCHED. Gọi phương thức close() sẽ chuyển
trạng thái thành CLOSED.
Một đối tượng Player cung cấp những điều khiển cho kiểu dữ liệu nó đang xử lý.
Các bạn có thể sử dụng phương thức getControl() để nhận về một đối tượng Control
hoặc gọi getControls() để nhận về một mảng các Control. Ví dụ như bạn đang phát
lại một tập tin theo định dạng MIDI và gọi phương thức getControl() thì bạn sẽ nhận
về một đối tượng MIDIControl.

MMAPI bao gồm 3 gói sau:
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 9

javax.microedition.media cung cấp một số giao tiếp (interface), một lớp ngoại lệ

MediaException và đặc biệt là lớp Manager, đây chính là nơi bắt đầu để nhận về các
đối tượng Player.
javax.microedition.media.control định nghĩa những điều khiển cụ thể có thể được sử
dụng với đối tượng Player như VolumeControl, VideoControl, và các điều khiển
khác.
javax.microedition.media.protocol định nghĩa những giao thức cho việc xử lý các
điều khiển tuỳ biến, ví dụ như lớp DataSource là một lớp trừu tượng để xử lý nội
dung của các tài nguyên.
Những lớp, giao tiếp và ngoại lệ trong các gói trên được mô tả trong bảng 1, 2 và 3.
Sử dụng MMAPI
Phần này sẽ trình bày những ví dụ thực tế sử dụng các API của MMAPI, ở đây tôi
chỉ trình bày những đoạn mã quan trọng. Nếu muốn tìm hiểu sâu hơn hay cần các ví
dụ hoàn chỉnh, các bạn có thể xem ví dụ mmademo có trong bộ công cụ phát triển
của Sun và Samsung.
Phát sinh tông nhạc
Việc phát sinh tông nhạc bao gồm việc xác định tần số và khoảng thời gian. Kiểu âm
thanh này rất quan trọng cho các game cũng như các ứng dụng âm thanh khác trên
các thiết bị nhỏ. Với các thiết bị nhỏ, hỗ trợ âm thanh có thể chỉ giới hạn ở việc hỗ
trợ phát lại các tông nhạc.
Phương thức Manager.playTone() sẽ phát sinh các tông nhạc. Thường thì các nhà
sản xuất sẽ hỗ trợ bằng cách sử dụng bộ phát sinh tông nhạc của phần cứng. Bạn chỉ
việc xác định nốt nhạc, khoảng thời gian và âm lượng.

try {

// phát tông nhạc trong 4000 mili giây với âm lượng 100
Manager.playTone()(ToneControl.C4, 4000, 100);
}
catch(MediaException me) {
}


Bạn cũng có thể tạo ra một đối tượng Player để tổng hợp các chuỗi tông nhạc.

Player player =
Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);

Kiểu Player này cung cấp cho bạn một đối tượng ToneControl để lập trình chuỗi các
tông nhạc. Tuy nhiên tính năng này có thể không có trên tất cả các thiết bị.
Phát lại tập tin MP3
Đoạn mã sau đây minh hoạ cách phát lại một tập tin mp3 một cách đơn giản nhất:

try {
Player p = Manager.createPlayer
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 10

(“
/>);
p.setLoopCount(5);
p.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}

Đoạn mã sau bổ sung thêm một số điều khiển âm thanh:

Player p;

VolumeControl vc;
try {
p = Manager.createPlayer(“
/>);
p.realize();
// Nhận điều khiển âm thanh và đặt âm lượng lên tối đa
vc = (VolumeControl) p.getControl(“VolumeControl”);
if(vc != null) {
vc.setVolume(100);
}
// dùng để hạn chế độ trễ của Player
p.prefetch();
// hàm này thoát ra ngày mà không đợi đến khi kết thúc
p.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}



BẢNG 2: CÁC GIAO TIẾP (INTERFACE) CỦA MMAPI



Gói




Giao tiếp



Mô tả



javax.microedition.media




Control




Dùng để đi
ều khiển
một số chức n
ăng liên
quan đến xử lý
đa
phương tiện. Các đ
ối

ợng Control nhận
đư
ợc từ giao tiếp

Controllable, đối tư
ợng
Player m
ở rộng
Controllable nên có th

cung cấp các đi
ều
khiển, ví dụ nh
ư
VolumeControl để đi
ều
chỉnh âm thanh.


Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 11



javax.microedition.media




Controllable





Cung c
ấp một giao tiếp
để nhận về các đ
ối

ợng Control từ một
đối tư
ợng Player hoặc
từ các đối tượng khác.





javax.microedition.media




Player




Dùng để đi
ều khiển
vi
ệc phát lại các tập tin
đa phương tiện. Đ

ối

ợng này cung cấp
những phương th
ức
đ
ể quản lý chu kỳ sống
của Player




javax.microedition.media




PlayerListener




Dùng đ
ể nhận các sự
kiện phát sinh từ đối

tượng Player





javax.microedition.media




TimeBase




M
ột nguồn liên tục các
nhịp thời gian, dùng đ

đo th
ời gian cho việc
đ
ồng bộ hoá việc phát
l
ại nhiều Player cùng
lúc.




javax.microedition.media.control





FramePositionControl




Điều khiển v
ị trí chính
xác c
ủa các khung
hình video.




javax.microedition.media.control




GUIControl




Nếu các đi
ều khiển hỗ
trợ giao tiếp đ
ồ họa thì
c

ần cung cấp phần
hi
ện thực cho giao tiếp
này.




javax.microedition.media.control




MetaDataControl




Dùng đ
ể nhận các
thông tin về tập tin
đa
phương tiện.




javax.microedition.media.control





MIDIControl




Dùng để đi
ều khiển
các thiết bị MIDI.




javax.microedition.media.control




PitchControl




Điều khiển đ
ộ cao thấp
tương đ
ối của âm
thanh mà không
ảnh

hưởng đến tốc đ
ộ phát
lại.




javax.microedition.media.control




RateControl




Điều khiển tốc đ
ộ phát
lại của Player.




javax.microedition.media.control




RecordControl





Điều khiển việc ghi lại.





javax.microedition.media.control




StopTimeControl




Xác định đi
ểm dừng
khi phát lại.




javax.microedition.media.control





TempoControl




Điều khiển nhịp đ

phát lại.




javax.microedition.media.control




ToneControl




Cho phép phát l
ại một
chu
ỗi các tông nhạc do
người dùng đ
ịnh

nghĩa.


Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 12



javax.microedition.media.control




VideoControl




Đi
ều khiển việc hiển thị
video, ví dụ như v
ị trí
tương đ
ối so với
Canvas.





javax.microedition.media.control




VolumeControl




Điều khiển âm lượng.




javax.microedition.media.protocol




SourceStream




Đư
ợc dùng chung với
đối tư
ợng DataSource
đ

ể cung cấp giao tiếp
cho vi
ệc nhận dữ liệu
của Player.


Lớp Manager cũng hỗ trợ phương thức Manager.createPlayer() với tham số
InputStream nên
bạn có thể phát lại nhạc từ Record Management System (RMS), hoặc từ trong tập tin
JAR. Đây là ví dụ cách lấy InputStream từ RMS và phát lại đoạn nhạc lưu trong đó:


RecordStore store;
int id;
// phát lại từ record store RMS
try {
InputStream is = new ByteArrayInputStream
(store.getRecord(id));
Player player = Manager.createPlayer(is, “audio/X-wav”);
p.start();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}

Và đây là đoạn mã ví dụ cách phát lại nhạc từ tập tin lưu trữ trong tập tin nén JAR:

try {
InputStream is =

getClass().getResourceAsStream(“audio.wav”);
Player player = Manager.createPlayer(is, “audio/X-wav”);
p.start();
}
catch(IOException ioe) {
}
catch(MediaException me) {
}



Bảng 3: NGOẠI LỆ (EXCEPTION) CỦA MMAPI



Gói



Ngoại lệ



Mô tả

Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 13




javax.microedition.media




MediaException




Dùng đ
ể báo một lỗi không mong
đợi trong các phương thức xử lý
đa
phương tiện.






Bảng 4: Những kiểu nội dung (content type) được đi
ện thoại Samsung E730
hỗ trợ




Kiểu nội dung




Giải thích



audio/midi




Tập tin nhạc theo định dạng MIDI




audio/x-smaf




Tập tin nhạc theo đ
ịnh dạng SMAF , là tập tin có phần mở
rộng .mmf của Samsung




audio/x-wav





Tập tin nhạc theo định dạng WAVE




audio/x-tone-seq




Chuỗi tông nhạc




audio/mpeg




Tập tin nhạc theo định dạng MP3




video/3gp





Tập tin video theo định dạng 3GP






Bảng 5: Những giao thức (protocol) được điện thoại Samsung E730 hỗ trợ



Giao thức



Giải thích



device




Giao thức lấy dữ liệu từ thiết bị





http




Giao thức mạng chuẩn HTTP




resource




Giao thức lấy dữ liệu từ tài nguyên hệ thống




file




Giao thức lấy dữ liệu từ tập tin







Bảng 6: Giá trị các thuộc tính của điện thoại Samsung E730



Thuộc tính hệ thống



Giá trị t
rong
E730




Giải thích



microedition.media.version




1.1





Hỗ trợ MMAPI 1.1




supports.mixing




false




Không h
ỗ trợ tổng hợp âm thanh,
ngh
ĩa là không cùng phát lại 2 âm
thanh từ 2 Player cùng lúc




supports.audio.capture





false




Không hỗ trợ thu âm thanh




supports.video.capture




false




Không hỗ trợ chụp hình




supports.recording





false




Không hỗ trợ thu lại video




audio.encodings




null




Không hỗ trợ thu âm thanh




video.encodings





null




Không hỗ trợ chụp hình




video.snapshot.encodings





null




Không hỗ trợ chụp hình




streamable.contents





null




Không h
ỗ trợ phát lại từ dữ liệu
dòng (streaming)


Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 14

Phát lại tập tin video mpeg. Đoạn mã sau minh hoạ cách phát lại một tập tin video
theo định dạng mpeg:

Player p;
VideoControl vc;
try {
p = Manager.createPlayer(“ />);
p.realize();
// nhận về điều khiển video
vc = (VideoControl) p.getControl(“VideoControl”);

p.start();

}
catch(IOException ioe) {
}
catch(MediaException me) {

}



Lấy thông số hỗ trợ kiểu nội dung và giao thức của điện thoại

Đoạn mã sau minh hoạ cách lấy thông số về những hỗ trợ kiểu nội dung (content
type) và giao
thức (protocol) được điện thoại hỗ trợ:



String[] contentTypesArray = Manager.getSupportedContentTypes(null);

for (int i = 0; i < contentTypesArray.length; i++) {

System.out.println(“Content Type “ + contentTypesArray[i]);
}
String[] protocolsArray = Manager.getSupportedProtocols(null);
for (int i = 0; i < protocolsArray.length; i++) {
System.out.println(“Protocol “ + protocolsArray[i]);
}

Lấy các thuộc tính hệ thống được định nghĩa trong MMAPI
Đoạn mã sau minh hoạ cách lấy các thuộc tính hệ thống để kiểm tra khả năng hỗ trợ

xử lý đa
phương tiện của điện thoại:

Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 15

System.out.println(“microedition.media.version=” +
System.getProperty(“microedition.media.version”));
System.out.println(“supports.mixing=” + System.getProperty(“supports.mixing”));
System.out.println(“supports.audio.capture=” +
System.getProperty(“supports.audio.capture”));
System.out.println(“supports.video.capture=” +
System.getProperty(“supports.video.capture”));
System.out.println(“supports.recording=” +
System.getProperty(“supports.recording”));
System.out.println(“audio.encodings=” + System.getProperty(“audio.encodings”));
System.out.println(“video.encodings=” + System.getProperty(“video.encodings”));
System.out.println(“video.snapshot.encodings=” +
System.getProperty(“video.snapshot.encodings”));
System.out.println(“streamable.contents=” +
System.getProperty(“streamable.contents”));


Kết luận:


Bài viết đã giới thiệu một cái nhìn tổng quan về thư viện xử lý đa phương tiện
MMAPI và những ví dụ cụ thể cách phát lại các tập tin âm thanh và video. Để phát
triển ứng dụng đa phương tiện cho model ĐTDĐ cụ thể, bạn cần nắm rõ những đặc

tính kỹ thuật của điện thoại có liên quan đến khả năng này. (Bảng 4, 5 và 6 là các
đặc tính kỹ thuật liên quan của điện thoại Samsung E730, model ĐTDĐ được sử
dụng chính thức cho cuộc thi Mobile Games 2005).



Bảng 7: So sánh MMAPI 1.0, MMAPI 1.1, MIDP 2.0 Media API và Thư vi
ện bổ
sung cho đa phương tiện




Đặc tả



Mô tả



MMAPI 1.0
(JSR 135)




Mobile Media API (MMAPI) là một gói thư vi
ện tuỳ chọn cho nền
tảng J2ME, thư vi

ện này cung cấp một giao diện lập trình ứng
dụng (API) chuẩn để phát lại và thu các định dạng
đa phương
tiện như nhạc hoặc video. Đây là một thư viện chuẩn với số đ
ặc
tả là JSR 135, được thiết kế với khả năng mềm dẻo đ
ể có thể
mở rộng và không phụ thuộc vào thiết bị cũng như n
ền tảng.
MMAPI không phụ thuộc vào bất kỳ định dạng lưu tr
ữ, giao thức
truyền dữ liệu hoặc những khả năng của các thiết bị phần cứng.





MMAPI 1.1




MMAPI 1.1 là bản chỉnh sửa của MMAPI 1.0 với những thay đ
ổi
cho phù hợp với tính năng bảo mật có trong MIDP 2.0. Bản đ
ặc
tả này không thay đổi bất kỳ lớp hoặc phương th
ức nào so với
MMAPI 1.0. Một số phương th
ức trong MMAPI có thể phát sinh

ngoại lệ SecurityException nếu như nếu như chương trình ch
ạy
không đ
ủ quyền thích hợp. Một trong số các yêu cầu về bảo
mật bao gồm tính năng ghi l
ại (recording) và truy cập mạng.
Những yêu cầu này nhằm bảo đảm quyền riêng tư của ngư
ời
dùng. Điện thoại Samsung E730 hỗ trợ MMAPI 1.1.


Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 16



MIDP 2.0
Media API
(JSR 118)




Thư viện này là một tập con của MMAPI để có thể chạy đư
ợc
trên các thi
ết bị cấp thấp có hỗ trợ MIDP 2.0, vì vậy nó có một
số yêu cầu như khả năng phát l
ại nhạc sử dụng rất ít tài nguyên

hệ thống, hỗ trợ việc phát lại các tông nhạc đơn giản, đi
ều chỉnh
âm lượng âm thanh phát ra, Do những yêu cầu này nên th
ư
viện đa phương tiện trong MIDP 2.0 thiếu một số tính năng c
ủa
MMAPI như: ch
ỉ hỗ trợ phát lại nhạc mà không hỗ trợ video,
không hỗ trợ đ
ồng bộ hoá việc phát lại nhiều tập tin âm thanh
cùng lúc.




Thư vi
ện bổ
sung đa
phương ti
ện
(JSR 234)




Thư viện này hỗ trợ bổ sung những khả năng m
ới nhất của
phần cứng như khả năng chụp ảnh số và nghe đài radio. M
ột số
tính năng mới của nó bao gồm khả năng điều khiển độ sáng, đ


tương phản, đèn flash, chế đ
ộ sáng, phóng to hoặc thu nhỏ lại
của máy chụp hình trong đi
ện thoại. Ngoài ra còn có những tính
năng xử lý âm thanh nâng cao như t
ạo các hiệu ứng âm thanh
hay khả năng thay đổi ngõ xuất chẳng hạn như ra loa ho
ặc ra
tai nghe.



III. Chương trình:
Lập trình trên nền NetBeans IDE 6.8.
Các class của chương trình:
Logon : giao diện đăng nhập chương trình
screensaver: giao diện lúc phát bài hát
startmusic : class xử lý phát bài hát
adjustvolume : xử lý âm lượng

MIDLET chính: playaudio



Chương trình nghe nhạc trên sẽ gồm các chức năng sau:
- Phát bài tiếp theo.
- Phát bài trước.
- Tạm dừng bài hát.
- Phát tiếp bài hát đã tạm dừng.

- Mute (im lặng).
- Tuỳ chỉnh âm lượng.

III.1. Nội dung các lớp:

III.1.1. Lớp startmusic:

package TD;
import javax.microedition.lcdui.*;
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 17

import javax.microedition.media.*;
import javax.microedition.media.control.*;
import java.io.*;
public class startmusic {
private Class td;
private playaudio plau;
private Display ds;
public Player pl;
private int volumeset;
public startmusic(playaudio plau){
this.plau=plau;
}
public void playfile(String songchoose){
try{
td=this.getClass();/*trả lại tên lớp của đối tượng hiện thời, tên lớp của đối
tượng hiện thời là startmusic nhưng khai báo startmusic td là sai vì td không phải là
đối tượng hiện thời*/

InputStream in = td.getResourceAsStream("/"+songchoose);/*tìm kiếm và
đưa tên bài hát vừa tham trị vào*/
String format=getFormat(songchoose);
plau.pl = Manager.createPlayer(in,format);/*tạo 1 bài hát với các điều kiện
vừa đưa vào*/
plau.pl.start();//BAT DAU BAI HAT
plau.volume=(VolumeControl)plau.pl.getControl("VolumeControl");
/* Lấy giao diện điều khiển âm lượng của media cho volume điều khiển update âm
lượng khi user muốn thay đổi */
volumeset=5*adjustvolume.ga.getValue(); //lấy âm lượng hiện thời
plau.volume.setLevel(volumeset); //âm lượng mặc định là 50%
screensaver.stit.setText(Integer.toString(volumeset));
this.pl=plau.pl;
}
catch (Exception e){
Alert al = new Alert("Error", e.getMessage(), null, AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
ds.setCurrent(al,playaudio.list);
}
}
private String getFormat(String songchoose) throws Exception {
String format;
if(songchoose.endsWith("wav")){
format = "audio/x-wav";
}
else if(songchoose.endsWith("jts")){
format = "audio/x-tone-seq";
}
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1

Trang 18

else if (songchoose.endsWith("mid")){
format = "audio/midi";
}
else if(songchoose.endsWith("mp3")){
format = "audio/mpeg";
}
else{
throw new Exception("Cannot guess content type from URL: " +
songchoose);
}
return format;
}
}

III.1.2. Lớp logon:


package TD;
import javax.microedition.lcdui.*;
class logon extends Canvas{
public Image logo;
public ImageItem imit;
protected void paint(Graphics g){
g.setColor(200,200,50); // thiết lập màu chữ
try {
logo = Image.createImage("/logo.png");
} catch (Exception ex) {
logo = null;

}
g.drawImage(logo,120 ,0,Graphics.TOP | Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_SYSTEM
,Font.STYLE_BOLD,Font.SIZE_LARGE ));
g.drawString("CHUYÊN ĐỀ 1", getWidth()/2, getHeight()/2-50, Graphics.TOP
| Graphics.HCENTER);
g.drawString("GVHD Trịnh Công Duy", getWidth()/2, (getHeight()/2)+15,
Graphics.TOP | Graphics.HCENTER);
}
}

III.1.3. Lớp screensave :


package TD;
import javax.microedition.lcdui.*;
import javax.microedition.media.MediaException;
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 19

import javax.microedition.media.PlayerListener;
class screensaver implements CommandListener{
private Display ds;
public static Form form;
public String msg; //Tên bài hát trong vừa chọn
private Command volume,mute,back,pause,resume,songnext,songback;
private playaudio plau; //Để cho user quay lại màn hình thứ nhất khi muốn
public adjustvolume volu; ; // Thay đổi âm lượng dùng Gauge
private Image im;

private ImageItem imit;
public static StringItem stit;
public boolean t=false;
/* Dùng để kiểm tra trạng thái đã từng thoát ra giao diện 1 lần nào chưa, nếu
chưa thì thêm nút bấm next để vào giao diện 2 và nút dừng nếu muốn dừng, còn
đã từng thoát tức là đã thực hiện công việc đó rồi thì không làm lại tốn thời gian
*/
//KHOI TAO
public screensaver(playaudio plau,Display ds){
this.plau=plau;
this.ds=ds;
form=new Form("PLAY MUSIC");
stit=new StringItem("VOLUME = ","");
back = new Command("BACK", Command.BACK, 1);
mute = new Command("MUTE", Command.ITEM, 0);
volume=new Command("VOLUME",Command.OK,0);
pause=new Command("TẠM DỪNG",Command.STOP,1);
resume=new Command("PHÁT TIẾP",Command.ITEM,1);
songback=new Command("BÀI TRƯỚC",Command.ITEM,1);
songnext=new Command("BÀI TIẾP",Command.ITEM,1);
form.append(stit);
form.addCommand(back);
form.addCommand(mute);
form.addCommand(volume);
form.addCommand(pause);
form.addCommand(songback);
form.addCommand(songnext);
form.setCommandListener(this);
volu=new adjustvolume(plau,ds);
}

public void text(){
form.setTicker(new Ticker(msg));
try{
im = Image.createImage("/3.png");
im = Image.createImage(im,0,0,im.getWidth(),im.getHeight(),0);
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 20

imit = new ImageItem("PLAYING :
"+msg,im,ImageItem.LAYOUT_CENTER,"");
}
catch (java.io.IOException e){
System.err.println("Unable to locate or read .png file");
}
form.insert(0,imit);
}
public void commandAction(Command c, Displayable s){
if(c==mute){
if(plau.volume.isMuted()) {
plau.volume.setMute(false);
}
else plau.volume.setMute(true);
}
else if(c==back){
if(t==false){
playaudio.list.addCommand(plau.stop);
playaudio.list.addCommand(plau.next);
t=true;
}

ds.setCurrent(playaudio.list);
}
else if(c==volume){ // giao diện thiết lập âm lượng
ds.setCurrent(adjustvolume.form);
}
else if(c==pause) {
try {
plau.pl.stop(); // tạm dừng
} catch (MediaException ex) {
ex.printStackTrace();
}
form.removeCommand(pause); // xoá nút tạm dừng
form.addCommand(resume); // thêm nút tiếp tục
}
else if(c==resume){ // phát tiếp
try {
plau.pl.start();
} catch (MediaException ex) {
ex.printStackTrace();
}
form.removeCommand(resume);
form.addCommand(pause);
}
else if(c==songback) { // phát bài trước đó
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 21

if(plau.pl!=null){
plau.pl.close();

plau.pl=null;
}
form.delete(0);
if(plau.i==0)plau.i=plau.n;
else plau.i ;
plau.play();
plau.pl=plau.stmu.pl;//TRA LAI BAI HAT HIEN THOI
plau.pl.addPlayerListener((PlayerListener) plau);
}
else if(c==songnext) { // phát bài tiếp theo
if(plau.pl!=null){
plau.pl.close();
plau.pl=null;
}
form.delete(0);
if(plau.i==plau.n)plau.i=0;
else plau.i++;
plau.play();
plau.pl=plau.stmu.pl;//TRA LAI BAI HAT HIEN THOI
plau.pl.addPlayerListener((PlayerListener) plau);
}
}
}
III.1.4. Lớp adjustvolume:


package TD;
import javax.microedition.lcdui.*;
public class adjustvolume implements ItemStateListener,CommandListener{
private Display ds;

public static Form form;
public static Gauge ga;
private StringItem stit;
private Command back;
private playaudio plau;
private int volumeset;
public adjustvolume(playaudio plau,Display ds){
this.plau=plau;
this.ds=ds;
form=new Form("ĐIỀU CHỈNH");
ga=new Gauge("ÂM LƯỢNG:",true,20,10); // Đặt mặc định là 50%
stit=new StringItem("VOLUME = ","");
back=new Command("BACK",Command.BACK,0);
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 22

form.append(ga);
stit.setText(Integer.toString(5*ga.getValue())); // đặt giá trị al lên tring item
form.append(stit);
form.setItemStateListener(this);
form.addCommand(back);
form.setCommandListener(this);
}
public void itemStateChanged(Item item){ /* hễ mỗi lần tăng hoặc giảm thì
vào đây lấy giá trị hiện thời ra để đặt biến kiểu VolumeControl */
volumeset=5*ga.getValue(); //lấy giá trị hiện thời sau khi sự kiện kích hoạt
plau.volume.setLevel(volumeset);//Đặt lại âm lượng tức lầ tăng hoặc giảm
stit.setText(Integer.toString(volumeset));
screensaver.stit.setText(Integer.toString(volumeset));

}
public void commandAction(Command c,Displayable s){
ds.setCurrent(screensaver.form);
}
}

III.1.5. Lớp midlet playaudio:


package TD;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import java.lang.Object.*;
public class playaudio extends MIDlet implements
CommandListener,PlayerListener{
public Display ds;
private logon login; // tạo logo đăng nhập
public static List list;
public String songchoose;
private screensaver scsa; // hiển thị màn hình khi phát nhạc
public Player pl; // Thuộc tính kiểu interface Player xử lý và phát nhạc
public VolumeControl volume; //Dùng để lấy âm lượng
private Command exit;
public Command play,stop,next;
public startmusic stmu; /* Các thao tác xử lý với bài hát */
public int i,n; // lấy vị trí bài hát
String string[]={"nhac_tinh.mid","ben_em_la_bien_rong.mid","test-
wav.wav","mong-uyen-uong-ho-diep.mid",

"noi_buon_hoa_phuong.mid","nguoi_tinh_mua_dong.mid","nhung_neo_duong_
phu_sa.mid","mau_nhuom_ben_thuong_hai.mid",
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 23

"999_doa_hong.mid","bai_ca_ky_niem.mid","cau_chuyen_dau_nam.mid","ctrd
msh.mid","rhymrain.mid",
"chieu_ky_niem.mid","co_be_doi_hon_1.mid","co_mot_nguoi.mid","500miles.
mid","sao_em_no_voi_lay_chong.mid",
"co_ua.mid","con_mua_ha.mid","con_mua_phun.mid","chia_tay_tinh_dau.mid",
"tan_vo.mid","chiec_la_mua_dong.mid",
"bai_khong_ten.mid","bai_khong_ten_so_3.mid","beethoven.jts","chiec_la_cuoi
_cung.mid","tien-ban-len-duong.mid",
"dv2thon.mid","gia_tu_di_vang.mid","happynew.mid","hoa-cau-vuon-
trau.mid","hon_vong_phu_2.mid"};
public playaudio(){
ds = Display.getDisplay(this);
login=new logon();
scsa=new screensaver(this,ds);
stmu=new startmusic(this);
play= new Command("PHÁT", Command.ITEM, 1);
stop= new Command("DỪNG", Command.STOP, 1);
next= new Command("NEXT", Command.ITEM, 1);
exit= new Command("THOÁT", Command.EXIT, 0);
list= new List("CHƯƠNG TRÌNH NGHE NHẠC",
Choice.IMPLICIT,string,null);
list.setTicker(new Ticker("ĐỒ ÁN CHUYÊN ĐỀ 1:VÕ VĂN HUY_PHAN
VĂN TUẤN_PHÙNG DUY THIỆN_LỚP 07T1_KHOA CÔNG NGHỆ
THÔNG TIN_TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG"));

list.addCommand(play);
list.addCommand(exit);
list.setCommandListener(this);
n=list.size()-1;
}
public void startApp(){
ds.setCurrent(login);
try {
Thread.sleep(3000); // thời gian hiển thị logo
} catch (InterruptedException ex) {
ex.printStackTrace();
}
ds.setCurrent(list);
}
public void pauseApp(){
try {
if(pl!=null)
pl.stop();
}
catch (MediaException ex) {
ex.printStackTrace();
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 24

}
}
public void destroyApp(boolean unconditionnal){
scsa=null;
list.deleteAll();

ds.setCurrent(null);
pl.close();//TAT NHAC
}
public void commandAction(Command c, Displayable s){
if (c == exit){
destroyApp(true);
notifyDestroyed();
}
else if(c==stop){
if(pl!=null){
pl.close();
pl=null;
screensaver.form.delete(0);
list.removeCommand(stop);
list.removeCommand(next);
scsa.t=false;
}
}
else if(c==next){
ds.setCurrent(screensaver.form);
}
else if (((s == list) && (c == List.SELECT_COMMAND)) || (c == play)){
if(pl!=null){
pl.close();
pl=null;
screensaver.form.delete(0);
}
i = list.getSelectedIndex();
play();
ds.setCurrent(screensaver.form);

pl.addPlayerListener(this);
}
}
public void playerUpdate(Player pl,String event,Object eventData){
if(event.equals(PlayerListener.END_OF_MEDIA)){
if(pl!=null){
pl.close();
pl=null;
screensaver.form.delete(0);
}
Giáo viên hướng dẫn: Th.S Trịnh Công Duy_Khoa CNTT_Trường ĐH Bách Khoa
SVTH: Võ Văn Huy_Phan Văn Tuấn_Phùng Duy Thiện_Lớp 07T1
Trang 25

if(i==n)i=0;
else i++;
play();
pl=stmu.pl; //Trả lại bài hát hiện thời
pl.addPlayerListener(this);
}
}
public void play(){
songchoose = list.getString(i);
scsa.msg = songchoose;
scsa.text();
stmu.playfile(songchoose);
}
}











IV. Kết quả:
Giao diện đăng nhập chương trình:



×