黑莓7开发入门?

时间:2013-03-22 09:51:01

标签: blackberry blackberry-webworks

有人可以指点我学习如何开发黑莓7的正确方向吗?

实际上我需要的只是实现推送通知并再打开一个网址。

我看到这个平台有不同的框架,比如webWorks等等。

虽然我有点困惑..我不想写Javascript或HTML或CSS。

我想编写支持push的本机代码并加载我已经拥有的外部URL。

任何有关该信息或一些信息的教程都会很棒:)

1 个答案:

答案 0 :(得分:2)

试试这个 -

Client side code -

// Main Class-
class App extends UiApplication {
 private static App theApp;
  public App() {
       pushScreen(new register());    
    }

  public static void main(String[] args) {
          if (args.length > 0 && args[0].equals("BB_push") ){
             theApp = new App();
             theApp.enterEventDispatcher();   

            }
        else {      
            BackgroundApplication backApp=new BackgroundApplication();
            backApp.setupBackgroundApplication();
            backApp.enterEventDispatcher();

       }       
    }  
}




//Register Class-
public class register extends MainScreen{
    public register(){
    final ButtonField btn=new ButtonField("Register");
        add(btn);
 FieldChangeListener listener=new FieldChangeListener() {
               public void fieldChanged(Field field, int context) {

                   if(field==btn){

                     registerBpas();

                   }

               }};
    btn.setChangeListener(listener);

}
}


public static void registerBpas() {

    new Thread() {
        public void run() {
            try {
            final String registerUrl = formRegisterRequest(BPAS_URL, APP_ID, null) + ";deviceside=false;ConnectionType=mds-public";
            System.out.println("\n\n\n msg registerBPAS URL is:  "+ registerUrl);
            HttpConnection httpConnection = (HttpConnection) Connector.open(registerUrl);
            InputStream is = httpConnection.openInputStream();
            String response = new String(IOUtilities.streamToBytes(is));
            System.out.println("\n\n\n\n\n\n msg RESPOSE CODE :    " + response);
            httpConnection.close();
            String nextUrl = formRegisterRequest(BPAS_URL, APP_ID, response) + ";deviceside=false;ConnectionType=mds-public";
            System.out.println("\n\n\n\n\n\n msg nextUrl :    " + nextUrl);
            HttpConnection nextHttpConnection = (HttpConnection) Connector.open(nextUrl);
            InputStream nextInputStream = nextHttpConnection.openInputStream();
            response = new String(IOUtilities.streamToBytes(nextInputStream));
            System.out.println("\n\n\n\n\n\n msg RESPOSE CODE 1:    " + response);
            nextHttpConnection.close();
            if (REGISTER_SUCCESSFUL.equals(response) || USER_ALREADY_SUBSCRIBED.equals(response)) {
                Dialog.alert("msg Registered successfully for BIS push");


                System.out.println("msg Registered successfully for BIS push");
            } else {
                Dialog.alert("msg BPAS rejected registration");
                System.out.println("msg BPAS rejected registration");
            }
        } catch (final IOException e) {
            Dialog.alert("msg IOException on register() " + e + " " + e.getMessage());
            System.out.println("msg IOException on register() " + e + " " + e.getMessage());
        }
    }
    }.start();
}

private static String formRegisterRequest(String bpasUrl, String appId, String token) {
    StringBuffer sb = new StringBuffer(bpasUrl);
    sb.append("/mss/PD_subReg?");
    sb.append("serviceid=").append(appId);
    sb.append("&osversion=").append(DeviceInfo.getSoftwareVersion());
    sb.append("&model=").append(DeviceInfo.getDeviceName());
    if (token != null && token.length() > 0) {
        sb.append("&").append(token);
    }
    return sb.toString();
}
}

public static void close(Connection conn, InputStream is, OutputStream os) {
    if (os != null) {
        try {
            os.close();
        } catch (IOException e) {
        }
    }
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {
        }
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (IOException e) {
        }
    }
}

//Background listener class

class BackgroundApplication extends Application {  

    public BackgroundApplication() {
        // TODO Auto-generated constructor stub
    }
    public void setupBackgroundApplication(){

        MessageReadingThread messageReadingThread = new MessageReadingThread();
        messageReadingThread.start();

    }  

    private static class MessageReadingThread extends Thread { private boolean running;
        private ServerSocketConnection socket;
        private HttpServerConnection conn;
        private InputStream inputStream;
        private PushInputStream pushInputStream;

        public MessageReadingThread() {
            this.running = true;
        }

        public void run() {

             String url = "http://:" + Port;
             url += ";deviceside=false;ConnectionType=mds-public";
             if ((WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) && RadioInfo.areWAFsSupported(RadioInfo.WAF_WLAN)) {
                 url += ";interface=wifi";
                 }

            try {
                socket = (ServerSocketConnection) Connector.open( url );
            } catch( IOException ex ) {
                // can't open the port, probably taken by another application
                onListenError( ex );
            }

            while( running ) {
                try {
                    Object o = socket.acceptAndOpen();
                    conn = (HttpServerConnection) o;
                    inputStream = conn.openInputStream();
                    pushInputStream = new MDSPushInputStream( conn, inputStream );
                    PushMessageReader.process( pushInputStream, conn );
                } catch( Exception e ) {
                    if( running ) {
                      //  Logger.warn( "Failed to read push message, caused by " + e.getMessage() );
                        running = false;
                    }
                } finally {
                   // PushUtils.close( conn, pushInputStream, null );
                }
            }

          //  Logger.log( "Stopped listening for push messages" );
        }

        public void stopRunning() {
            running = false;
            //PushUtils.close( socket, null, null );
        }

        private void onListenError( final Exception ex ) {
           // Logger.warn( "Failed to open port, caused by " + ex );
          System.out.println(ex);
        }
    }

}
//push message reader class -

// HTTP header property that carries unique push message ID
    private static final String MESSAGE_ID_HEADER = "Push-Message-ID";
    // content type constant for text messages
    private static final String MESSAGE_TYPE_TEXT = "text";
    private static final int MESSAGE_ID_HISTORY_LENGTH = 10;
    private static String[] messageIdHistory = new String[MESSAGE_ID_HISTORY_LENGTH];
    private static byte historyIndex;

    private static byte[] buffer = new byte[15 * 1024];
public static void process(PushInputStream pis, Connection conn) {
        System.out.println("Reading incoming push message ...");

        try {

            HttpServerConnection httpConn;
            if (conn instanceof HttpServerConnection) {
                httpConn = (HttpServerConnection) conn;
            } else {
                throw new IllegalArgumentException("Can not process non-http pushes, expected HttpServerConnection but have "
                        + conn.getClass().getName());
            }

            String msgId = httpConn.getHeaderField(MESSAGE_ID_HEADER);
            String msgType = httpConn.getType();
            String encoding = httpConn.getEncoding();

            System.out.println("Message props: ID=" + msgId + ", Type=" + msgType + ", Encoding=" + encoding);


            boolean accept = true;
            if (!alreadyReceived(msgId)) {
                byte[] binaryData;

                if (msgId == null) {
                    msgId = String.valueOf(System.currentTimeMillis());
                }

                if (msgType == null) {
                    System.out.println("Message content type is NULL");
                    accept = false;
                } else if (msgType.indexOf(MESSAGE_TYPE_TEXT) >= 0) {
                    // a string
                    int size = pis.read(buffer);
                    binaryData = new byte[size];
                    System.arraycopy(buffer, 0, binaryData, 0, size);   

                    PushMessage message = new PushMessage(msgId, System.currentTimeMillis(), binaryData, true, true );
                    String text = new String( message.getData(), "UTF-8" );
                     try{
                            final Dialog screen = new Dialog(Dialog.D_OK_CANCEL, " "+text,
                                    Dialog.OK,
                                    //mImageGreen.getBitmap(),
                                    null, Manager.VERTICAL_SCROLL);
                            final UiEngine ui = Ui.getUiEngine();
                            Application.getApplication().invokeAndWait(new Runnable() {
                                public void run() {
                                    NotificationsManager.triggerImmediateEvent(0x749cb23a76c66e2dL, 0, null, null);
                                    ui.pushGlobalScreen(screen, 0, UiEngine.GLOBAL_QUEUE);

                                }
                            });
                            screen.setDialogClosedListener(new MyDialogClosedListener());
                            }
                            catch (Exception e) {
                                // TODO: handle exception
                            }


                    // TODO report message
                }  else {
                    System.out.println("Unknown message type " + msgType);
                    accept = false;
                }
            } else {
                System.out.println("Received duplicate message with ID " + msgId);
            }
            pis.accept();
        } catch (Exception e) {
            System.out.println("Failed to process push message: " + e);
        }
    }



private static boolean alreadyReceived(String id) {
        if (id == null) {
            return false;
        }

        if (Arrays.contains(messageIdHistory, id)) {
            return true;
        }

        // new ID, append to the history (oldest element will be eliminated)
        messageIdHistory[historyIndex++] = id;
        if (historyIndex >= MESSAGE_ID_HISTORY_LENGTH) {
            historyIndex = 0;
        }
        return false;
    }



public class PushMessage{

    private String id;
    private long timestamp;
    private byte[] data;
    private boolean textMesasge;
    private boolean unread;

    public PushMessage( String id, long timestamp, byte[] data, boolean textMesasge, boolean unread ) {
        super();
        this.id = id;
        this.timestamp = timestamp;
        this.data = data;
        this.textMesasge = textMesasge;
        this.unread = unread;
    }

    public String getId() {
        return id;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public byte[] getData() {
        return data;
    }

    public boolean isTextMesasge() {
        return textMesasge;
    }

    public boolean isUnread() {
        return unread;
    }

    public void setUnread( boolean unread ) {
        this.unread = unread;
    }

}

public class MyDialogClosedListener implements DialogClosedListener
    {

    public void dialogClosed(Dialog dialog, int choice)
    {
        if(dialog.equals(dialog))
        {
           if(choice == -1)
            {
                //Your code for Press OK
            }
            if(choice == 1)
            {
                //Your code for Press Cancel

            }
                   }
   }
}


Server sode PHP code is given Below -

ini_set('display_errors','1');
error_reporting(E_ALL);

    // APP ID provided by RIM
$appid = 'app id';
// Password provided by RIM
$password = 'password';
//Deliver before timestamp
$deliverbefore = gmdate('Y-m-d\TH:i:s\Z', strtotime('+time minutes'));

//An array of address must be in PIN format or "push_all"
$addresstosendto[] = 'your pin';

$addresses = '';
foreach ($addresstosendto as $value) {
$addresses .= '
';
}

// create a new cURL resource
$err = false;
$ch = curl_init();
$messageid = microtime(true);

$data = '--mPsbVQo0a68eIL3OAxnm'. "\r\n" .
'Content-Type: application/xml; charset=UTF-8' . "\r\n\r\n" .
'


'
. $addresses .
'
' . "\r\n" .
'--mPsbVQo0a68eIL3OAxnm' . "\r\n" .
'Content-Type: text/plain' . "\r\n" .
'Push-Message-ID: ' . $messageid . "\r\n\r\n" .
stripslashes('r') . "\r\n" .
'--mPsbVQo0a68eIL3OAxnm--' . "\n\r";

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "https://pushapi.eval.blackberry.com/mss/PD_pushRequest");//"https://cp2991.pushapi.eval.blackberry.com/mss/PD_pushRequest"
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Hallgren Networks BB Push Server/1.0");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $appid . ':' . $password);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: multipart/related; boundary=mPsbVQo0a68eIL3OAxnm; type=application/xml", "Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Connection: keep-alive"));

// grab URL and pass it to the browser
echo $xmldata = curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);

//Start parsing response into XML data that we can read and output
$p = xml_parser_create();
xml_parse_into_struct($p, $xmldata, $vals);
$errorcode = xml_get_error_code($p);
if ($errorcode > 0) {
echo xml_error_string($errorcode);
$err = true;
}
xml_parser_free($p);

echo 'Our PUSH-ID: ' . $messageid . "
\n";
if (!$err && $vals[1]['tag'] == 'PUSH-RESPONSE') {
echo 'PUSH-ID: ' . $vals[1]['attributes']['PUSH-ID'] . "
\n";
echo 'REPLY-TIME: ' . $vals[1]['attributes']['REPLY-TIME'] . "
\n";
echo 'Response CODE: ' . $vals[2]['attributes']['CODE'] . "
\n";
echo 'Response DESC: ' . $vals[2]['attributes']['DESC'] . "
\n";
} else {
echo 'An error has occured
' . "\n";
echo 'Error CODE: ' . $vals[1]['attributes']['CODE'] . "
\n";
echo 'Error DESC: ' . $vals[1]['attributes']['DESC'] . "
\n";
}

?>