java - 黑莓手机可以自动拍照吗

标签 java blackberry blackberry-simulator blackberry-eclipse-plugin

我是黑莓新手。我现在创建应用程序,我的要求是当相机被调用时自动捕获图片。在黑莓中是否可能。 我正在使用此代码,一切正常,但不能自动捕获图片,请建议我对代码进行哪些更改,它适用于我的应用程序。

 public class Test extends MainScreen  implements FileSystemJournalListener {
    long _lastUSN;
    ButtonField btnTakePhoto;
    String capturedImgPath = "";
    VideoControl videoControl;
    Timer objTimer;
    Player player;


    public Test()
    {
        super();
        btnTakePhoto    =   new ButtonField("Take Picture",ButtonField.VCENTER|ButtonField.BOTTOM);
        btnTakePhoto.setChangeListener(TakePictureListener);
        HorizontalFieldManager hfm=new HorizontalFieldManager();    
        hfm.add(btnTakePhoto);
        add(hfm);

        System.out.println("Inside Construct");
        UiApplication.getUiApplication().addFileSystemJournalListener(this);
        _lastUSN = FileSystemJournal.getNextUSN();
        this.setTitle("Camera Class");
    }



    FieldChangeListener TakePictureListener = new FieldChangeListener(){

        public void fieldChanged(Field field, int context) {
            System.out.println("Inside fieldChanged");
            doTakePicture();
        }
    };
    public void doTakePicture(){
        try
        {

            System.out.println("Inside doTakePicture");
          Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA,new CameraArguments());
          player = javax.microedition.media.Manager.createPlayer("capture://video");
          player.realize();

          videoControl = (VideoControl) player.getControl("VideoControl");
          player.start();
          if(videoControl!=null)
          {
              Field videoField = (Field) videoControl.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field");


              videoControl.setDisplayFullScreen(true);
              videoControl.setVisible(true);
               add(videoField);
//            System.out.println("videoControl=="+videoControl);
//            String imagetype = "encoding=jpeg&width=1024&height=768&quality=fine";    
//           
//            byte[] snapshot = videoControl.getSnapshot(imagetype);
//            Bitmap image = Bitmap.createBitmapFromBytes(snapshot, 0, snapshot.length, 5);
//            System.out.println("snapshot=="+snapshot);
//            System.out.println("image=="+image);
//            BitmapField bitmapField = new BitmapField();
//            bitmapField.setBitmap(image);
//            this.add(bitmapField);
//            if(videoField != null)
//              {
//                  add(videoField);
//                 
//              }

          }



        }



    catch(Exception ex)
     {
        System.out.println(ex);

     }
    }

    public boolean invokeAction(int action)
    {
        System.out.println("Action=="+action);
    boolean handled = super.invokeAction(action); 
    //handled=true;
    System.out.println("handled=="+handled);
    System.out.println("Inside Invoke Camera");

    if(!handled)
    {    
        System.out.println("Inside First If Blog"); 
        if(action == ACTION_INVOKE)
        {   
            System.out.println("Inside Second If Blog");
           try
            {    
                System.out.println("If Blog of invoke Action");


                System.out.println("videoControl11=="+videoControl);
              String imagetype = "encoding=jpeg&width=1024&height=768&quality=fine";    
              byte[] snapshot = videoControl.getSnapshot(imagetype);
              Bitmap image = Bitmap.createBitmapFromBytes(snapshot, 0, snapshot.length, 5);
              System.out.println("snapshot=="+snapshot);
              System.out.println("image=="+image);
              BitmapField bitmapField = new BitmapField();
              bitmapField.setBitmap(image);
              this.add(bitmapField);


           }
            catch(Exception e)
            {
                Dialog.alert(e.toString());
            }
     } 


    }
    return handled;                
}  



    public void fileJournalChanged() 
    {
        System.out.println("Inside fileJournalChanged");
        long nextUSN = FileSystemJournal.getNextUSN();
        String msg = null;
        String path = null;
        for (long lookUSN = nextUSN - 1; lookUSN >= _lastUSN && msg == null; --lookUSN) 
        {
            FileSystemJournalEntry entry = FileSystemJournal.getEntry(lookUSN);

            if (entry == null) 
            { 
                break;
            }

             path = entry.getPath();
             System.out.println("Path=="+path);

            if (path != null)               
            {
             if (path.endsWith("png") || path.endsWith("jpg") || path.endsWith("bmp") || path.endsWith("gif") ){    
                switch (entry.getEvent()) 
                {


                    case FileSystemJournalEntry.FILE_ADDED:
                        System.out.println("Inside FILE_ADDED");
                        msg = "File was added.";
                        break;

                    case FileSystemJournalEntry.FILE_DELETED:
                        System.out.println("Inside FILE_DELETED");
                        msg = "File was deleted.";
                        break;
                }
             } 
            }
        }
        _lastUSN = nextUSN;

        if ( msg != null ) 
        {
            Dialog.alert(msg);
            capturedImgPath =   path;
            closeCamera();
        }
    }
   private void closeCamera()
    {
        int menuOrder =6;
        System.out.println("Inside Close Camera");
        EventInjector.invokeEvent(new EventInjector.KeyCodeEvent(EventInjector.KeyCodeEvent.KEY_DOWN, (char)Keypad.KEY_MENU, KeypadListener.STATUS_NOT_FROM_KEYPAD, 0));
        EventInjector.invokeEvent(new EventInjector.TrackwheelEvent(EventInjector.TrackwheelEvent.THUMB_ROLL_DOWN, menuOrder, KeypadListener.STATUS_NOT_FROM_KEYPAD));
        EventInjector.invokeEvent(new EventInjector.TrackwheelEvent(EventInjector.TrackwheelEvent.THUMB_CLICK, 1, KeypadListener.STATUS_NOT_FROM_KEYPAD));
        Dialog.alert("The captured Image path is "+capturedImgPath);
   }



}

最佳答案

您正在使用传统方法拍照。这就是为什么你不应该使用它:

  • 因为您要退出应用程序以调用外部应用程序(相机应用程序)。
  • 因为您无法控制相机设置。
  • 因为您发布的 FileJournalListener 代码(即 RIM 在其教程中发布的代码)在某些操作系统和模拟器上会出现问题(事件以不同顺序到达或根本未到达、图像保存时出现多个事件等)。
  • 因为没有办法关闭相机应用,你必须求助于 hacky key 注入(inject)方法。

现在,对于操作系统 > 4.6,您可以使用 MMAPI 在应用程序内拍摄快照。这是推荐的方法,除非您正在为旧操作系统进行编程,否则不应使用您发布的方法。检查this tutorial 。此外,从 5.0 开始,您可以使用 AMMAPI 来控制某些相机设置。 Not all controls are implemented ,但最新的操作系统支持大多数基本功能(缩放、对焦、闪光灯等)。检查最新 BlackBerry JDE 中包含的 CameraDemo VideoRecordingDemo 示例。

关于java - 黑莓手机可以自动拍照吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10203531/

相关文章:

java - 在黑莓中将日期转换为毫秒

testing - 哪个黑莓操作系统应该是测试设备的最低要求?

java - 单击按钮外部区域时激活按钮(Java/Blackberry 应用程序)

java - getSystemClipboard 因 headless 异常而失败

java - 获取指向持久对象的指针

java - Http java文件下载问题

html - BlackBerry WebWorks 应用程序滚动

java - 是否有可能(如何)在 Java 运行时获取方法引用的名称?

android - 使用移动版本在颠覆中分支的策略

java - Blackberry Touch 事件检测触摸位置上的对象