1

在我的应用程序中,我使用服务自动捕获图像。

从我的服务中,我正在打开相机活动。

相机活动

public class CameraActivity extends Activity {

private static final String TAG = "CameraDemo";
SharedPreferences pref;

CameraPreview preview;
Button click;
// enter email adress from where the email will be sent
String fromPassWord;
int cameraType;
private static final int FRONT_CAMERA = 0;
private static final int BACK_CAMERA = 1;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);
    cameraType = getIntent().getIntExtra("cameraType",BACK_CAMERA);

    preview = new CameraPreview(this,cameraType);
    ((FrameLayout) findViewById(com.abc.xyz.R.id.preview)).addView(preview);
     handler.sendEmptyMessageDelayed(0, 100);
     Log.d(TAG, "onCreate'd");
}

Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        try{
            if(preview.camera != null ){ 
                 preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);    
            }else{
                finish();                   
            }
        }catch (Exception e) {
            // TODO: handle exception
            finish();                   
        }
    };
};

ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {
        Log.d(TAG, "onShutter'd");
        Log.v(TAG, "onShutter'd");
    }
};

PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d(TAG, "onPictureTaken - raw");
        Log.v(TAG, "onPictureTaken - raw");
    }
};

PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        try {
            //my method for storing image
            StoreByteImage(data, 75, "ImageName");
            Log.v("on picture taken", "picture callback");
        } catch (Exception e) {
            Log.d(TAG, "Exception--------------------1");
            e.printStackTrace();
        }
        finish();
    }
};

}

CameraPreview.java

class CameraPreview extends SurfaceView implements SurfaceHolder.Callback{

private static final String TAG = "Preview";
SurfaceHolder mHolder;
public Camera camera;
int cameraType;
Context _context;
private static final int FRONT_CAMERA   = 0;
private static final int BACK_CAMERA    = 1;
//SurfaceHolder controls the surface size and format, edit the pixels in the surface, and monitor changes to the surface
CameraPreview(Context context, int type){
    super(context);
    //Return the SurfaceHolder providing access and control over this SurfaceView's underlying surface
    mHolder = getHolder();
    //Add a callback interface to this holder
    mHolder.addCallback(this);
    //Set the surface type
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    this.cameraType =   type;
    _context    =   context;
}

//Create a surface
public void surfaceCreated(SurfaceHolder sHolder){

    if(cameraType == FRONT_CAMERA){
        try{
            camera  =   openFrontFacingCameraGingerbread();  //method to open camera...
            Log.v("cameraFornt", "value"+camera);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    }else{
        //do nothing
    }
    if(camera == null)
        return;

    try{
        camera.setPreviewDisplay(sHolder);

        //Installs a callback to be invoked for every preview frame in addition to displaying them on the screen
        camera.setOneShotPreviewCallback(new PreviewCallback(){

            //Called as preview frames are displayed
            public void onPreviewFrame(byte[] data, Camera arg1){

                CameraPreview.this.invalidate();
            }
        });
    } catch (Exception e){
        e.printStackTrace();
    }
}

//called immediately before a surface is being destroyed
public void surfaceDestroyed(SurfaceHolder sHolder){
    if(camera == null){
        return;
    }
    Log.v("Surface dESTroyed ","Camera Preview");
    camera.release();

    }
    Log.v("Camera",""+camera);
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
    Log.v("SurfaceChangesCalled", "true");
    if(camera == null){
        return;
    }

}

public void draw(Canvas canvas){
    super.draw(canvas);
    //The Paint class holds the style and color information about how to draw geometries, text and bitmaps
    Paint paint = new Paint(Color.RED);
    Log.d(TAG, "draw");
    Log.v("Draw", "Canvas");
    //Draw the text, with origin at (canvas.getWidth()/2, canvas.getHeight()/2), using the specified paint
    canvas.drawText("Preview", canvas.getWidth() / 2, canvas.getHeight() / 2, paint);
}

}

现在我的问题是,当我的主应用程序打开并且相机活动开始时,我得到了 ANR。它冻结在行 camera.release();

但是当我的主应用程序没有打开时,它就像一个魅力。

我也尝试在 CameraActivity 的 onPause() 方法中释放相机,但没有运气。

4

0 回答 0