Сфотографировать без предварительного просмотра Android

Я хотел бы сделать снимок без предварительного просмотра. Я использовал этот код, но я получаю сообщение об ошибке:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Camera.Parameters parameters = camera.getParameters();
    parameters.setPictureFormat(PixelFormat.JPEG);
    camera.setParameters(parameters);
    SurfaceView mview = new SurfaceView(getBaseContext());
    try {
        camera.setPreviewDisplay(mview.getHolder());
        camera.startPreview();
        camera.takePicture(null,null,photoCallback);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}

 Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {

        Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());
        OutputStream imageFileOS;

        try {

            imageFileOS = getContentResolver().openOutputStream(uriTarget);
            imageFileOS.write(data);
            imageFileOS.flush();
            imageFileOS.close();

            Toast.makeText(AndroidTestJNIActivity.this, "Image saved: " + uriTarget.toString(), Toast.LENGTH_LONG).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();

        }
        finish();

    }
};

Я получаю исключение NullPointerException при попытке получить доступ к камере. Я не знаю, как его инициализировать. Я думаю, что проблема в том, что камера никогда не инициализируется.

 05-29 14:40:20.330: E/AndroidRuntime(15571): FATAL EXCEPTION: main
 05-29 14:40:20.330: E/AndroidRuntime(15571): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.achillessecurity.androidtestjni/com.achillessecurity.androidtestjni.AndroidTestJNIActivity}: java.lang.RuntimeException: Fail to connect to camera service
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
05-29 14:40:20.330: E/AndroidRuntime(15571):    at android.app.ActivityThread.access$1500(ActivityThread.java:123)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.os.Handler.dispatchMessage(Handler.java:99)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.os.Looper.loop(Looper.java:130)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.app.ActivityThread.main(ActivityThread.java:3835)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at java.lang.reflect.Method.invokeNative(Native Method)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at java.lang.reflect.Method.invoke(Method.java:507)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at dalvik.system.NativeStart.main(Native Method)
 05-29 14:40:20.330: E/AndroidRuntime(15571): Caused by: java.lang.RuntimeException: Fail to connect to camera service
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.hardware.Camera.native_setup(Native Method)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.hardware.Camera.<init>(Camera.java:258)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.hardware.Camera.open(Camera.java:235)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at com.achillessecurity.androidtestjni.AndroidTestJNIActivity.onCreate(AndroidTestJNIActivity.java:42)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 05-29 14:40:20.330: E/AndroidRuntime(15571):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)

Я инициализирую камеру: camera= Camera.open();

4 ответа

Решение

Используйте это разрешение:

 <uses-permission android:name="android.permission.CAMERA" />
 <uses-feature android:name="android.hardware.camera" />

И вы можете создать экземпляр объекта Camera с помощью этого

Camera mycamera = Camera.open();

Вы можете попробовать метод, описанный здесь, очень просто, если вы в простоте:

http://developer.android.com/training/camera/photobasics.html

Относительно вашего Fail to initialize camera ошибка, другая возможность - камера используется чем-то другим.

Android не может использовать камеру без предварительного просмотра... но вы можете установить размер предварительного просмотра, например, 1x1 px, тогда вы его не увидите и все равно сможете использовать камеру.

Это связано с тем, что камера срабатывает не сразу и часто не синхронно. Некоторым устройствам требуется значительная задержка между startPreview () а также takePicture ().

Например: устройствам Samsung требуется не менее 100 мс для запуска камеры.

Вы можете устранить эту ошибку, установив задержку на takePicture() метод.

      mview.postDelayed(new Runnable() {
    @Override
    public void run() {
        try {
            camera.takePicture(null, null, photoCallback);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}, 100);
Другие вопросы по тегам