0

カスタマイズされたカメラアプリを開発しています。アプリが起動すると、カメラが開き、下部に3つのボタンがあります。

  1. キャプチャ(写真を撮る)。
  2. 新規撮影(プレビューからカメラに戻って、もう一度写真を撮ります)。
  3. 何にも使用していません。

すべてが正常に動作します。キャプチャを押すと、写真が撮影され、撮影した写真が正確にプレビューされます。しかし、新しいボタンを押してプレビューモードからカメラモードに入ると、アプリがクラッシュし、何が間違っているのかわかりません。以下は私が使用しているコードです。

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;
}

}

前もって感謝します。最後に、これが私のエラーログキャットです。


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):com.example.facebooktag.MainActivity.getCameraInstance(MainActivity.java:136)02-21 18:24:01.868:E / AndroidRuntime(937):com.example.facebooktag.MainActivity$3。 onClick(MainActivity.java:66)02-21 18:24:01.868:E / AndroidRuntime(937):at 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):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):dalvik.system.NativeStart.main(ネイティブメソッド)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):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)02-21 18 :24:01.868:E / AndroidRuntime(937):dalvik.system.NativeStart.main(ネイティブメソッド)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):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)02-21 18 :24:01.868:E / AndroidRuntime(937):dalvik.system.NativeStart.main(ネイティブメソッド)

4

2 に答える 2

0

さて、ヌルポインタ例外はあなたの例外から来ています。あなたが持っている

Context context = null; 

そして、ここでそれを使用しようとしています:

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

どこでも実際に初期化せずに。

また、 onPause() 関数では、自分でクリーンアップする必要があります。(例: カメラを離す、サーフェス プレビューを停止する、など)。

于 2013-02-22T14:32:26.753 に答える
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();

アプリケーションタグの前に、マニフェストで許可を宣言していることを確認してください。

于 2013-02-21T17:21:08.083 に答える