WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程BlackBerryBlackBerry 应用程序开发者指南 第二卷:高级--第5章 BlackBerry浏览器

BlackBerry 应用程序开发者指南 第二卷:高级--第5章 BlackBerry浏览器
作者:佚名  来源:本站整理  发布时间:2008-3-15 1:07:24

为呈现获取浏览器内容

getBrowserField()的实现为呈现获取浏览器内容. getBrowserField()方法调用RenderingSession.getBrowserField()获取一个浏览器域.应用程序不能直接实例化BrowserField

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;

    }

描绘浏览器域

调用BrowserField.finishLoading().在下面的代码实例中, BrowserField.getBrowserField()将一个新的描绘线程加载到应用程序事件队列里来运行finishLoading().
 :HTML文件显示一个空白域,直到你调用BrowserField.finishLoading().在调用此方法前WML文件和图像可能加载 .在一个独立线程上运行finishLoading(),这样UI不会锁住.

class RenderingThread implements Runnable {

    BrowserField _browserField;

    RenderingThread(BrowserField field) {

       _browserField = field;

       }

    public void run() {

       try {

           _browserField.finishLoading();

           }

       catch (RenderingException e) {

           // Handle exception.

           }

       }

    }

显示浏览器域

displayBrowserField()的实现删除屏幕内容,然后增加浏览器域到屏幕.

public void displayBrowserField(BrowserField browserField) {

    synchronized (Application.getEventLock()) {

       _vfm.deleteAll();

       _vfm.add(browserField);

        }

    }

代码实例

下面的实例包含了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();

    }

   

    /**

     *