应用程序在尝试拍摄新照片时崩溃

时间:2013-02-21 17:11:57

标签: android crash camera

我正在开发一个定制的相机应用程序。当应用程序启动相机打开时,底部有三个按钮。

  1. 捕获(拍照)。
  2. 拍摄新照片(从预览返回到相机再拍照。)
  3. 不使用任何东西。
  4. 一切正常。按下捕捉拍摄照片并准确预览拍摄的照片。但是当我按下新按钮从预览模式进入相机模式时,应用程序崩溃不知道我做错了什么。以下是我正在使用的代码。

    public class MainActivity extends Activity {
    
    
       protected static final String TAG = null;
       private Camera mCamera;
        private CameraPreview mPreview;
        public static final int MEDIA_TYPE_IMAGE = 1;
        static int result;
        static int degrees = 90;
        private Button captureButton, btn_new;
        public FrameLayout preview;
        private static File mediaFile;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Create an instance of Camera
        mCamera = getCameraInstance();
    
        // Create our Preview view and set it as the content of our activity.
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);
         captureButton = (Button) findViewById(R.id.button_capture);
        captureButton.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // get an image from the camera
                    mCamera.takePicture(null, null, mPicture);
                }
            }
        );
        btn_new = (Button) findViewById(R.id.button_new);
        btn_new.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
                mCamera = getCameraInstance();
    
                //preview = (FrameLayout) findViewById(R.id.camera_preview);
                //preview.addView(mPreview);
            }
        });
    
    }
    
    private PictureCallback mPicture = new PictureCallback() {
    
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
    
            File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
            if (pictureFile == null){
    
                return;
            }
    
            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Log.d(TAG, "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d(TAG, "Error accessing file: " + e.getMessage());
            }
        }
    };
    
    /** Create a File for saving an image or video */
    private static File getOutputMediaFile(int type){
        // To be safe, you should check that the SDCard is mounted
        // using Environment.getExternalStorageState() before doing this.
    
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "Camera");
    
        // Create the storage directory if it does not exist
        if (! mediaStorageDir.exists()){
            if (! mediaStorageDir.mkdirs()){
                Log.d("MyCameraApp", "failed to create directory");
                return null;
            }
        }
    
        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    
        if (type == MEDIA_TYPE_IMAGE){
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
            "IMG_"+ timeStamp + ".jpg");
        } 
        else {
            return null;
        }
    
        return mediaFile;
    }
    @SuppressWarnings("null")
    public static Camera getCameraInstance(){
        Camera c = null;
        Context context = null; 
        try{
            c = Camera.open();
            //setCameraDisplayOrientation(MainActivity, 0, c);
            c.setDisplayOrientation(degrees);
        }
        catch (Exception e) {
            Toast.makeText(context.getApplicationContext(),"Camera is not available" ,           Toast.LENGTH_LONG).show();
    
        }
        return c;
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    

    }

    先谢谢。 最后 这是我的错误logcat:


    02-21 18:24:01.868:E / AndroidRuntime(937):致命异常:主要 02-21 18:24:01.868:E / AndroidRuntime(937):java.lang.NullPointerException 02-21 18:24:01.868:E / AndroidRuntime(937):at com.example.facebooktag.MainActivity.getCameraInstance(MainActivity.java:136) 02-21 18:24:01.868:E / AndroidRuntime(937):at com.example.facebooktag.MainActivity $ 3.onClick(MainActivity.java:66) 02-21 18:24:01.868:E / AndroidRuntime(937):在android.view.View.performClick(View.java:4202) 02-21 18:24:01.868:E / AndroidRuntime(937):在android.view.View $ PerformClick.run(View.java:17340) 02-21 18:24:01.868:E / AndroidRuntime(937):在android.os.Handler.handleCallback(Handler.java:725) 02-21 18:24:01.868:E / AndroidRuntime(937):在android.os.Handler.dispatchMessage(Handler.java:92) 02-21 18:24:01.868:E / AndroidRuntime(937):在android.os.Looper.loop(Looper.java:137) 02-21 18:24:01.868:E / AndroidRuntime(937):在android.app.ActivityThread.main(ActivityThread.java:5039) 02-21 18:24:01.868:E / AndroidRuntime(937):at java.lang.reflect.Method.invokeNative(Native Method) 02-21 18:24:01.868:E / AndroidRuntime(937):at java.lang.reflect.Method.invoke(Method.java:511) 02-21 18:24:01.868:E / AndroidRuntime(937):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 02-21 18:24:01.868:E / AndroidRuntime(937):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 02-21 18:24:01.868:E / AndroidRuntime(937):at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

可能是因为你第一次成功拍摄了照片并获得了相机对象,然后你又在这里获取了相机对象。

第一个例子见setcontentview。

//创建一个Camera

的实例
mCamera = getCameraInstance();

并尝试再次获取相机实例,但已经获得了它。

btn_new = (Button) findViewById(R.id.button_new);
btn_new.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        mCamera = getCameraInstance();

        //preview = (FrameLayout) findViewById(R.id.camera_preview);
        //preview.addView(mPreview);
    }
});

在再次获取相机对象之前,您应该释放它的第一个。

if(mCamera != null)
   mCamera.release();

确保您在应用标记之前在清单中声明了权限。

答案 1 :(得分:0)

空指针异常来自您的异常。你有

Context context = null; 

然后你试图在这里使用它:

Toast.makeText(context.getApplicationContext(),"Camera is not available" ,           Toast.LENGTH_LONG).show();

无需在任何地方进行实际初始化。

另外在你onPause()函数中,你应该自己清理。 (例如,释放相机,停止表面预览,那种事情)。