2010-11-24 64 views
9

我的Android應用程序出現問題。我使用MediaStore.ACTION_IMAGE_CAPTURE意圖從相機拍攝照片。它適用於大多數設備,但是我從Android市場獲得了DroidX設備上的以下故障錯誤。Android:從相機獲取圖片時發生NPE

我認爲imageCaptureUri在這種情況下不能爲null。所以這不是原因。

你有什麼想法嗎?這是一個固件錯誤?

 
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:使用圖像的照相機拍攝後immediatelly作物

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

+0

感謝。我在模擬器上試過你的代碼。它工作正常。等待DroidX的反饋。 – user423715 2010-11-25 03:20:54