I.Browser API

Package Description
net.rim.blackberry.api.browser Cho phép ứng dụng hiển thị nội dung trên Web, bao gồm các kiểu image được hỗ trợ, các trang html và wml. Nó cũng cho phép ứng dụng cung cấp một referer, HTTP header và post dữ liệu trong HTTP request
net.rim.blackberry.api.browser.field Cho phép ứng dụng lấy nội dung Web để hiển thị trong browser field, được include trong giao diện người dùng, đồng thời cho phép cấu hình sự xuất hiện của browser field
net.rim.blackberry.api.browser.plugin Cho phép ứng dụng hỗ trợ thêm các kiểu định dạng khác, bằng cách đăng ký như là một rendering provider cho một kiểu MIME khi thiết bị Blackberry bắt đầu, tất cả các phiên trình duyệt tiếp theo sẽ hỗ trợ các kiểu MIME bổ xung đó.

II.Hiểu Thị Nội Dung Web Trên Browser

1.Nhận một Browser session

Để nhận một đối tượng BrowserSession mặc định, gọi phương thức tĩnh Browser.getDefaultSession(). Đối tượng  này cho phép bạn truy cập vào browser đang chạy trên thiết bị.

Lưu ý Việc nhận một default session sẽ override các session đang mở trong thiết bị Blackberry.

Để nhận một session khác, bạn chỉ cần gọi phương thức getSession(). Phương thức này lấy một bản ghi cầu hình dịch vụ trình duyệt theo ID duy nhất của nó(UID).

2.Yêu cầu một Web page

Để yêu cầu một web page, gọi phương thức BrowserSession.displayPage(). Ví dụ dưới đây sử dụng các phiên bản của displayPage() mà chỉ chấp nhận một URL. Để xác định một referrer, HTTP header, và post dữ liệu, sử dụng phiên bản chấp nhận các đối số bổ sung này.

Ví dụ 1:

private MenuItem browserItem = new MenuItem(_resources.getString(MENUITEM_BROWSER), 110, 12) {

public void run() {

synchronized(store) {

String websiteUrl = websitefield.getText();

if (websiteUrl.length == 0) {

Dialog.alert(_resources.getString(ALERT_NO_WEBSITE));

} else {

BrowserSession visit = Browser.getDefaultSession();

visit.displayPage(websiteUrl);

}

}

}

};

III.Hiển Thị Nội Dung Web Trong Một Browser Field

Để hiển thị nội dung web trong một browser field, sử dụng gọi net.rim.device.api.browser.field. Thư viện trình diễn browser xử lý việc rendering nội dung web cho field và sau đó trả về một BrowserField –  đây là field mà nội dung web được rendering vào ứng dụng để hiển thị.

Lưu ý Phiên làm việc đã được sử dụng để mở browser field phụ thuộc vào phiên làm việc mặc định của browser trên thiết bị Blackberry.

Giao diện RenderingApplication định nghĩa các chức năng gọi lại (callback) một session rendering để hỗ trợ xử lý các tài nguyên URL. Việc cài đặt các phương thức trong RenderingApplication nhằm hiển thị nội dung web trong một browser field.

1.Tạo một thread riêng biệt cho quá trình rendering

Để tránh làm cho ứng dụng bị treo trong khi ứng dụng nhận và hiển thị browser field, bạn nên thực hiện các hành động đó trong một thread riêng biệt.

Ví dụ 2: Tạo một thread riêng biệt

class CreationThread extends Thread {

BrowserFieldHandlerApplication _callBackApplication;

BasicRenderingApplication  _renderingApplication;

public CreationThread(BrowserFieldHandlerApplication callBackApplication) {

_callBackApplication = callBackApplication;

}

public void run() {

_renderingApplication = new BasicRenderingApplication(_callBackApplication);

BrowserField field = _renderingApplication.getBrowserField(“www.blackberry.com”);

_callBackApplication.displayBrowserField(field);

}

}

2.Thiết lập các tùy chọn Rendering

Override phương thức getRenderingOptions() để thiết lập các tùy chọn, nếu bạn không override phương thức này, các tùy chọn rendering mặc định sẽ được sử dụng.

3.Xử lý sự kiện

Cài đặt phương thức eventOccured() để xử lý các sự kiện, như là một URL request.

Ví dụ 3:

public Object eventOccurred(Event event) {

int eventId = event.getUID();

switch (eventId) {

case Event.EVENT_URL_REQUESTED : {

UrlRequestedEvent e = (UrlRequestedEvent) event;

// This is a regular request.

String absoluteUrl = e.getURL();

HttpConnection conn = null;

OutputStream out = null;

try {

conn = (HttpConnection) Connector.open(absoluteUrl);

FormData postData = e.getPostData();

if (postData == null) {

conn.setRequestMethod(HttpConnection.GET);

} else {

conn.setRequestMethod(HttpConnection.POST);

byte[] postBytes = postData.getBytes();

conn.setRequestProperty(

HttpProtocolConstants.HEADER_CONTENT_LENGTH,

String.valueOf(postBytes.length));

if (conn.getRequestProperty(

HttpProtocolConstants.HEADER_CONTENT_TYPE) == null) {

conn.setRequestProperty(

HttpProtocolConstants.HEADER_CONTENT_TYPE,

postData.getContentType());

}

out = conn.openOutputStream();

out.write(postBytes);

}

HttpHeaders requestHeaders = e.getHeaders();

if (requestHeaders != null) {

/* From http://www.w3.org/Protocols/rfc2616/rfc2616-

sec15.html#sec15.1.354

Clients SHOULD NOT include a Referer header field in a

(non-secure) HTTP request if the referring page was

transferred with a secure protocol.*/

String referer = requestHeaders.getPropertyValue(“referer”);

boolean sendReferrer = true;

if (referer != null && referer.startsWith(“https:”) && !absoluteUrl.startsWith(“https:”)) {

sendReferrer = false;

}

int size = requestHeaders.size();

for (int i = 0; i < size; i++) {

String header = requestHeaders.getPropertyKey(i);

// Remove refer header if needed.

if ( !sendReferrer && header.equals(“referer”)) {

equestHeaders.removeProperty(i);

continue;

}

conn.setRequestProperty( header,

requestHeaders.getPropertyValue( i ) );

}

}

} catch (IOException e1) {

} finally {

if (out != null) {

try {

out.close();

} catch (IOException e2) {}

}

}

BrowserField browserField = getBrowserField(conn, e);

_callbackApplication.displayBrowserField(browserField);

break;

}

case Event.EVENT_BROWSER_FIELD_CHANGED : {

// Browser field title might have changed. Update title.

break;

}

case Event.EVENT_REDIRECT : {

RedirectEvent e = (RedirectEvent) event;

switch (e.getType()) {

case RedirectEvent.TYPE_SINGLE_FRAME_REDIRECT :

// Show redirect message.

Application.getApplication().invokeAndWait(new Runnable() {

public void run() {

Status.show(“”);

}

});

break;

case RedirectEvent.TYPE_JAVASCRIPT :

case RedirectEvent.TYPE_META :

case RedirectEvent.TYPE_300_REDIRECT :

}

String absoluteUrl = e.getLocation();

HttpConnection conn = null;

try {

conn = (HttpConnection) Connector.open(absoluteUrl);

} catch (IOException e1) {

}

BrowserField browserField = getBrowserField(conn,

e.getOriginalEvent());

_callbackApplication.displayBrowserField(browserField);

break;

}

case Event.EVENT_CLOSE :

// Close the appication.

break;

case Event.EVENT_SET_HEADER :// no cache support

case Event.EVENT_SET_HTTP_COOKIE :   // no cookie support

case Event.EVENT_HISTORY :   // no history support

case Event.EVENT_LOADING_IMAGES :// no progress bar is supported

case Event.EVENT_EXECUTING_SCRIPT :  // no progress bar is supported

case Event.EVENT_FULL_WINDOW :   // no full window support

case Event.EVENT_STOP :  // no stop loading support

default :

}

return null;

}

4.Nhận nội dung browser để rendering

Cài đặt phương thức getBrowserField() để nhận nội dung browser để rendering. Phương thức getBrowserField() gọi phương thức RenderingSession.getBrowserField() để nhận một browser field, ứng dụng không thể khởi tạo browser field một cách trực tiếp.

Ví dụ 4:

public BrowserField getBrowserField (String absoluteUrl) {

HttpConnection conn = null;

try {

conn = (HttpConnection) Connector.open(absoluteUrl);

// Set transcode to true.

conn.setRequestProperty( “x-rim-transcode-content”, “*/*” );

} catch (IOException e1) {

}

return getBrowserField(conn, null);

}

private BrowserField getBrowserField(HttpConnection conn, Event e) {

BrowserField field = null;

try {

field = _renderingSession.getBrowserField(conn, this, e);

} catch (RenderingException re) {

return null;

}

// Add to the event queue a thread that invokes finishLoading().

Application.getApplication().invokeLater(new RenderingThread(field));

return field;

}

5.Rendering browser field

Gọi phương thức finishLoading(). Trong ví dụ trên, BrowserField.getBrowserField() chạy phương thức finishLoading() bằng cách thêm một thread mới vào event queue của ứng dụng.

Lưu ý Các file HTML sẽ hiển thị một blank field cho đến khi bạn gọi phương thức BrowserField.finishLoading(). Các file WML hay các image có thể được load trước khi phương thức này được gọi. Chạy phương thức finishLoading() trên một thread mới để UI không bị khóa.

Ví dụ 5:

class RenderingThread implements Runnable {

BrowserField _browserField;

RenderingThread(BrowserField field) {

_browserField = field;

}

public void run() {

try {

_browserField.finishLoading();

} catch (RenderingException e) {

// Handle exception.

}

}

}

6.Hiển thị BrowserField

Cài đặt phương thức displayBrowserField() bằng cách xóa nội dung cũ và thêm browser field vào màn hình.

Ví dụ 6:

public void displayBrowserField(BrowserField browserField) {

synchronized (Application.getEventLock()) {

_vfm.deleteAll();

_vfm.add(browserField);

}

}

Các bài liên quan:
Blackberry Bbrowser API – Phần 2