安卓:从相机获取照片时发生NPE错误

9

我的Android应用程序出现了问题。我正在使用MediaStore.ACTION_IMAGE_CAPTURE意图从相机拍照。它在大多数设备上都可以工作,但是在来自Android市场的DroidX设备上出现了以下崩溃错误。

我认为在这种情况下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();

        ...
    }
}
1个回答

2

您确定要强制使用图像裁剪模式吗?

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

如果我理解正确,您希望在使用设备时正确地工作。但是请纠正我,这不是一种安全且文档完善的方法。您可以在此处找到没有剪裁的工作代码示例

更新:您面临的问题已有很长的历史,也存在于SO上:

https://dev59.com/FlHTa4cB1Zd3GeqPOQ4a

我遇到的问题是在相机拍摄图像后立即进行剪裁。此外,它在不同的Android版本之间不兼容,因此如果您在1.5中使其工作,可能无法在2.3中工作。绝对有些问题,如可以从Android Developer Group的帖子中得出结论:

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


谢谢。我在模拟器上尝试了你的代码,它可以正常工作。等待DroidX的反馈。 - user423715
1
尝试使用裁剪的方法,但对于直接从相机拍摄的图像(在Nexus One上观察到问题)确实无法正确工作。对于从图像库中获取的图片,裁剪效果良好。因此,刚刚从相机拍摄的图像URI肯定有些棘手的问题(它不是空的)。 - Zelimir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接