1

我有一个用来用相机拍照的surfaceview类,我想知道如何将这个拍摄的图像发回调用它的类。我尝试通过不确定我是否正确实施的意图将图像发回。我的主类 onActivityResult 如下:

//WHAT TO DO WITH RESULT DATA FROM CAMERA
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (resultCode == CAMERA_PIC_REQUEST && picCount < 5) {  
        //curPic = (Bitmap) data.getExtras().get("data");  
        curPic = (Bitmap) data.getExtras().get("files");
        ImageView images = new ImageView(getApplicationContext());

        //SET PICTURE TO NEW VIEW AND ANIMATE INTO POSITION
        images.setImageBitmap(curPic);


        //ADD TO PREVPICS LAYOUT
        images.setPadding(3, 0, 0, 0);
        showCase.addView(images);
        badge.setImageBitmap(curPic);

        //ADDS CLICK LISTENER TO EACH ELEMENT AND SETS ID
        try{    
            Log.i("AFTER TAKING PIC", "PICCOUNT IS NOW:"+picCount);
            showCase.getChildAt(picCount).setId(picCount);
            images.setId(picCount);
            showCase.getChildAt(picCount).setOnClickListener(btnListener);              
            images.setTag("pics");

            //SAVE PITCTURE
            savePic(curPic);

            previewImages(picCount);
        }catch(Exception e){Log.e("ERROR TAKING PIC", e.toString());}

        }else
            Toast.makeText(getApplicationContext(), "Unable to add more pictures", Toast.LENGTH_SHORT).show();

}  

而surfaceview类如下:

public class SecondCamera extends Activity implements SurfaceHolder.Callback {

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_cam);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    controlInflater = LayoutInflater.from(getBaseContext());
    /*
     * View viewControl = controlInflater.inflate(R.layout.control, null);
     * LayoutParams layoutParamsControl = new
     * LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
     * this.addContentView(viewControl, layoutParamsControl);
     */

    Button buttonTakePicture = (Button) findViewById(R.id.button1);
    buttonTakePicture.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            camera.takePicture(myShutterCallback, myPictureCallback_RAW,
                    myPictureCallback_JPG);
        }
    });
}

ShutterCallback myShutterCallback = new ShutterCallback() {

    @Override
    public void onShutter() {

    }
};

PictureCallback myPictureCallback_RAW = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {

    }
};

PictureCallback myPictureCallback_JPG = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] rawImg, Camera arg1) {
        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(rawImg, 0, rawImg.length);

        try {

            Intent cameraIntent = new Intent();
            cameraIntent.putExtra("files", bitmapPicture);
            setResult(123, cameraIntent);
            finish();
        } catch (Exception e) {
            Log.e("IMAGE CONVERT", e.toString());
        }
    }
};

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    if (previewing) {
        camera.stopPreview();
        previewing = false;
    }

    if (camera != null) {
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
            previewing = true;
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {

    camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}

}

4

1 回答 1

0

AFAIK,你不能直接通过Bitmapa Intent。我想你想把它保存在某个地方,比如本地存储。您可以使用File方法保存它。您可以将该文件路径作为 aString传递,Intent并使用它在以前的Activity.

另一种选择可能是将其存储在 an 中ArrayList并将其作为Serializable

于 2013-04-25T03:29:51.437 回答