BlackBerry 应用程序开发者指南 第二卷:高级--第5章 BlackBerry浏览器 |
|||
| 作者:佚名 来源:本站整理 发布时间:2008-3-15 1:07:24 | |||
为呈现获取浏览器内容
getBrowserField()的实现为呈现获取浏览器内容. getBrowserField()方法调用RenderingSession.getBrowserField()获取一个浏览器域.应用程序不能直接实例化BrowserField
描绘浏览器域
调用BrowserField.finishLoading().在下面的代码实例中, BrowserField.getBrowserField()将一个新的描绘线程加载到应用程序事件队列里来运行finishLoading().
显示浏览器域
displayBrowserField()的实现删除屏幕内容,然后增加浏览器域到屏幕.
代码实例
下面的实例包含了3个文件: BasicRenderingApplication.java, BrowserFieldHandlerApplication.java, 以及 BrowserFieldSampleApp.java. 例:浏览器域实例 /** * BasicRenderingApplication.java * Copyright (C) 2002-2005 Research In Motion Limited. */ package com.rim.samples.docs.browser; import java.io.IOException; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import net.rim.device.api.browser.field.*; import net.rim.device.api.io.http.HttpHeaders; import net.rim.device.api.io.http.HttpProtocolConstants; import net.rim.device.api.system.Application; import net.rim.device.api.ui.Graphics; import net.rim.device.api.ui.component.Status; import com.rim.samples.docs.browser.BrowserFieldHandlerApplication.*; final public class BasicRenderingApplication implements RenderingApplication { RenderingSession _renderingSession; BrowserFieldHandlerApplication _callbackApplication; public BasicRenderingApplication(BrowserFieldHandlerApplication callBackApplication) { _renderingSession = RenderingSession.getNewInstance(); _callbackApplication = callBackApplication; } /** * * Simple method to get a browser field by specifying the URL. * * This call blocks until the browser field is returned by RenderingSession.getBrowserField(). * * The browser field can continue to be rendered after the field is returned. * * * * @param absoluteUrl - absolute url of the page to render * * @return rendered browser field * */ public BrowserContent 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 BrowserContent getBrowserField(HttpConnection conn, Event e) { BrowserContent field = null; try { field = _renderingSession.getBrowserContent(conn, this, e); } catch (RenderingException re) { return null; } Application.getApplication().invokeLater(new RenderingThread(field)); return field; } /** * * Invoked when an event occurs. * */ 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); byte[] postData = e.getPostData(); if (postData == null) { conn.setRequestMethod(HttpConnection.GET); } else { conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty( HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(postData.length)); out = conn.openOutputStream(); out.write(postData); } HttpHeaders requestHeaders = e.getHeaders(); if (requestHeaders != null) { /* From http://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3 * ... * 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("referrer")) { requestHeaders.removeProperty(i); continue; } conn.setRequestProperty( header, requestHeaders.getPropertyValue( i ) ); } } } catch (IOException e1) { } finally { if (out != null) { try { out.close(); } catch (IOException e2) { } } } BrowserContent browserField = getBrowserField(conn, e); _callbackApplication.displayBrowserField(browserField); break; } case Event.EVENT_BROWSER_CONTENT_CHANGED : { // Browser field title might have changed. Update title. break; } case Event.EVENT_REDIRECT : { RedirectEvent e = (RedirectEvent) event; switch (e.getType()) { // 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) { } BrowserContent browserField = getBrowserField(conn, e.getOriginalEvent()); _callbackApplication.displayBrowserField(browserField); break; } case Event.EVENT_CLOSE : // Close the appication. break; case Event.EVENT_TICK_CONTENT_READ : // No progress bar is supported. 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; } /** * * Retrieves the pixels of height available for provided browser content. * * @param browserField Content for which to retrieve available pixels of height. * * @return Height available. * */ public int getAvailableHeight(BrowserContent browserField) { // Field has full screen. return Graphics.getScreenHeight(); } /** * |
