0

私はブラックベリーが初めてです。私は今アプリケーションを作成しています。私の要件は、カメラが自動的に呼び出されたときに画像がキャプチャされることです。ブラックベリーで可能ですか。私はこのコードを使用していますが、すべてが機能しますが、画像を自動的にキャプチャすることはできません。コードで何を変更するかを提案してください。アプリケーションで機能します。

 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);
   }



}
4

2 に答える 2

3

写真を撮るために従来のアプローチを使用しています。これが、使用すべきではない理由です。

  • アプリケーションを終了して外部アプリケーション (カメラ アプリ) を呼び出すためです。
  • カメラの設定を制御できないためです。
  • あなたが投稿した FileJournalListener コードは、RIM がチュートリアルで公開したコードであり、一部の OS およびシミュレーターで問題が発生するためです (イベントが異なる順序で到着するか、まったく到着しない、画像保存時に複数のイベントが発生するなど)。
  • カメラアプリを閉じる方法がなく、ハックキーインジェクション方式に頼らなければならないためです。

そのため、4.6 を超える OS の場合、MMAPI を使用してアプリ内でスナップショットを取得できます。これは推奨される方法であり、レガシー OS 用にプログラミングしている場合を除き、投稿した方法を使用しないでください。このチュートリアルを確認してください。また、5.0 以降では、AMMAPI を使用して一部のカメラ設定を制御できます。すべてのコントロールが実装されているわけではありませんが、ほとんどの基本的なコントロール (ズーム、フォーカス、フラッシュなど) は最新の OS でサポートされています。最新の BlackBerry JDE に含まれているCameraDemo VideoRecordingDemo サンプルを確認してください。

于 2012-04-18T07:33:43.210 に答える
2

このコードを試すと、自動的に写真が撮られます。

import java.io.OutputStream;
import java.util.Timer;
import java.util.TimerTask;

import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.media.Player;
import javax.microedition.media.control.VideoControl;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.container.MainScreen;

public class ImageCaptureDemo extends UiApplication
{
public static void main(String[] args)
{
    ImageCaptureDemo app = new ImageCaptureDemo();
    app.enterEventDispatcher();
}

public ImageCaptureDemo()
{
    pushScreen(new ImageCaptureDemoScreen());
}   

class ImageCaptureDemoScreen extends MainScreen
{   
    Timer timer ;
    Player _p;
    VideoControl _videoControl;    

    public ImageCaptureDemoScreen()
    {
        try 
        {
            _p = javax.microedition.media.Manager.createPlayer("capture://video?encoding=jpeg&width=320&height=240");
            _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();

                /*EnhancedFocusControl efc = (EnhancedFocusControl)p.getControl("net.rim.device.api.amms.control.camera.EnhancedFocusControl");
                efc.startAutoFocus();*/

                if(videoField != null)
                {
                    add(videoField);
                }
            } 
        }
        catch(Exception e)
        {
            Dialog.alert(e.toString());
        }


        timer = new Timer();
        timer.schedule(new CountDown(), 3000);


    }

    public class CountDown extends TimerTask {
      public void run() {
         DismissThread dThread = new DismissThread();
         invokeLater(dThread);
      }
   }
 public void dismiss() {
      timer.cancel();
     invokeAction(ACTION_INVOKE);
    _videoControl.setVisible(false);

   }
   public class DismissThread implements Runnable {
          public void run() {
             dismiss();
          }
       }



    protected boolean invokeAction(int action)
    {
        boolean handled = super.invokeAction(action); 

        if(!handled)
        {
            if(action == ACTION_INVOKE)
            {   
                try
                {                      
                    byte[] rawImage = _videoControl.getSnapshot(null);  


                    FileConnection conn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/pictures/"+System.currentTimeMillis()+".jpeg", Connector.READ_WRITE);
                    conn.create();
                    OutputStream out = conn.openOutputStream();
                    out.write(rawImage);
                    out.flush();
                    out.close();
                    conn.close();

                    /*

                    Bitmap image = Bitmap.createBitmapFromBytes(rawImage, 0, rawImage.length, 5);
                    BitmapField bitmapField = new BitmapField();
                    bitmapField.setBitmap(image);
                    this.add(bitmapField);
              */

                }
                catch(Exception e)
                {
                    Dialog.alert(e.toString());
                }
            }
        }           
        return handled;                
    }  
}   
}
于 2012-04-18T07:22:04.953 に答える