Неисправность работы с камерой в onActivityResult

У меня есть два варианта: «выбрать фотографию» и «сфотографировать». У меня есть функция выбора фотографий, полностью работающая, но у меня проблемы с фотографированием. Главным образом наличие сохраненного изображения в моем представлении изображения после его сохранения.

Определено местоположение моей фотографии:

public class photoActivity extends Activity { private String photoPath; private ImageView imgView; {...} 

Мой слушатель камеры:

 bPicFromCam.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { long captureTime = System.currentTimeMillis(); photoPath = Environment.getExternalStorageDirectory() + "/MYAPP" + captureTime + ".jpg"; getPicFromCam(v); } else{ Toast.makeText(getApplicationContext(), "Sorry there is a problem accessing your SDCard, " + "please select a picture from your gallery instead.", Toast.LENGTH_LONG).show(); } } }); 

Затем мой код, чтобы запустить намерение камеры (обратите внимание, что photoPath верна):

  public void getPicFromCam(View view){ System.out.println("photoPath: " + photoPath); //Outputs the CORRECT location! try{ Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File photo = new File(photoPath); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); startActivityForResult(Intent.createChooser(intent, "Capture Image"), CAPTURE_IMAGE); } catch (Exception e) { Toast.makeText(getApplicationContext(), getString(R.string.exception_message), Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } } 

OK все кажется прекрасным до этого момента – снимок сделан, и изображение будет сохранено в указанном месте.

Теперь я пытаюсь отобразить изображение в моем представлении изображения (тогда его можно загрузить после того, как пользователь подтвердит его хорошее).

Мой onActivityResult:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case PICK_IMAGE: if (resultCode == Activity.RESULT_OK) { //THIS WORKS } break; case CAPTURE_IMAGE: if (resultCode == RESULT_CANCELED) { Toast toast = Toast.makeText(this,"Canceled, no photo selected.", 1000); toast.show(); return; } if (requestCode == CAPTURE_IMAGE && resultCode == RESULT_OK) { try { System.out.println("photoPath " + photoPath); //This is NULL!!! And my problem, halp! BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 6; bitmap = BitmapFactory.decodeFile(photoPath, bitmapOptions); imgView.setImageBitmap(bitmap); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Internal error", Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } } break; default: } } 

То, как я сейчас пытаюсь это сделать, но я также попытался использовать следующее в моем onActivityResult:

 bitmap = (Bitmap) data.getExtras().get("data"); 

Но каждый раз, когда я пытаюсь изменить метод выше, я получаю NPE.

РЕДАКТИРОВАТЬ:

  03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): null 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): java.lang.NullPointerException 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at com.myco.photoapp.SelectPhoto.onActivityResult(SelectPhoto.java:277) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.Activity.dispatchActivityResult(Activity.java:3890) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3115) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.os.Handler.dispatchMessage(Handler.java:99) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.os.Looper.loop(Looper.java:123) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.main(ActivityThread.java:4627) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at java.lang.reflect.Method.invokeNative(Native Method) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at java.lang.reflect.Method.invoke(Method.java:521) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at dalvik.system.NativeStart.main(Native Method) 

Над NPE приходит, когда:

 //below is line 277 String result = data.toURI(); BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 6; bitmap = BitmapFactory.decodeFile(result, bitmapOptions); 

Вероятно, ваша деятельность уничтожается и воссоздается, когда активность камеры отключается. Может быть, попробуйте сохранить фотопат в Bundle в onSaveInstanceState, а затем отловить его обратно в onCreate (не забудьте проверить нули в onCreate, когда вы это сделаете)?

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

фото станет общей переменной.

 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); 

Итак, вы должны взять его из этой папки:

 Bitmap photo = Media.getBitmap(getContentResolver(), Uri.fromFile(photo) ); 

Я следую вашему коду и меняю.

В основном, используя

 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); 

работает хорошо

Перед установкой в ​​imageView убедитесь, что вы сжимаете изображение, так как оно очень велико при сохранении этого пути.

 int newWidth = bm.getWidth(); int newHeight = bm.getHeight(); while(newWidth > 300){ newWidth = newWidth/2; newHeight = newHeight/2; } mImagePlaceHolder.setImageBitmap(Bitmap.createScaledBitmap(bm, newWidth, newHeight, false)); 

Я боролся с этой проблемой и нашел другое решение: просто используйте такой код:

 Bitmap bitmap = data.getExtras().getParcelable("data"); 

и вы можете получить bitmap.

  • Как захватить изображение и сохранить его с помощью встроенной камеры Android
  • широковещательный приемник не получит событие камеры
  • Активность kill / onCreate вызвана после съемки с помощью намерения
  • Значение тега ориентации EXIF ​​всегда 0 для изображения, сделанного с помощью приложения для портретов с вертикальной камерой
  • Android: BroadcastReceiver намерен обнаружить фотокамеру камеры?
  • Давайте будем гением компьютера.