2010-11-24 3 views
9

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

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

Есть ли у вас идеи? Это ошибка встроенного ПО?

 
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) 
at 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) 
at java.lang.Thread.run(Thread.java:1096) 

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

 
public class AddActivity extends Activity { 

    public static final int TAKE_RECEIPT = 2; 

    private Uri imageCaptureUri; 

    private Runnable submitReceiptRunnable = new Runnable() { 
     public void run() { 
      publishReceipt(); 
     } 
    }; 

    private ProgressDialog progressDialog; 

    @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); 
      break; 
     } 
    } 

    private void registerListeners() { 
     ImageView addReceiptButton = (ImageView) findViewById(R.id.AddReceiptButton); 
     addReceiptButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       takePictureFromCamera(); 
      } 
     }); 
    } 

    private void takePictureFromCamera() { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     imageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "tmp_receipt_" 
       + String.valueOf(System.currentTimeMillis()) + ".jpg")); 

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

     startActivityForResult(intent, 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(this, "Please wait...", "Publishing receipt ...", true); 
    } 

    private String getBase64Receipt() { 
     try { 
      InputStream inputStream = getContentResolver().openInputStream(imageCaptureUri); 
      byte[] bytes = CommonUtil.getBytesFromInputStream(inputStream); 
      return Base64.encodeBytes(bytes); 
     } catch (IOException e) { 
      Log.e(TAG, e.getMessage(), e); 
     } 

     return null; 
    } 

    private void publishReceipt() { 
     String receipt = getBase64Receipt(); 

     ... 
    } 
} 

ответ

2

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

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

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

UPDATE: Проблема вы столкнулись с имеет долгую историю, и на SO:

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

Issue я испытал использовал урожай мгновенного после того, как изображение было снято камерой. Кроме того, он несовместим с различными версиями 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

+0

Спасибо. Я пробовал ваши коды на тренажерах. Он работает правильно. Ожидание обратных связей от DroidX. – user423715 2010-11-25 03:20:54

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