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

尝试从您的应用程序中关闭相机应用程序很棘手。我不知道一种干净的方法,但我已经这样做了

基本上,您的应用需要请求权限

ApplicationPermissions.PERMISSION_INPUT_SIMULATION

注入击键。然后它将模拟ESC键的按下,这是用户将/可以手动关闭相机应用程序的方式。为了使这种技术更可靠,我需要让代码(有条件地)多次注入 ESC 键。

我让这个更可靠的方法是,在我启动相机应用程序之前Screen,我的应用程序中有一个正在显示的内容。然后我监视该屏幕以查看它何时再次曝光。当我检测到它已经暴露时,我假设我必须注入足够的ESC 键序列来关闭相机(或者我猜用户可能自己按下了ESC来返回我的应用程序)。

更新:根据下面的评论,这是我在此解决方案中使用的一些附加代码,通过监视下面我的一个屏幕的暴露状态来检测正确的相机关闭:

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 回答
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 回答