我的Android相机Uri返回一个空值,但三星修复已经到位,有帮助吗?

JMR*_*ies 20 camera android android-camera

所以我知道相机在三星设备上的问题.您需要在调用相机意图之前创建一个Uri,如下所示:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, m_username);
mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
Run Code Online (Sandbox Code Playgroud)

此示例为相机创建一个Uri来存储数据.我的应用程序在两个位置具有相机功能.两者都是相同的(直接复制粘贴),但在一个活动中,mImageUri对象在相机处理期间变为空,而在另一个活动中它不会.后者工作正常,但前者给出一个空值,这反过来阻止我保存图像,预览它等.我将提供下面的onResult代码:

case CAMERA_PIC_REQUEST :
if(resultCode == RESULT_OK) {
    if(intent != null) {
        //For non-Samsung devices
        Log.e("Intent value:", intent.toString());
        mImageUri = intent.getData();
    }

    mAvatar = BitmapStatic.createImage(mImageUri, this);
    Drawable draw = new BitmapDrawable(getResources(), mAvatar);
    m_photoButtonE.setImageDrawable(draw);
    m_imageChanged = true;
}
break;
Run Code Online (Sandbox Code Playgroud)

以上示例来自工作活动.以下是不起作用的活动:

//On pressing the "Take Photo" button:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, mUsername);
mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if(mImageUri == null) {
    Log.e("image uri is null", "what?");
}
else {
    Log.e("oh nevermind", "image uri is NOT null");
}
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

//On Result:
case CAMERA_PIC_REQUEST :
if(resultCode == RESULT_OK) {
    if(intent != null) {
        Log.e("Intent value:", intent.toString());
        mImageUri = intent.getData();
    }
    else {
        Log.e("Intent is null", "yep it is.");
        if(mImageUri == null) {
            Log.e("nullcheck on memberimageuri", "its null");
        }
        else {
            Log.e("nullcheckon memberimage", mImageUri.toString());
        }
    }
    mImage = BitmapStatic.createImage(mImageUri, this);
    Drawable draw = new BitmapDrawable(getResources(), mImage);
    mPhotoPreview.setImageDrawable(draw);
}
break;
Run Code Online (Sandbox Code Playgroud)

请注意我在第二个例子中添加的日志文件.单击"拍照"按钮时,mImageUri对象的空检查返回true.所以这个对象不是null.但是在拍照过程中的某个地方,值DOES变为空.onResult()期间的第二次检查返回false.同样,这几乎与我在其他活动中的设置完全相同,它可以正常工作.

有什么想法吗?

Ser*_*nko 64

您的活动在Camera活动操作期间被销毁,之后重新创建.您应该在活动中使用onSaveInstanceState/onRestoreInstanceState机制来保留活动重新启动时的图像URI(以及任何其他数据).

像这样:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (mImageUri != null) {
        outState.putString("cameraImageUri", mImageUri.toString());
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    if (savedInstanceState.containsKey("cameraImageUri")) {
        mImageUri = Uri.parse(savedInstanceState.getString("cameraImageUri"));
    }
}
Run Code Online (Sandbox Code Playgroud)