Cutsom相机应用在拍摄2-3张照片后会停止工作,没有错误消息

时间:2018-08-13 10:44:19

标签: java android camera crash

我正在尝试实现自定义相机应用。

我的目的是添加所拍摄的图片文字,例如GPS数据。实际上,我有两个问题。第一次随机发生,我的应用程序停止运行且没有错误消息。当我拍摄照片时,字节数组(pic的数据)通过intent.putExtras()发送到另一个活动。这第二项活动使用户可以查看自己的照片,将来可以向其中添加GPS数据之类的文本,取消或保存。

我的应用程序在显示第二个活动之前停止工作。有时在0张图片之后,通常是在拍摄2-3张图片之后(对于这2-3张图片,我的应用正常运行了)。我听不懂

第二个问题不是问题,但是如果有人有答案:我无法在位图上写文本,当我尝试使用答案(https://stackoverflow.com/a/7328777/9917854)时,我的应用也将停止运行而没有消息。 ..

代码:MainActivty onCreate()

    private CameraPreview mPreview;
    //...

    if (checkCameraHardware(this)) {
        mCamera = getCameraInstance();


        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);
        Button captureButton = (Button) findViewById(R.id.button_capture);
        captureButton.setOnClickListener(

                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        a=0;
                        Intent intent = new Intent("com.reboulnoah.picloc");
                        intent.putExtra("value", 1);
                        sendBroadcast(intent);
                        mCamera.takePicture(null, null, mPicture);


                    }
                }
        );
    }

}

MainActivity getCameraInstance()

   public static Camera getCameraInstance() {
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    } catch (Exception e) {
        Log.e("APP", e.getMessage());

    }
    return c;
}

MainActivity onPicTaken()

     private Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        mCamera.stopPreview();
        mCamera.startPreview();
        Intent i = new Intent(MainActivity.this, CustomizePic.class);
        i.putExtra("pic", data);
        startActivity(i);




    }
};

CameraPreview是从Android Developper官方网站提取的类。我已经改变了事情,但是我的应用也之前也停止了。我更改了surfaceDestroyed。没有代码,在surfaceCreated中,我已经旋转了相机。

    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
private static final String TAG = "MyActivity";

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

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

public void surfaceCreated(SurfaceHolder holder) {

    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.setDisplayOrientation(90);
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setRotation(90);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    } catch (IOException e) {
        Log.e(TAG, "surfaceCreated "+ e.getMessage());

    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    mCamera.stopPreview();
    Log.e(TAG,"surfaceDEst");



}


public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {


    if (mHolder.getSurface() == null){

        return;
    }


    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.e(TAG, "SurfaceChanged "+e.getMessage());
    }
}

我的第二个活动CustomizePic onCreate()

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    final byte[] data = getIntent().getByteArrayExtra("pic");

    if(data != null){
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        LinearLayout linearLayout = findViewById(R.id.linear2);

        SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        String restoredText = prefs.getString("alt", null);


        Drawable d = new BitmapDrawable(bitmap);
        linearLayout.setBackground(d);
    }

那我做错了什么?为什么拍照后2-3张照片后我的应用会停止?

谢谢

1 个答案:

答案 0 :(得分:0)

使用USB调试模拟您的应用程序,并经常查看log cat窗口以了解错误通知或查找应用程序崩溃的时间。 希望对您有帮助。