1

ユーザーが写真を撮れる画面を作ろうとしています。この写真はデータベースに移動します。問題は、私は複数のアプローチを試しましたが、すべてのアプローチで PictureCallback を使用する必要があることです。しかし、PictureCallback の onPictureMethod は、何があっても呼び出されません。

あれこれ調べてみたのですが、まだ動けません。

編集: Android 2.2 (API 8) の使用

編集されたコード:

package touchcare.idealogix.android;

//imports

public class CameraActivityTest extends Activity implements SurfaceHolder.Callback
{
private SurfaceView surfaceCamera;
private SurfaceHolder holderCamera;
private Camera camera;
private Button btnCapture;
private PictureCallback mPictureJpg;
private PictureCallback mPictureRaw;
private ShutterCallback shutterCallback;

@Override public void onCreate(Bundle bundle){
    super.onCreate(bundle);
    setContentView(R.layout.layout_camera);

    Log.d("PICTURE", "ACTIVITY START");

    surfaceCamera = (SurfaceView) findViewById(R.id.surfaceCamera);
    btnCapture = (Button) findViewById(R.id.btnCapture);
    holderCamera =  surfaceCamera.getHolder();

    holderCamera.addCallback(this);
    holderCamera.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    shutterCallback = new ShutterCallback() 
    {   
        @Override
        public void onShutter() 
        {
            //DONOTHING
        }
    };

    mPictureRaw = new PictureCallback() 
    {   
        @Override
        public void onPictureTaken(byte[] data, Camera camera)
        {
            //DONOTHING
        }
    };

    mPictureJpg = new PictureCallback()
    {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) 
        {
            Log.d("PICTURE", "ON PICTURE TAKEN START");

            Intent intent = getIntent();

            final boolean beds = intent.getExtras().getBoolean(Main.BEDS, false);
            final boolean nurse = intent.getExtras().getBoolean(Main.NURSE, false);
            final int position = intent.getExtras().getInt(Main.POSITION, 0);

            if(beds)
            {
                BedroomDataSource bedDs = new BedroomDataSource(CameraActivityTest.this);
                String where = SQLiteBedroomHelper.COLUMN_UID + "=" + AppData.getBedrooms().get(position).getUid();
                bedDs.open();
                bedDs.updateBedroom(where, null, null, null, null, null, null, data);
                bedDs.close();
                Log.d("PICTURE", "BEDS BOOLEAN");
                AppData.getBedrooms().get(position).setImage(data);
            }else if(nurse)
            {

            }

            Log.d("PICTURE", "ON PICTURE TAKEN END");

            finish();
        }
    };

    btnCapture.setOnClickListener(new View.OnClickListener() 
    {   
        @Override
        public void onClick(View arg0) 
        {               
            camera.takePicture(shutterCallback, mPictureRaw, mPictureJpg);
        }
    });
}

@Override public void surfaceCreated(SurfaceHolder holder)
{
    camera = Camera.open();

    Camera.Parameters params = camera.getParameters();      

    params.setPreviewSize(holder.getSurfaceFrame().width(), holder.getSurfaceFrame().height());
    params.setPictureSize(32, 32);
    params.setJpegQuality(100);

    camera.setParameters(params);

    try
    {
        camera.setPreviewDisplay(holder);
    }catch(IOException ex){
        Log.d("PICTURE", "PREVIEW EXCEPTION");
    }

    camera.startPreview();

    Log.d("PICTURE", "SURFACE CREATED");
}

@Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
    Log.d("PICTURE", "SURFACE CHANGED");
}

@Override public void surfaceDestroyed(SurfaceHolder holder)
{
    camera.stopPreview();

    camera.release();

    Log.d("PICTURE", "SURFACE DESTROYED");
}
}

ありがとう。

編集:いくつかの写真が撮影され、コールバックに到達したようです。データベースは写真を取得し、ビットマップで問題なくロードします。しかし、何を撮っているのかによっては、コールバックが届かないことがあります。小さくて単純なものは、100% の確率でコールバックが実行されます。

4

1 に答える 1

-1

コールバック mPicture を作成し、それをコールバックとして設定しないようです。私は画像を使用したことがないので、どこに設定すればよいかアドバイスできませんが、コールバックを呼び出すにはコールバックを登録する必要があることを知っている限り、それを定義するだけでは何の役にも立ちません。

于 2012-04-24T15:00:15.537 に答える