ĐẠ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
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:
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.
Phn cng thit bCá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.
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.
Đố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.
đượ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
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
ừ
– 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ệ
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;
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
tư
ợng Control nhận
đư
ợc từ giao tiếp
Cung c
ấp một giao tiếp
để nhận về các đ
ối
tư
ợ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. Đ
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
ầ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
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
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
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
đ
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
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 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ị
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
false
Không hỗ trợ thu âm thanh
supports.video.capture
false
Không hỗ trợ chụp hình
supports.recording null
Không hỗ trợ chụp hình
video.snapshot.encodings null
Không hỗ trợ chụp hình
streamable.contents
}
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ợ
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
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
ộ
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.
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
}
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;
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;
}
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 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",
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();
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);
}
}