我的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(); ... } }
感謝。我在模擬器上試過你的代碼。它工作正常。等待DroidX的反饋。 – user423715 2010-11-25 03:20:54