切换自定义相机android导致应用程序崩溃

时间:2015-11-16 11:51:37

标签: android nullpointerexception android-camera illegalstateexception

我制作自定义相机Android应用程序。我已经添加了一个按钮,可以在我的活动中切换相机。单击该按钮,我的相机完全切换,但当我尝试通过回调保存图像时,我的应用程序由于NullPointerException而崩溃。这是我的代码。请帮我。 提前谢谢

相机活动代码

public class CameraActivity extends Activity {

private Camera mCamera;
private CameraHandler surface_view;
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
public static final String TAG="Aloo";
Bitmap bmp;
@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);
    if(checkifCamera(this))
    {

        mCamera=getCameraInstance();
        surface_view = new CameraHandler(this, mCamera);

        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(surface_view);
    }
    else
    {
        Toast.makeText(this,"Sorry camera is not supported on your device",Toast.LENGTH_LONG).show();
    }
}
private boolean checkifCamera(Context context)
{
    if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
    {
        return true;
    }
    else {
        return false;
    }
}
public Camera getCameraInstance()
{
    Toast.makeText(this,"Chrj",Toast.LENGTH_LONG).show();
    Camera c=null;
    try{
        releaseCameraAndPreview();
        c=Camera.open();
    }
    catch (Exception e)
    {
        Toast.makeText(this,"Print error"+e.getMessage(),Toast.LENGTH_LONG).show();
        return  c;
    }
    Toast.makeText(this,"Check this out "+c,Toast.LENGTH_LONG).show();
    return c;
}
public void switchC(View view)//Function called to switch camera
{

    surface_view.switchCamera();
    mCamera=getCameraInstance();


}
private void releaseCameraAndPreview() {

    if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}
@Override
protected void onPause() {
    super.onPause();
    try
    {
        // release the camera immediately on pause event
        //releaseCamera();
        mCamera.stopPreview();
        mCamera.setPreviewCallback(null);
        mCamera.release();
        mCamera = null;

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
public void takePH(View view)
{

    int toRotate=0;
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int displayRotation = display.getRotation();
    switch (displayRotation)  {
        case Surface.ROTATION_0:        toRotate=90;    break;
        case Surface.ROTATION_90:       break;
        case Surface.ROTATION_180:      break;
        case Surface.ROTATION_270:      toRotate=270;   break;
    }
    Toast.makeText(this,"Rotation "+toRotate,Toast.LENGTH_LONG).show();
    Camera.Parameters params = mCamera.getParameters();
    params.set("rotation",270);
    mCamera.setParameters(params);
    mCamera.takePicture(null,null,mPicture);
}
Camera.PictureCallback mPicture = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d(TAG, "Error creating media file, check storage permissions: ");
            return;
        }


        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();


        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
        Toast.makeText(CameraActivity.this,"Image saves successfully", Toast.LENGTH_LONG).show();
    }
};



/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
    return Uri.fromFile(getOutputMediaFile(type));
}

/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), "Fotos");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

}

我的自定义相机处理程序

  public class CameraHandler extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;

    private Camera mCamera=null;
    public int currentCameraID=0;

    public CameraHandler(Context context,Camera camera) {
        super(context);
        mCamera=camera;

        mHolder=getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(holder);

            Camera.Parameters p = mCamera.getParameters();

        }
        catch (IOException e)
        {
            Log.d("--DS", "Error setting camera preview: " + e.getMessage());
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        fixOr();
        if(mHolder.getSurface()==null)
        {
            return;
        }
        if (mHolder.getSurface() == null){
            // preview surface does not exist
            return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
            // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d("--DS", "Error starting camera preview: " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
    public void fixOr()
    {
       mCamera.stopPreview();
        mCamera.setDisplayOrientation(90);
        mCamera.startPreview();
    }

    public void switchCamera()  {
        mCamera.stopPreview();
        mCamera.release();

        if(currentCameraID==Camera.CameraInfo.CAMERA_FACING_BACK)
        {

            currentCameraID = Camera.CameraInfo.CAMERA_FACING_FRONT;
        }
        else
        {

            currentCameraID=Camera.CameraInfo.CAMERA_FACING_BACK;
        }
         mCamera=Camera.open(currentCameraID);
        fixOr();
        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.startPreview();
    }    
}

我相信我的应用程序崩溃了,因为当我切换相机时mCamera变为null。我该如何解决这个问题?

我得到的错误是:

    java.lang.IllegalStateException: Could not execute method of the activity

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 
            'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()'
             on a null object reference

1 个答案:

答案 0 :(得分:0)

在听完拉米的评论后,我在2个地方改变了我的代码 1。)

 public void switchC(View view)//Function called to switch camera
{ 

 mCamera=surface_view.switchCamera();
} 

2.)切换相机功能

   public Camera switchCamera()  { 
    mCamera.stopPreview(); 
    mCamera.release(); 

    if(currentCameraID==Camera.CameraInfo.CAMERA_FACING_BACK)
    { 

        currentCameraID = Camera.CameraInfo.CAMERA_FACING_FRONT;
    } 
    else 
    { 

        currentCameraID=Camera.CameraInfo.CAMERA_FACING_BACK;
    } 
     mCamera=Camera.open(currentCameraID);
    fixOr(); 
    try { 
        mCamera.setPreviewDisplay(mHolder);
    } catch (IOException e) {
        e.printStackTrace();
    } 
    mCamera.startPreview(); 
}     return mCamera;
相关问题