安卓:NPE正从摄像机画面出现时, [英] Android: NPE happens when getting picture from camera

查看:322
本文介绍了安卓:NPE正从摄像机画面出现时,的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的Andr​​oid应用程序有问题。我使用MediaStore.ACTION_IM​​AGE_CAPTURE意图采取从摄像机画面。它的工作全部大多数设备,但我从Android Market获得DroidX设备上的下列崩溃的错误。

我觉得imageCaptureUri不能在这种情况下为空。因此,它是不是原因。

你有什么想法?它是一个固件错误?


显示java.lang.NullPointerException
在android.content.ContentResolver.openInputStream(ContentResolver.java:286)
在com.eb.android.activity.AddActivity.getBase64Receipt(AddActivity.java:193)
在com.eb.android.activity.AddActivity.publishReceipt(AddActivity.java:204)
在com.eb.android.activity.AddActivity.access $ 0(AddActivity.java:203)
在com.eb.android.activity.AddActivity $ 1.run(AddActivity.java:50)
在java.lang.Thread.run(Thread.java:1102)-------------显示java.lang.NullPointerException
在android.content.ContentResolver.openInputStream(ContentResolver.java:288)
在com.eb.android.activity.AddActivity.getBase64Receipt(AddActivity.java:193)
在com.eb.android.activity.AddActivity.publishReceipt(AddActivity.java:204)
在com.eb.android.activity.AddActivity.access $ 0(AddActivity.java:203)
在com.eb.android.activity.AddActivity $ 1.run(AddActivity.java:50)
在java.lang.Thread.run(Thread.java:1096)

这是我的执行:


公共类AddActivity延伸活动{    公共静态最终诠释TAKE_RECEIPT = 2;    私人乌里imageCaptureUri;    私人Runnable接口submitReceiptRunnable =新的Runnable(){
        公共无效的run(){
            publishReceipt();
        }
    };    私人ProgressDialog progressDialog;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.add);        registerListeners();
    }    公共无效的onActivityResult(INT REQ code,INT结果code,意图数据){
        super.onActivityResult(REQ code,结果code,数据);        开关(REQ code){
        案例(TAKE_RECEIPT):
            takeReceiptCallback(结果code,数据);
            打破;
        }
    }    私人无效registerListeners(){
        ImageView的addReceiptButton =(ImageView的)findViewById(R.id.AddReceiptButton);
        addReceiptButton.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
                takePictureFromCamera();
            }
        });
    }    私人无效takePictureFromCamera(){
        意向意图=新意图(MediaStore.ACTION_IM​​AGE_CAPTURE);        imageCaptureUri = Uri.fromFile(新文件(Environment.getExternalStorageDirectory(),tmp_receipt_
                +将String.valueOf(System.currentTimeMillis的())+.JPG));        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,imageCaptureUri);
        intent.putExtra(回归数据,真正的);        startActivityForResult(意向,TAKE_RECEIPT);
    }    私人无效takeReceiptCallback(INT结果code,意图数据){
        如果(结果code == Activity.RESULT_OK){
            submitReceipt();
        }
    }    私人无效submitReceipt(){
        线程线程=新主题(NULL,submitReceiptRunnable);
        thread.start();
        progressDialog = ProgressDialog.show(这一点,请稍候...,出版收据......,真);
    }    私人字符串getBase64Receipt(){
        尝试{
            为InputStream的InputStream = getContentResolver()openInputStream(imageCaptureUri)。
            字节[]字节= CommonUtil.getBytesFromInputStream(InputStream的);
            返回Base64.en codeBytes(字节);
        }赶上(IOException异常五){
            Log.e(TAG,e.getMessage(),E);
        }        返回null;
    }    私人无效publishReceipt(){
        字符串收据= getBase64Receipt();        ...
    }
}


解决方案

您确定图像裁切模式强制

  intent.putExtra(返回数据,真正的);

工作正常您所使用的设备。纠正我,如果我错了,但它不是安全,无据可查的做法。在这里,你可以找到例子<一个href=\"http://stackoverflow.com/questions/4184951/get-path-of-image-from-action-image-capture-intent/4185511#4185511\">working code 无需裁剪。

更新:你正面临着​​发行有悠久的历史,也是在这样:

<一个href=\"http://stackoverflow.com/questions/4184951/get-path-of-image-from-action-image-capture-intent/4185511#4185511\">http://stackoverflow.com/questions/3904685/unable-to-find-com-android-camera-cropimage-activity-in-android

问题我经历是用图像的照相机拍摄后immediatelly作物。此外,它是不是通过不同的Andr​​oid版本兼容,所以如果你搞不定1.5也许不会为2.3工作。肯定什么是错的,因为可以从Android开发者集团的职位得出结论:

<一个href=\"http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/569f36b5b28f2661?lnk=gst&q=Crop+image+intent#569f36b5b28f2661\" rel=\"nofollow\">http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/569f36b5b28f2661?lnk=gst&q=Crop+image+intent#569f36b5b28f2661

<一个href=\"http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/dcbe5aef29eddad6?lnk=gst&q=Crop+image+intent#dcbe5aef29eddad6\" rel=\"nofollow\">http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/dcbe5aef29eddad6?lnk=gst&q=Crop+image+intent#dcbe5aef29eddad6

<一个href=\"http://groups.google.com/group/android-developers/browse_thread/thread/d7b6a133c164aa17/184bf3b85da2ce58?lnk=gst&q=Crop+image+intent#184bf3b85da2ce58\" rel=\"nofollow\">http://groups.google.com/group/android-developers/browse_thread/thread/d7b6a133c164aa17/184bf3b85da2ce58?lnk=gst&q=Crop+image+intent#184bf3b85da2ce58

I have a problem on my Android app. I'm using MediaStore.ACTION_IMAGE_CAPTURE intent to take picture from camera. It worked all most of devices but I got the following crash errors on DroidX device from android market.

I think imageCaptureUri CANNOT be null in this case. So it is not the cause.

Do you have any ideas? Is it a firmware error?

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)

This is my implementation:

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

        ...
    }
}

解决方案

Are you sure that image crop mode forcing

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

works correctly for the device you use. Correct me if I am wrong, but it is not safe and not well documented approach. Here you can find example of working code without cropping.

UPDATE: Issue you are facing with has long history, also at SO:

http://stackoverflow.com/questions/3904685/unable-to-find-com-android-camera-cropimage-activity-in-android

Issue I experienced was using crop immediatelly after image was taken by the camera. Also, it is not compatible through different Android versions, so if you get it working for 1.5 maybe it will not work for 2.3. Definitely something is wrong, as may be concluded from the Android Developer Group posts:

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

这篇关于安卓:NPE正从摄像机画面出现时,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆