2010-11-24 5 views
9

私の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(); 

     ... 
    } 
} 

答えて

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

問題は、画像をカメラで撮影されたimmediatelly後作物を使用していました。また、異なる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

+0

私はまた、それがどのように機能するか聞くことに興味があります。 – Zelimir

+1

クロッピングを使用して説明したアプローチで、カメラから直接撮影した画像(Nexus Oneで確認されている問題)では正しく動作しません。切り抜きは、イメージギャラリーから撮影した写真では問題ありません。だから、間違いなく、カメラからちょうど取り出された画像のURIを持つ何かが難しい(それはヌルではない)。 – Zelimir

関連する問題