2010-02-22 111 views

回答

3

我們必須:

  • 開始通話
  • 保持通話
  • 開始新的呼叫
  • 加入會議 ...

開始呼叫看到API從Blackberry - make a call from native address book
沒有API保存和加入,但我們可以使用Blackberry - run menu item from dialer Phone App技術
爲了使應用程序屏幕的背面的前景,我們可以使用代碼Blackberry - Create an application which will lock another application event

全碼:

class Scr extends MainScreen implements PhoneListener { 
    private static final String STR_MODULE_NAME = "SOConferenceCall"; 
    EditField mPhoneNumber = new EditField("phone number: ", "12345"); 
    boolean mConnected = false; 
    Vector mPhoneCalls = new Vector(); 

    public Scr() { 
     Phone.addPhoneListener(this); 
     add(mPhoneNumber); 
    } 

    protected void makeMenu(Menu menu, int instance) { 
     super.makeMenu(menu, instance); 

     if (isCalling()) { 
      menu.add(new MenuItem("add to conference", 0, 0) { 
       public void run() { 
        holdActiveCall(); 
        makeCall(mPhoneNumber.getText()); 
       } 
      }); 
     } else { 
      menu.add(new MenuItem("call", 0, 0) { 
       public void run() { 
        makeCall(mPhoneNumber.getText()); 
       } 
      }); 
     } 
    } 

    private void holdActiveCall() { 
     runMenuItem("Hold"); 
    } 

    private void joinCalls() { 
     runMenuItem("Join Conference"); 
    } 

    private void makeCall(String number) { 
     PhoneArguments call = new PhoneArguments(PhoneArguments.ARG_CALL, 
       number); 
     Invoke.invokeApplication(Invoke.APP_TYPE_PHONE, call); 
    } 

    private void runMenuItem(String menuItemText) { 
     Screen screen = Ui.getUiEngine().getActiveScreen(); 
     Menu menu = screen.getMenu(0); 
     for (int i = 0, cnt = menu.getSize(); i < cnt; i++) 
      if (menu.getItem(i).toString().equalsIgnoreCase(menuItemText)) 
       menu.getItem(i).run(); 
    } 

    protected int switchToForeground() { 
     int id = -1; 
     ApplicationManager appMan 
      = ApplicationManager.getApplicationManager(); 
     ApplicationDescriptor appDes[] 
      = appMan.getVisibleApplications(); 
     for (int i = 0; i < appDes.length; i++) { 
      Sreing name = appDes[i].getModuleName(); 
      if (name.equalsIgnoreCase(STR_MODULE_NAME)) { 
       id = appMan.getProcessId(appDes[i]); 
       appMan.requestForeground(id); 
       // give a time to foreground application 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       break; 
      } 
     } 
     return id; 
    } 

    private boolean isCalling() { 
     return mConnected; 
    } 

    public void callAdded(int callId) { 
     switchToForeground(); 
    } 

    public void callAnswered(int callId) { 
     switchToForeground(); 
    } 

    public void callConferenceCallEstablished(int callId) { 
     switchToForeground(); 
    } 

    public void callConnected(int callId) { 
     if (mPhoneCalls.size() == 0) 
      mConnected = true; 
     else 
      joinCalls(); 
     mPhoneCalls.addElement(Phone.getCall(callId)); 
     switchToForeground(); 

    } 

    public void callDirectConnectConnected(int callId) { 
     switchToForeground(); 
    } 

    public void callDirectConnectDisconnected(int callId) { 
     switchToForeground(); 
    } 

    public void callDisconnected(int callId) { 
     mPhoneCalls.removeElement(Phone.getCall(callId)); 
     if (mPhoneCalls.size() == 0) 
      mConnected = false; 
     switchToForeground(); 
    } 

    public void callEndedByUser(int callId) { 
     switchToForeground(); 
    } 

    public void callFailed(int callId, int reason) { 
     switchToForeground(); 
    } 

    public void callHeld(int callId) { 
     switchToForeground(); 
    } 

    public void callIncoming(int callId) { 
     switchToForeground(); 
    } 

    public void callInitiated(int callid) { 
     switchToForeground(); 
    } 

    public void callRemoved(int callId) { 
     switchToForeground(); 
    } 

    public void callResumed(int callId) { 
     switchToForeground(); 
    } 

    public void callWaiting(int callid) { 
     switchToForeground(); 
    } 

    public void conferenceCallDisconnected(int callId) { 
     switchToForeground(); 
    } 
}