web-dev-qa-db-ja.com

私のAndroidカメラのURIはnull値を返しますが、Samsungの修正は実施されています。助けてください。

だから私はサムスンのデバイスでカメラの問題を認識しています。次のようにカメラインテントを呼び出す前に、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);

この例では、カメラがデータを保存するためのURIを作成します。私のアプリには2つの場所にカメラ機能があります。どちらも同じです(直接コピー貼り付け)が、一方のアクティビティではmImageUriオブジェクトがカメラ処理中にヌルになり、もう一方のアクティビティではヌルになりません。後者は正常に機能しますが、前者はnull値を与えるため、画像の保存やプレビューなどができなくなります。以下に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;

上記の例は、作業アクティビティからのものです。以下は、これが機能しないアクティビティです。

//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;

この2番目の例に置いたログファイルに注目してください。 [写真を撮る]ボタンをクリックすると、mImageUriオブジェクトのnullチェックがtrueを返します。したがって、このオブジェクトはnullではありません。しかし、写真撮影プロセスのどこかで、その値はnullになります。 onResult()中の2番目のチェックはfalseを返します。繰り返しますが、これは他のアクティビティでの私の設定とほぼ同じで、正常に機能します。

何かご意見は?

20
JMRboosties

カメラアクティビティの操作中にアクティビティが破棄され、後で再作成されます。アクティビティの再起動時にイメージURI(およびその他のデータ)を保持するには、アクティビティで onSaveInstanceState / onRestoreInstanceState メカニズムを使用する必要があります。

このような:

@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"));
    }
}
64

最初に初期(一時)ファイルを作成してから、インテントでURIを渡すことをお勧めします。関数「onActivityResult()」には、画像が入力されたファイルがあります。

File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folderName");
dir.mkdirs();

if (dir.exists()) {
    try {
        imageFile = File.createTempFile("IMG_", ".jpg", dir);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

if (imageFile != null) {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
    activity.startActivityForResult(cameraIntent, REQUEST_CODE);
} 
3
armansimonyan13