Android Camera 第二次拍摄失败

标签 android camera

我正在尝试用我的应用拍摄两张照片,第一张照片拍摄没有问题,但拍摄另一张照片时出现 NullPointerException。

以下代码是我的相机 Activity 。 最近两天我试图解决这个问题,但到目前为止还没有成功。

编辑:相机到底哪里出了问题?当用户拍照时,我会在另一个 Activity 中向他们展示预览。如果用户想拍另一张照片,请单击“拍另一张照片”按钮。 Activity 返回到 TakePicture 类。这是用户拍摄多张照片时的主要问题。

还有 displayGuide() 方法在第二次拍摄时弹出两次

感谢任何帮助。

public class TakePicture extends Activity
{
    private SurfaceView         mySurfaceView;
    private SurfaceHolder       holder;
    private Camera              myCamera;
    private int                 orient;

    @Override
    public void onCreate(Bundle b)
    {
        super.onCreate(b);

        b = getIntent().getExtras();
        orient = b.getInt("orient");
        // Switch to Screen orientation based on BARCODE
        switch (orient)
        {
            case 3 :
            case 4 :
            case 5 :
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                break;
            default :
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
        }

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_fullscreen);

        myCamera = getCameraInstance();

        mySurfaceView = (SurfaceView) findViewById(R.id.surface_view);
        holder = mySurfaceView.getHolder();
        holder.addCallback(mSurfaceListener);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    protected void onResume()
    {
        if (myCamera == null)
            myCamera = getCameraInstance();

        super.onResume();
    }

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

    private void releaseCamera()
    {
        if (myCamera != null)
        {
            myCamera.setPreviewCallback(null);
            myCamera.release();
            myCamera = null;
        }
    }

    private static Camera getCameraInstance()
    {
        Camera c = null;

        try
        {
            c = Camera.open();
        }
        catch(Exception e)
        {
            new ErrLog(e.toString());
        }

        return c;
    }

    private final ShutterCallback   shutterCallback     = new ShutterCallback()
                                                        {
                                                            public void onShutter()
                                                            {
                                                                AudioManager mgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                                                                mgr.playSoundEffect(AudioManager.FLAG_PLAY_SOUND);
                                                            }
                                                        };

    private SurfaceHolder.Callback  mSurfaceListener    = new SurfaceHolder.Callback()
                                                        {
                                                            public void surfaceCreated(SurfaceHolder holder)
                                                            {
                                                                //myCamera = Camera.open();

                                                                try
                                                                {
                                                                    myCamera.setPreviewDisplay(holder);
                                                                }
                                                                catch (Exception e)
                                                                {
                                                                    new ErrLog(e.toString());
                                                                }
                                                            }

                                                            public void surfaceDestroyed(SurfaceHolder holder)
                                                            {
                                                                //myCamera.release();
                                                                //myCamera = null;
                                                            }

                                                            @SuppressLint("InlinedApi")
                                                            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
                                                            {
                                                                myCamera.stopPreview();

                                                                Parameters mParam = myCamera.getParameters();

                                                                List<Size> getPictureSize = mParam.getSupportedPictureSizes();
                                                                Size getPicSize = getPictureSize.get(5);

                                                                mParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                                                                mParam.setPictureSize(getPicSize.width, getPicSize.height);
                                                                mParam.setRotation(fixPictureOrientation());

                                                                myCamera.setParameters(mParam);

                                                                Display display = getWindowManager().getDefaultDisplay();

                                                                if (display.getRotation() == Surface.ROTATION_0)
                                                                    myCamera.setDisplayOrientation(90);
                                                                else if (display.getRotation() == Surface.ROTATION_270)
                                                                    myCamera.setDisplayOrientation(180);

                                                                // Display guide
                                                                displayGuide();
                                                            }
                                                        };

    private int fixPictureOrientation()
    {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation)
        {
            case Surface.ROTATION_0 :
                degrees = 0;
                break; // Natural orientation
            case Surface.ROTATION_90 :
                degrees = 90;
                break; // Landscape left
            case Surface.ROTATION_180 :
                degrees = 180;
                break;// Upside down
            case Surface.ROTATION_270 :
                degrees = 270;
                break;// Landscape right
        }

        int rotate = (info.orientation - degrees + 360) % 360;

        return rotate;
    }

    private PictureCallback mPictureListener    = new PictureCallback()
                                                {
                                                    @Override
                                                    public void onPictureTaken(byte[] data, Camera camera)
                                                    {
                                                        String fileName = "sample_" + (System.currentTimeMillis() / 1000) + ".jpg";

                                                        try
                                                        {
                                                            File file = new File(PATH + "/" + fileName);

                                                            FileOutputStream out = new FileOutputStream(file);
                                                            out.write(data);

                                                            if (out != null)
                                                                out.close();
                                                        }
                                                        catch (Exception e)
                                                        {
                                                            new ErrLog(e.toString());
                                                        }

                                                        // Refreshing SD card
                                                        new UpdateSDCard().mediaScan(TakePicture.this, PATH);
                                                        // Stop Preview
                                                        myCamera.stopPreview();

                                                        Intent i = new Intent(TakePicture.this, PreviewPictureActivity.class);
                                                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                                        i.putExtra("orient", orient);
                                                        startActivity(i);
                                                    }
                                                };

    public void takePicture(View v)
    {
        if(myCamera != null)
            myCamera.takePicture(shutterCallback, null, mPictureListener);
    }

    public void cancelActivity(View v)
    {
        Intent i = new Intent(TakePicture.this, MenuActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        TakePicture.this.finish();
    }

    private void displayGuide()
    {
        GetScreenSize size = new GetScreenSize();

        final Dialog dialog = new Dialog(TakePicture.this);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.guide_layout_picture);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);

        ImageView close = (ImageView) dialog.findViewById(R.id.imageView1);
        close.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                dialog.dismiss();

                if(myCamera == null)
                {
                    myCamera = Camera.open();
                }

                myCamera.startPreview();
            }
        });

        dialog.show();

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        Window window = dialog.getWindow();
        lp.copyFrom(window.getAttributes());
        // This makes the dialog take up the full width
        lp.width = (int) (size.getScreenW() * 0.8F);
        lp.height = (int) (size.getScreenH() * 0.7F);

        window.setAttributes(lp);
    }
}

这是输出日志

11-07 11:14:28.998: E/AndroidRuntime(1502): 致命异常: main 11-07 11:14:28.998: E/AndroidRuntime(1502): java.lang.RuntimeException: 无法连接到相机服务 11-07 11:14:28.998:E/AndroidRuntime(1502):在 android.hardware.Camera.native_setup( native 方法) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.hardware.Camera.(Camera.java:371) 11-07 11:14:28.998: E/AndroidRuntime (1502): 在 android.hardware.Camera.open (Camera.java:344) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 main_app.TakePicture$4.onClick(TakePicture.java:236) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.view.View.performClick(View.java:4203) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.view.View$PerformClick.run(View.java:17189) 11-07 11:14:28.998: E/AndroidRuntime (1502): 在 android.os.Handler.handleCallback (Handler.java:615) 11-07 11:14:28.998: E/AndroidRuntime (1502): 在 android.os.Handler.dispatchMessage (Handler.java:92) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.os.Looper.loop(Looper.java:137) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.app.ActivityThread.main(ActivityThread.java:4961) 11-07 11:14:28.998:E/AndroidRuntime(1502):在 java.lang.reflect.Method.invokeNative( native 方法) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 java.lang.reflect.Method.invoke(Method.java:511) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 11-07 11:14:28.998: E/AndroidRuntime (1502): 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:771) 11-07 11:14:28.998: E/AndroidRuntime(1502): 在 dalvik.system.NativeStart.main(Native Method)

最佳答案

好的,伙计们。我想我发现了问题。问题是 myCamera = getCameraInstance(); onCreate 方法中的行,所以我删除了该行,相机不再失败。希望这对其他人有帮助。

关于Android Camera 第二次拍摄失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792616/

相关文章:

Android 视觉条形码阅读器不适用于某些三星设备

Android:从相机获取图片 - 小心

java - 关于如何保存数据的建议

android - 错误:具有配置 ' '的attr/style的值重复

android - 在 Android 5.0 Lollipop 上不支持 calendarViewShown

ios - Swift 手动设置相机权限

android - Android 的 CameraInfo.orientation 是否正确记录?执行不正确?

android - Jetpack 根据大小组成具有自适应列数的网格

java - 将原始字节数据转换为音频

android - 任何允许访问前置和后置摄像头的 Android 设备?