相机活动返回null android

raw*_*064 60 android android-camera

我正在构建一个应用程序,我希望通过默认的相机活动捕获图像并返回到我的活动并在ImageView中加载该图像.问题是相机活动总是返回null.在我的onActivityResult(int requestCode, int resultCode, Intent data)方法中,我得到数据null.这是我的代码:

public class CameraCapture extends Activity {

    protected boolean _taken = true;
    File sdImageMainDirectory;
    Uri outputFileUri;

    protected static final String PHOTO_TAKEN = "photo_taken";
    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        try {

            super.onCreate(savedInstanceState);   
            setContentView(R.layout.cameracapturedimage);
                    File root = new File(Environment
                            .getExternalStorageDirectory()
                            + File.separator + "myDir" + File.separator);
                    root.mkdirs();
                    sdImageMainDirectory = new File(root, "myPicName");



                startCameraActivity();

        } catch (Exception e) {
            finish();
            Toast.makeText(this, "Error occured. Please try again later.",
                    Toast.LENGTH_SHORT).show();
        }

    }

    protected void startCameraActivity() {

        outputFileUri = Uri.fromFile(sdImageMainDirectory);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        switch (requestCode) {
        case CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE:
        {
            if(resultCode==Activity.RESULT_OK)
            {
                try{
                ImageView imageView=(ImageView)findViewById(R.id.cameraImage);
                imageView.setImageBitmap((Bitmap) data.getExtras().get("data"));
                }
                catch (Exception e) {
                    // TODO: handle exception
                }
            }

            break;
        }

        default:
            break;
        }
    }

     @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
            _taken = true;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
    }
}
Run Code Online (Sandbox Code Playgroud)

我做错了吗?

Dha*_*dra 108

你错了,因为你做错了.

如果您MediaStore.EXTRA_OUTPUT使用相机意图传递额外参数,则相机活动会将捕获的图像写入该路径,并且不会返回onActivityResult方法中的位图.

如果您要检查通过的路径,那么您将知道实际上相机已在该路径中写入捕获的文件.

欲了解更多信息,你可以按照这个,这个这个

  • 如果指定要保存的URI,则"Intent"将返回"null"是没有意义的.您仍然可以访问"Intent"并从中获取照片的URI等. (16认同)
  • 所有这些都是可怕的记录.Android docs示例应用程序不起作用.http://developer.android.com/training/camera/photobasics.html会产生与OP所说的相同的错误. (12认同)
  • 这么简单的事情需要这么复杂的动作,这就是Android开发中真正糟糕的事情. (10认同)
  • 就像你说的那样,指定一个URI会导致缩略图在OnActivityResult中变得不可用.但是,如果您的应用需要高分辨率和低分辨率,可以按照[this](http://blog-emildesign.rhcloud.com/?p=590) (3认同)

noo*_*oob 18

我是以另一种方式做的.data.getData()字段不保证返回一个Uri,所以我检查它是否为null,如果是,那么图像是额外的.所以代码是 -

if(data.getData()==null){
    bitmap = (Bitmap)data.getExtras().get("data");
}else{
    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData());
}
Run Code Online (Sandbox Code Playgroud)

我在生产应用程序中使用此代码,它正在工作.

  • 如果`data`为null,你怎么能调用`getData()`? (41认同)
  • 请注意,通过使用data.getExtras().get("data"),您将无法获取完整大小的位图!这将是一个缩略图.在制作应用程序中它似乎相当难看...... (6认同)

Mer*_*lin 6

我遇到了类似的问题.我在清单文件中注释掉了一些行,导致缩略图数据返回为null.

您需要以下内容才能使其正常工作:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
Run Code Online (Sandbox Code Playgroud)

我希望这能解决你的问题

如果您的手机是三星,则可能与此相关http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

还有另一个未解决的问题可能会提供更多信息