0

問題...サードパーティのアプリからカメラアプリにアクセスした後、写真を撮ります。次に、メニューに移動し、メニュー項目(MENUITEM_CAMERA_PREVIEW)を追加しました。メニュー項目は機能を実行する必要があります。機能が完了したら、カメラアプリを開いてから、カメラを閉じて前の画面を開きます。

私はこのスレッドと同じ問題に直面しています: http ://supportforums.blackberry.com/t5/Java-Development/How-to-exit-camera-app-properly/mp/1924127#M209092

誰かが解決策を理解していると教えてもらえますか?そうでない場合は、解決策を知っているかもしれません。あなたの助けをいただければ幸いです。

私はこれらの投稿を見ました: 写真を撮った後、プログラムでブラックベリーのデフォルトのカメラを閉じる

http://supportforums.blackberry.com/t5/Java-Development/Unable-to-close-camera-using-EventInjector-for-touch-screen/mp/785247#M143879

プログラムで別のアプリケーションからブラックベリーアプリケーションを終了するにはどうすればよいですか?

しかし、サードパーティのアプリケーションからカメラアプリケーションを終了するために何を追加する必要があるのか​​わかりません。

誰かが私が理解するのを手伝ってくれませんか....

4

2 に答える 2

0

これは私が最終的に使用したコードであり、はるかに優れています。

public class MyScreen extends MainScreen{
Player _p;
VideoControl _videoControl;  
FileConnection fileconn;
String PATH;
String GetfileName;
LabelField GetPhotofileName = new LabelField("",LabelField.FOCUSABLE){
    protected boolean navigationClick(int status, int time){
        Dialog.alert("Clicked");
    return true;
    }
 };

 public static boolean SdcardAvailabulity() {
     String root = null;
     Enumeration e = FileSystemRegistry.listRoots();
     while (e.hasMoreElements()) {
         root = (String) e.nextElement();
         if( root.equalsIgnoreCase("sdcard/") ) {
             return true;
         }else if( root.equalsIgnoreCase("store/") ) {
             return false;
         }
     }
     class MySDListener implements FileSystemListener {
         public void rootChanged(int state, String rootName) {
             if( state == ROOT_ADDED ) {
                 if( rootName.equalsIgnoreCase("sdcard/") ) {
                 }
             } else if( state == ROOT_REMOVED ) {
             }
         }
     }
     return true;
 }
 protected boolean invokeAction(int action){
     boolean handled = super.invokeAction(action); 
     if(SdcardAvailabulity()){
           PATH = System.getProperty("fileconn.dir.memorycard.photos")+"Image_"+System.currentTimeMillis()+".jpg";//here "str" having the current Date and Time;
     } else {
         PATH = System.getProperty("fileconn.dir.photos")+"Image_"+System.currentTimeMillis()+".jpg"; 
     }
     if(!handled){
         if(action == ACTION_INVOKE){   
             try{                      
                 byte[] rawImage = _videoControl.getSnapshot(null);
                 fileconn=(FileConnection)Connector.open(PATH);
                 if(fileconn.exists()){
                    fileconn.delete();
                 }
                 fileconn.create();
                 OutputStream os=fileconn.openOutputStream();
                 os.write(rawImage);
                 GetfileName =fileconn.getName();
                 fileconn.close();
                 os.close();
                 Status.show("Image is Captured",200);
                 GetPhotofileName.setText(GetfileName);
                 if(_p!=null)
                    _p.close();          
             }catch(Exception e){
                if(_p!=null){
                    _p.close();
                 }
                 if(fileconn!=null){
                    try{
                         fileconn.close();
                     }catch (IOException e1){ 
                     }
                 }                    
             }
         }
      }           
      return handled;                
  }
 public MyScreen(){
     setTitle("Camera App");
     try{
        _p = javax.microedition.media.Manager.createPlayer("capture://video?encoding=jpeg&width=1024&height=768");
        _p.realize();
        _videoControl = (VideoControl) _p.getControl("VideoControl");
        if (_videoControl != null){
            Field videoField = (Field) _videoControl.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field");
            _videoControl.setDisplayFullScreen(true);
             _videoControl.setVisible(true);
            _p.start();
            if(videoField != null){
                add(videoField);
            }
        } 
     }catch(Exception e){
         if(_p!=null) {
             _p.close();
         }
         Dialog.alert(e.toString());
     }   
     add(GetPhotofileName);
 }
}
于 2012-11-07T11:56:00.703 に答える
0

アプリからカメラアプリを閉じようとするのは難しいです。私はそれを行うためのきれいな方法を知りませんが、私はそれをこのように行いました。

基本的に、アプリは許可をリクエストする必要があります

ApplicationPermissions.PERMISSION_INPUT_SIMULATION

キーストロークを注入します。次に、 ESCキーの押下をシミュレートします。これは、ユーザーがカメラアプリを手動で閉じる/閉じる方法です。この手法の信頼性を高めるには、コードに(条件付きで)ESCキーを複数回挿入させる必要があります。

これをより信頼できるものにする方法は、カメラアプリを起動するScreenに、アプリにが表示されていることです。次に、その画面を監視して、いつ再び露出されたかを確認します。露出していることを検出すると、カメラを閉じるのに十分なESCキーシーケンスを挿入したに違いないと思います(または、ユーザーが自分でESCを押して、アプリに戻ることができたと思います)。

更新:以下のコメントごとに、このソリューションで使用した追加のコードをいくつか示します。これは、その下にある画面の1つの露出状態を監視することにより、適切なカメラの閉鎖を検出するためのものです。

private boolean _isExposed = false;

protected void onExposed() {
    super.onExposed();
    _isExposed = true;
}

protected void onObscured() {
    super.onObscured();
    _isExposed = false;
}

public boolean isExposed() {
    return _isExposed;
}

_isExposed必要に応じて、最初にカメラアプリを開くために使用する方法でfalseに設定することもできます。

于 2012-09-28T11:17:16.267 に答える