Android Image Callback Data Zero

I use the camera code for Android after I take the picture, the byte [] of the imageData parameter is null, I don’t know why.

package com.pictures; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.graphics.Bitmap.CompressFormat; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; public class CamaraView extends Activity implements SurfaceHolder.Callback, OnClickListener { static final int FOTO_MODE = 0; private static final String TAG = "CameraTest"; Camera mCamera; boolean mPreviewRunning = false; private Context mContext = this; public void onCreate(Bundle icicle) { super.onCreate(icicle); Log.e(TAG, "onCreate"); Bundle extras = getIntent().getExtras(); getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); mSurfaceView.setOnClickListener(this); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { if (imageData != null) { Intent mIntent = new Intent(); StoreByteImage(mContext, imageData, 50, "ImageName"); mCamera.startPreview(); setResult(FOTO_MODE, mIntent); finish(); } } }; protected void onResume() { Log.e(TAG, "onResume"); super.onResume(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } protected void onStop() { Log.e(TAG, "onStop"); super.onStop(); } public void surfaceCreated(SurfaceHolder holder) { Log.e(TAG, "surfaceCreated"); mCamera = Camera.open(); } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Log.e(TAG, "surfaceChanged"); // XXX stopPreview() will crash if preview is not running if (mPreviewRunning) { mCamera.stopPreview(); } Camera.Parameters p = mCamera.getParameters(); p.setPreviewSize(w, h); mCamera.setParameters(p); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("Caught exception in surface chagned"); e.printStackTrace(); } mCamera.startPreview(); mPreviewRunning = true; } public void surfaceDestroyed(SurfaceHolder holder) { Log.e(TAG, "surfaceDestroyed"); mCamera.stopPreview(); mPreviewRunning = false; mCamera.release(); } private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; public void onClick(View arg0) { mCamera.takePicture(null, mPictureCallback, mPictureCallback); } public static boolean StoreByteImage(Context mContext, byte[] imageData, int quality, String expName) { File sdImageMainDirectory = new File("/sdcard"); FileOutputStream fileOutputStream = null; String nameFile; try { BitmapFactory.Options options=new BitmapFactory.Options(); options.inSampleSize = 5; Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0, imageData.length,options); fileOutputStream = new FileOutputStream( sdImageMainDirectory.toString() +"/image.jpg"); BufferedOutputStream bos = new BufferedOutputStream( fileOutputStream); myImage.compress(CompressFormat.JPEG, quality, bos); bos.flush(); bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } } 
+7
source share
1 answer

Ok, I see a problem. You reuse image callback for raw and jpeg callbacks. ANd from javadoc you can read:

Starts asynchronous image capture. The camera service will initiate a series of callbacks for the application as image capture progresses. The shutter callback occurs after image capture. This can be used to trigger sound so that the user knows that the image has been captured. Raw callback occurs when raw image data is available (NOTE: the data will be empty if there is no raw image callback buffer or the raw image callback buffer is large enough to store the raw image). The postview callback occurs when a scaled, fully processed image is available for viewing (NOTE: not all hardware supports this). The jpeg callback occurs when a compressed image is available. If the application does not need a specific callback, you can pass zero instead of the callback method.

So, if it was called as a raw callback, the data may be empty. If you don't like the raw data, just use:

  mCamera.takePicture(null, null, mPictureCallback); 
+9
source

All Articles