首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android摄像头:采集图像数据时,intent返回null

Android摄像头:采集图像数据时,intent返回null
EN

Stack Overflow用户
提问于 2014-09-24 22:09:43
回答 2查看 1.3K关注 0票数 3

我正在使用一个按钮,它将调用设备摄像头。

代码语言:javascript
复制
private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(ImageUtils.MEDIA_TYPE_IMAGE);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

public Uri getOutputMediaFileUri(int type) {
    item = ImageUtils.getOutputMediaFile(type, getActivity());

    return item.getIcon();
}

而getOutputMediaFile()方法是,

代码语言:javascript
复制
public static ImageItem getOutputMediaFile(int type, Activity activity) {

    // External sdcard location
    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            IMAGE_DIRECTORY_NAME);

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                    + IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }

    // Create a media file name
    Date date = new Date();
    String timeStamp = CommonUtils.dateToString(date, "yyyyMMddHHmmss");
    String dateString = CommonUtils.dateToString(date,
            "yyyy/MM/dd HH:mm:ss");

    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");
    }

    else {
        return null;
    }

    ImageItem item = new ImageItem();
    item.setId(timeStamp);
    item.setmIcon(Uri.fromFile(mediaFile));
    item.setDate(dateString);
    item.setmSpans(1);

    // save image in on activity result

    return item;
}

在同一个活动中,我为图像结果调用了OnActivityResult方法,

代码语言:javascript
复制
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE
            && resultCode == RESULT_OK) {

        String[] fileColumn = { MediaStore.Images.Media.DATA };
        Cursor cursor = getActivity().getContentResolver().query(fileUri,
                fileColumn, null, null, null);
        String contentPath = null;
        if (cursor.moveToFirst()) {
            contentPath = cursor.getString(cursor
                    .getColumnIndex(fileColumn[0]));

            horseImage.setImageBitmap(ImageManager
                    .getImage(new ImageManagerRequest(contentPath)));

        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(getActivity(), "Capture Cancelled",
                    Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getActivity(), "Capture failed",
                    Toast.LENGTH_LONG).show();
        }

    }

}

运行这段代码时,我得到了以下错误日志。

代码语言:javascript
复制
09-24 19:17:10.250: E/AndroidRuntime(16995): FATAL EXCEPTION: main
09-24 19:17:10.250: E/AndroidRuntime(16995): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=198496, result=-1, data=null} to activity {com.eyepax.horseapp/com.eyepax.horseapp.ui.activities.MainActivity}: java.lang.NullPointerException
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.ActivityThread.access$1100(ActivityThread.java:130)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.os.Looper.loop(Looper.java:137)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.ActivityThread.main(ActivityThread.java:4745)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at java.lang.reflect.Method.invokeNative(Native Method)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at java.lang.reflect.Method.invoke(Method.java:511)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at dalvik.system.NativeStart.main(Native Method)
09-24 19:17:10.250: E/AndroidRuntime(16995): Caused by: java.lang.NullPointerException
09-24 19:17:10.250: E/AndroidRuntime(16995):    at com.eyepax.horseapp.ui.activities.AddHorseBasicInfo.onActivityResult(AddHorseBasicInfo.java:270)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:167)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.Activity.dispatchActivityResult(Activity.java:5192)
09-24 19:17:10.250: E/AndroidRuntime(16995):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
09-24 19:17:10.250: E/AndroidRuntime(16995):    ... 11 more

fileUri是一个全局变量。我看了很多例子,但我不能解决我的问题。很多例子给出了这种情况的发生,因为意图数据获取了null.then,i'm onActivityResult,如下所示,但是它是转义的。

代码语言:javascript
复制
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK
            && null != data) {}

帮我解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2014-09-24 22:12:54

图像的Uri应该包含在onActivityResult的data.getData()中

在一个旧项目中,我还使用了以下内容:

代码语言:javascript
复制
public static Uri getLastPhoto(Context context) {
    String[] columns = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_ADDED};

    ContentResolver cr = context.getContentResolver();
    Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null,
            MediaStore.MediaColumns.DATE_ADDED + " DESC");

    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String path = cursor.getString(columnIndex);

    cursor.close();

    return Uri.fromFile(new File(path));
}
票数 0
EN

Stack Overflow用户

发布于 2014-09-24 22:16:26

这在许多设备中都会发生。这是由于一些操作系统问题造成的。如果您传递要保存的图像的名称,并使用该名称进行检索,效果会更好。

代码语言:javascript
复制
capturedImagePath = MyApplication.cameraImageDirectory + "/camera"
                + num + ".png";
        File mFileTemp = new File(capturedImagePath);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        try {
            Uri mImageCaptureUri = null;
            String state = Environment.getExternalStorageState();
            mImageCaptureUri = Uri.fromFile(mFileTemp);
            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                    mImageCaptureUri);
            intent.putExtra("return-data", true); //$NON-NLS-1$
            startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
        } catch (ActivityNotFoundException e) {

            Log.d("camera fieldtip", "cannot take picture", e); //$NON-NLS-1$
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26019066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档