使用加速度计在设备与Android中的水平平面平行时执行Camera.takePicture()时出错

时间:2016-05-04 10:12:08

标签: android android-camera accelerometer

我正在制作一款Android应用程序,我正在使用我的设备的Camera和Accelerometer。当我的设备与水平面平行时,我想自动捕捉图像,即X-Y-Z坐标等于0-0-9。

但我的应用程序崩溃并在此行上出现以下错误。

camera.takePicture(shutterCallback, rawCallback, jpegCallback);

我已经添加了我的代码和错误日志。

Java代码:

public class CamTestActivity extends Activity implements SensorEventListener{

//camera variables start//
private static final String TAG = "CamTestActivity";
Camera camera;
Activity act;
Context ctx;


// accelarometer variables start
private float lastX, lastY, lastZ;
private SensorManager sensorManager;
private Sensor accelerometer;
private float deltaX = 0;
private float deltaY = 0;
private float deltaZ = 0;
//accelarometer variables end


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ctx = this;
    act = this;
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.main);

    preview = new Preview(this, (SurfaceView)findViewById(R.id.surfaceView));
    preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    ((FrameLayout) findViewById(R.id.layout)).addView(preview);
    preview.setKeepScreenOn(true);


    //accelaromater code start

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
        // success! we have an accelerometer
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);

    } else {
        // fai! we dont have an accelerometer!
    }
    //accelaromater  end

}



@Override
public void onSensorChanged(SensorEvent event) {

    // get the change of the x,y,z values of the accelerometer


    deltaX = Math.abs(lastX - event.values[0]);
    deltaY = Math.abs(lastY - event.values[1]);
    deltaZ = Math.abs(lastZ - event.values[2]);

    if (deltaX <= 0 && deltaY = 0 && deltaZ = 9) {


        camera.takePicture(shutterCallback, rawCallback, jpegCallback);

    }

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}

@Override
protected void onResume() {
    super.onResume();

    int numCams = Camera.getNumberOfCameras();
    if(numCams > 0){
        try{
            camera = Camera.open(0);
            camera.startPreview();
            preview.setCamera(camera);
        } catch (RuntimeException ex){
            Toast.makeText(ctx, getString(R.string.camera_not_found), Toast.LENGTH_LONG).show();
        }
    }
}

@Override
protected void onPause() {

    if(camera != null) {
        camera.stopPreview();
        preview.setCamera(null);
        camera.release();
        camera = null;
    }
    super.onPause();

}

private void resetCam() {
    camera.startPreview();
    preview.setCamera(camera);
}

private void refreshGallery(File file) {
    Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(Uri.fromFile(file));
    sendBroadcast(mediaScanIntent);
}

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

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

PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        new SaveImageTask().execute(data);
        resetCam();
        Log.d(TAG, "onPictureTaken - jpeg");
    }
};

private class SaveImageTask extends AsyncTask<byte[], Void, Void> {

    @Override
    protected Void doInBackground(byte[]... data) {
        FileOutputStream outStream = null;

        // Write to SD Card
        try {
            File sdCard = Environment.getExternalStorageDirectory();
            File dir = new File (sdCard.getAbsolutePath() + "/camtest");
            dir.mkdirs();               

            String fileName = String.format("%d.jpg", System.currentTimeMillis());
            File outFile = new File(dir, fileName);

            outStream = new FileOutputStream(outFile);
            outStream.write(data[0]);
            outStream.flush();
            outStream.close();

            Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length + " to " + outFile.getAbsolutePath());

            refreshGallery(outFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        return null;
    }

}
}

当我尝试捕获图像时,应用程序崩溃并显示此日志

错误记录

05-04 15:23:19.307 2966-2966/com.example.cam V/InputMethodManager: onWindowFocus: null softInputMode=32 first=true flags=#10580
05-04 15:23:19.307 2966-2966/com.example.cam V/InputMethodManager: START INPUT: com.android.internal.policy.PhoneWindow$DecorView{a92340c V.E...... R.....ID 0,0-1280,720} ic=null tba=android.view.inputmethod.EditorInfo@f287027 controlFlags=#104
05-04 15:23:22.313 2966-2966/com.example.cam E/SensorManager: Exception dispatching input event.
05-04 15:23:22.313 2966-2966/com.example.cam D/AndroidRuntime: Shutting down VM

                                                               Process: com.example.cam, PID: 2966
                                                           java.lang.RuntimeException: takePicture failed
                                                               at android.hardware.Camera.native_takePicture(Native Method)
                                                               at android.hardware.Camera.takePicture(Camera.java:1833)
                                                               at android.hardware.Camera.takePicture(Camera.java:1778)
                                                               at com.example.cam.CamTestActivity.onSensorChanged(CamTestActivity.java:154)
                                                               at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:481)
                                                               at android.os.MessageQueue.nativePollOnce(Native Method)
                                                               at android.os.MessageQueue.next(MessageQueue.java:328)
                                                               at android.os.Looper.loop(Looper.java:164)
                                                               at android.app.ActivityThread.main(ActivityThread.java:5769)
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

0 个答案:

没有答案