Android: NPE происходит при получении изображения с камеры

У меня проблема с моим Android-приложением. Я использую цель MediaStore.ACTION_IMAGE_CAPTURE для съемки с камеры. Он работал на большинстве устройств, но я получил следующие ошибки при сбое на устройстве DroidX с рынка Android.

Я думаю, что imageCaptureUri не может быть пустым в этом случае. Так что это не причина.

У тебя есть идеи? Это ошибка встроенного ПО?

 java.lang.NullPointerException
 At android.content.ContentResolver.openInputStream (ContentResolver.java:286)
 At com.eb.android.activity.AddActivity.getBase64Receipt (AddActivity.java:193)
 At com.eb.android.activity.AddActivity.publishReceipt (AddActivity.java:204)
 At com.eb.android.activity.AddActivity.access $ 0 (AddActivity.java:203)
 At com.eb.android.activity.AddActivity $ 1.run (AddActivity.java:50)
 В java.lang.Thread.run (Thread.java:1102)

 -------------

 java.lang.NullPointerException
 At android.content.ContentResolver.openInputStream (ContentResolver.java:288)
 At com.eb.android.activity.AddActivity.getBase64Receipt (AddActivity.java:193)
 At com.eb.android.activity.AddActivity.publishReceipt (AddActivity.java:204)
 At com.eb.android.activity.AddActivity.access $ 0 (AddActivity.java:203)
 At com.eb.android.activity.AddActivity $ 1.run (AddActivity.java:50)
 В java.lang.Thread.run (Thread.java:1096)

Это моя реализация:

 Public class AddActivity extends Activity {

     Public static final int TAKE_RECEIPT = 2;

     Частный Uri imageCaptureUri;

     Private Runnable submitReceiptRunnable = new Runnable () {
         Public void run () {
             publishReceipt ();
         }
     };

     Частный прогресс ProgressDialogDialog;

     @Override
     Public void onCreate (Bundle savedInstanceState) {
         super.onCreate (savedInstanceState);
         setContentView (R.layout.add);

         registerListeners ();
     }

     Public void onActivityResult (int reqCode, int resultCode, Intent data) {
         Super.onActivityResult (reqCode, resultCode, data);

         Switch (reqCode) {
         Case (TAKE_RECEIPT):
             TakeReceiptCallback (resultCode, data);
             ломать;
         }
     }

     Private void registerListeners () {
         ImageView addReceiptButton = (ImageView) findViewById (R.id.AddReceiptButton);
         AddReceiptButton.setOnClickListener (новый OnClickListener () {
             Public void onClick (View v) {
                 takePictureFromCamera ();
             }
         });
     }

     Private void takePictureFromCamera () {
         Цель намерения = новый намерение (MediaStore.ACTION_IMAGE_CAPTURE);

         ImageCaptureUri = Uri.fromFile (новый файл (Environment.getExternalStorageDirectory (), "tmp_receipt_"
                 + String.valueOf (System.currentTimeMillis ()) + ".jpg"));

         Aim.putExtra (android.provider.MediaStore.EXTRA_OUTPUT, imageCaptureUri);
         Intent.putExtra ("return-data", true); 

         StartActivityForResult (намерение, TAKE_RECEIPT);
     }

     Private void takeReceiptCallback (int resultCode, Intent data) {
         If (resultCode == Activity.RESULT_OK) {
             submitReceipt ();
         }
     }

     Private void submitReceipt () {
         Thread thread = new Thread (null, submitReceiptRunnable);
         Thread.start ();
         ProgressDialog = ProgressDialog.show (это, «Подождите ...», «Публикация квитанции ...», true);
     }

     Private String getBase64Receipt () {
         пытаться {
             InputStream inputStream = getContentResolver (). OpenInputStream (imageCaptureUri);
             Byte [] bytes = CommonUtil.getBytesFromInputStream (inputStream);
             Return Base64.encodeBytes (байты);
         } Catch (IOException e) {
             Log.e (TAG, e.getMessage (), e);
         }

         Return null;
     }

     Private void publishReceipt () {
         Получение строки = getBase64Receipt ();

         ...
     }
 }

Вы уверены, что принудительное форматирование изображения

intent.putExtra("return-data", true); 

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

ОБНОВЛЕНИЕ: Проблема, с которой вы сталкиваетесь, имеет долгую историю, также в SO:

https://stackoverflow.com/questions/3904685/unable-to-find-com-android-camera-cropimage-activity-in-android

Проблема, с которой я столкнулся, сразу же использовала урожай, после того как изображение было снято камерой. Кроме того, он несовместим с различными версиями Android, поэтому, если вы его работаете на 1,5, возможно, он не будет работать для 2.3. Определенно, что-то не так, как можно сделать из сообщений группы разработчиков Android:

http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/569f36b5b28f2661?lnk=gst&q=Crop+image+intent#569f36b5b28f2661

http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/dcbe5aef29eddad6?lnk=gst&q=Crop+image+intent#dcbe5aef29eddad6

http://groups.google.com/group/android-developers/browse_thread/thread/d7b6a133c164aa17/184bf3b85da2ce58?lnk=gst&q=Crop+image+intent#184bf3b85da2ce58