2013-02-21 3 views
0

Я разрабатываю индивидуальное приложение для камеры. когда приложение запускает камеру, есть три кнопки внизу.Ошибка приложения при попытке сделать новое фото

  1. Capture (Снять снимок).
  2. Take New (возврат из предварительного просмотра в камеру, чтобы сделать снимок снова.)
  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; 
} 

}

Заранее спасибо. Наконец здесь моя ошибка LogCat:


02-21 18: 24: 01,868: E/AndroidRuntime (937): FATAL ИСКЛЮЧЕНИЕ: главный 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): at android.os.Handler.handleCallback (Handler.java:725) 02-21 18 : 24: 01.868: E/AndroidRuntime (937): at 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): at android.app.ActivityThread.main (ActivityThread.java:5039) 02-21 18: 24: 01.868 : E/AndroidRuntime (937): at java.lang.reflect.Method.invokeNative (собственный способ) 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 (родной метод)

+1

post logcat здесь. –

+0

Не можете увидеть что-нибудь в logcat, если у вас есть предложения? –

+0

Вам нужно сначала запустить LogCat. Где вы используете это приложение? Если на устройстве нет камеры заднего вида или эмулятора, вы, скорее всего, вернетесь обратно с Camera.open(). Таким образом, исключение NullPointerException. –

ответ

0

Это может быть из-за того, что вы сделали фотографию в первый раз и приобрели объект камеры, а затем снова приобретаете объект камеры здесь.

Первый экземпляр здесь ниже setcontentview.

// Создание экземпляра камеры

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(); 

и

Марка обеспечить вам объявить разрешение в манифесте перед применением тега.

+0

Я также попытался с выпуском камеры в первую очередь. Как бы я его повторно использовал? –

+0

Если я удалю его, как откроется камера (вернитесь в режим захвата из предварительного просмотра)? –

+0

И почему освобождение камеры не работает. –

0

Ну, исключение нулевого указателя исходит из вашего исключения. у вас есть

Context context = null; 

, а затем вы пытаетесь использовать его здесь:

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

без acutally инициализации его в любом месте.

Также в вас функция onPause() вы должны очистить после себя. (например, отпустить камеру, предварительный просмотр стоп-сигнала, что-то вроде этого).

Смежные вопросы