为什么相机不能正常工作?

时间:2013-02-01 03:03:37

标签: android

我在我的应用程序中使用相机,我没有在相机上做更多的工作我的要求只是拍摄照片和前后相机和闪光灯。相机将在自定义视图中打开,因为我使用此代码: -

public class CaptureDealImage extends Activity implements OnClickListener,
    CameraCallback {
private Camera myCamera;
private MyCameraSurfaceView myCameraSurfaceView;
private MediaRecorder mediaRecorder;
private Button objbtncapture, objbtnback, objbtngalary, objbtnretake,
        objbtnuse;
private Button objbtnflashlight, objbbtnfrontcam;// ,flashButton_p,flashButton_l,cameraRotate_p,cameraRotate_l;
private boolean recording;
private TextView show_p, show_l;
int nCurrentOrientation;
private WakeLock wakeLock;
private int count, mode;
private boolean backendCamera = true;
private FrameLayout mymiddlelayout;
private String sdcardpath;
private boolean flashlight = false;
private boolean cameramode = false;
private boolean isfrontcamera = false;
private RelativeLayout objrelativeLayoutretake, objrelativeLayout3;
private byte[] data;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dealpick);
    PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = mgr
            .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();
    // Get Camera for preview
    objbtnflashlight = (Button) findViewById(R.id.btnflashlight);
    objbbtnfrontcam = (Button) findViewById(R.id.bbtnfrontcam);
    objbtncapture = (Button) findViewById(R.id.btncapture);
    objbtngalary = (Button) findViewById(R.id.btngalary);
    objbtnback = (Button) findViewById(R.id.btnback);
    objbtnretake = (Button) findViewById(R.id.btnretake);
    objbtnuse = (Button) findViewById(R.id.btnuse);
    objrelativeLayoutretake = (RelativeLayout) findViewById(R.id.relativeLayoutretake);
    objrelativeLayout3 = (RelativeLayout) findViewById(R.id.relativeLayout3);
    objbtnback.setOnClickListener(this);
    objbtncapture.setOnClickListener(this);
    objbtngalary.setOnClickListener(this);
    objbtnflashlight.setOnClickListener(this);
    objbbtnfrontcam.setOnClickListener(this);
    objbtnretake.setOnClickListener(this);
    objbtnuse.setOnClickListener(this);
}

private Camera getCameraInstance() {
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
        Display getOrient = getWindowManager().getDefaultDisplay();
        if (getOrient.getHeight() > getOrient.getWidth()) {
            c.setDisplayOrientation(90);
        }
    } catch (Exception e) {
    }
    return c; // returns null if camera is unavailable
}

@Override
protected void onPause() {
    super.onPause();
    releaseCamera();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    myCamera = getCameraInstance();
    if (myCamera == null) {
        Toast.makeText(CaptureDealImage.this, "Fail to get Camera",
                Toast.LENGTH_LONG).show();
    }
    myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
    mymiddlelayout = (FrameLayout) findViewById(R.id.middlelayout);
    mymiddlelayout.removeAllViews();
    mymiddlelayout.addView(myCameraSurfaceView);
    myCameraSurfaceView.setCallback(this);
}

private void releaseCamera() {
    /*
     * if (myCamera != null) { myCamera.release(); // release the camera for
     * other applications myCamera = null; }
     */
    Camera camera = this.myCameraSurfaceView.getCamera();
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    wakeLock.release();
    /*
     * ReleaseRootBitmap mReleaseRootBitmap=new ReleaseRootBitmap();
     * LinearLayout
     * mLinearLayout=(LinearLayout)findViewById(R.id.record_video_parent);
     * mReleaseRootBitmap.unbindDrawables(mLinearLayout);
     */
}

public class MyCameraSurfaceView extends SurfaceView implements
        SurfaceHolder.Callback {

    private SurfaceHolder mHolder;
    private Camera mCamera;
    private CameraCallback callback = null;
    private boolean isStarted = true;

    public MyCameraSurfaceView(Context context, Camera camera) {
        super(context);
        mCamera = camera;
        initialize(context);
    }

    public MyCameraSurfaceView(Context context) {
        super(context);
        initialize(context);
    }

    public void setCallback(CameraCallback callback) {
        this.callback = callback;
    }

    public void startPreview() {
        mCamera.startPreview();
    }

    public void initialize(Context mcontext) {
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format,
            int weight, int height) {

        if (holder.getSurface() == null) {
            // preview surface does not exist
            return;
        }
        // stop preview before making changes
        try {
            if (null != mCamera) {
                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 {
            if (null != mCamera) {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            }

            /*
             * if (null != camera) { camera.startPreview();
             */
        } catch (Exception e) {
            Log.d("check",
                    "Error starting camera preview: " + e.getMessage());
        }

    }

    public Camera getCamera() {
        return this.mCamera;
    }

    public void startTakePicture() {
        mCamera.autoFocus(new AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                takePicture();
            }
        });
    }

    public void takePicture() {
        mCamera.takePicture(new ShutterCallback() {
            @Override
            public void onShutter() {
                if (null != callback)
                    callback.onShutter();
            }
        }, new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                if (null != callback)
                    callback.onRawPictureTaken(data, camera);
            }
        }, new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                if (null != callback)
                    callback.onJpegPictureTaken(data, camera);
            }
        });
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            // mCamera.startPreview();
            try {
                mCamera.setPreviewDisplay(holder);
            } catch (Throwable ignored) {
            }
            mCamera.setPreviewDisplay(holder);
            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    if (null != callback)
                        callback.onPreviewFrame(data, camera);
                }
            });
        } catch (IOException e) {
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCamera != null) {
            // camera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    Display display = getWindowManager().getDefaultDisplay();
    if (display.getHeight() > display.getWidth()) {
        myCamera.setDisplayOrientation(90);
        show_l.setVisibility(View.GONE);
        show_p.setVisibility(View.VISIBLE);
    } else {
        myCamera.setDisplayOrientation(0);
        show_l.setVisibility(View.VISIBLE);
        show_p.setVisibility(View.GONE);
    }
}

private Handler checkHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (recording && count <= 15) {
            if (mode == 1) {
                show_l.setText(count + "/15");
            } else {
                show_p.setText(count + "/15");
            }
        }
    }
};

@Override
public void onClick(View v) {
    if (v.equals(objbtncapture)) {
        myCameraSurfaceView.startTakePicture();
    }
    if (v.equals(objbtngalary)) {
        // releaseCamera();
        Intent i = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
        final int ACTIVITY_SELECT_IMAGE = 100;
        startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
    }

    if (v.equals(objbtnflashlight)) {

        if (!isfrontcamera) {
            if (!flashlight) {
                flashlight = true;
                Parameters params = myCamera.getParameters();
                params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                myCamera.setParameters(params);
            } else {
                flashlight = false;
                Parameters params = myCamera.getParameters();
                params.setFlashMode(Parameters.FLASH_MODE_OFF);
                myCamera.setParameters(params);
            }
        }
    }

    if (v.equals(objbbtnfrontcam)) {

        if (!cameramode) {
            cameramode = true;
            switchToCamera(cameramode);
        } else {
            cameramode = false;
            switchToCamera(cameramode);
        }
    }

    if (v.equals(objbtnback)) {
        finish();
    }
    if (v.equals(objbtnretake)) {
        objrelativeLayoutretake.setVisibility(View.GONE);
        objrelativeLayout3.setVisibility(View.VISIBLE);
        myCameraSurfaceView.startPreview();
    }
    if (v.equals(objbtnuse)) {
        try {
            PhotoComplete(data);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

private void switchToCamera(boolean frontcamera) {
    releaseCamera();
    if (frontcamera) {
        isfrontcamera = true;
        myCamera = getFrontCameraId();
    } else {
        isfrontcamera = false;
        myCamera = getCameraInstance();
    }

    if (myCamera == null) {
        Toast.makeText(CaptureDealImage.this, "fail to get front camera",
                Toast.LENGTH_SHORT).show();
        myCamera = getCameraInstance();
    }
    myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
    mymiddlelayout = (FrameLayout) findViewById(R.id.middlelayout);
    mymiddlelayout.removeAllViews();
    mymiddlelayout.addView(myCameraSurfaceView);
}

Camera getFrontCameraId() {
    int cameraCount = 0;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    Camera camera = null;
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                camera = Camera.open(camIdx);
                Display getOrient = getWindowManager().getDefaultDisplay();
                if (getOrient.getHeight() > getOrient.getWidth()) {
                    camera.setDisplayOrientation(90);
                }
                // myCamera.unlock();
                // mediaRecorder.setCamera(myCamera);
                // myCamera.setParameters(myCamera.getParameters());
            } catch (RuntimeException e) {
                Log.e("",
                        "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }
    return camera;
    // No front-facing camera found
}

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    // TODO Auto-generated method stub

}

@Override
public void onShutter() {
    // TODO Auto-generated method stub

}

@Override
public void onRawPictureTaken(byte[] data, Camera camera) {
    // TODO Auto-generated method stub

}

@Override
public void onJpegPictureTaken(byte[] data, Camera camera) {
    try {
        this.data = data;
        objrelativeLayoutretake.setVisibility(View.VISIBLE);
        objrelativeLayout3.setVisibility(View.GONE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void PhotoComplete(byte[] data) throws FileNotFoundException,
        IOException {
    try {
        sdcardpath = String.format(getResources().getString(R.string.path),
                System.currentTimeMillis());
        FileOutputStream outStream = new FileOutputStream(sdcardpath);
        outStream.write(data);
        outStream.close();
        Bundle objbundle = new Bundle();
        Intent objintent = new Intent(CaptureDealImage.this,
                com.flashdeal.mycamera.SetDealImageCategory.class);
        objbundle.putString("from", "camera");
        objbundle.putString("imagepath", sdcardpath);
        Log.e("check===path", sdcardpath);
        objintent.putExtras(objbundle);
        startActivity(objintent);
        finish();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public String onGetVideoFilename() {
    // TODO Auto-generated method stub
    return null;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        cursor.close();
        Bundle objbundle = new Bundle();
        Intent objintent = new Intent(CaptureDealImage.this,
                com.flashdeal.mycamera.SetDealImageCategory.class);
        objbundle.putString("from", "camera");
        objbundle.putString("imagepath", filePath);
        objintent.putExtras(objbundle);
        startActivity(objintent);
        finish();
    }
}

}

但这不起作用,当我点击前置摄像头时,再次回到摄像头并再次在捕捉按钮摄像头上变成freez。请任何人指导我或给我链接以满足我的要求。

1 个答案:

答案 0 :(得分:0)

参考此链接::

他们面临同样的问题。请稍等一下。

Link 1

Link 2

希望这会有所帮助:)