私のAndroidアプリに問題があります。私はMediaStore.ACTION_IMAGE_CAPTUREインテントを使ってカメラから写真を撮っています。それはすべてのデバイスのほとんどを働いたが、私はアンドロイド市場から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
私はまた、それがどのように機能するか聞くことに興味があります。 – Zelimir
クロッピングを使用して説明したアプローチで、カメラから直接撮影した画像(Nexus Oneで確認されている問題)では正しく動作しません。切り抜きは、イメージギャラリーから撮影した写真では問題ありません。だから、間違いなく、カメラからちょうど取り出された画像のURIを持つ何かが難しい(それはヌルではない)。 – Zelimir