5

これに関連する S/O に関する他のいくつかの質問を見てきましたが、私の問題に最も近い質問には多くの回答が得られていないようです ( Xiaomi MI デバイスがギャラリーから画像を選択していません)。この質問がうまくいくことを願っています。

電話のギャラリーから画像を選択し、画像のパスを別のアクティビティに渡して、ユーザー向けにプレビューしようとしています。

他の 2 つのデバイス (Moto E と Coolpad と呼ばれるもの?) でこれをテストしましたが、どちらも問題なく動作しているようです。

(Android ソース コードのデバッグは実用的なオプションではないようです。)

メイン アクティビティでは、UI トリガーで、次のコードを使用してギャラリー ピッカーを起動します。

private void dispatchPickPictureIntent() {
        Intent pickPictureIntent = new Intent(Intent.ACTION_PICK);
        pickPictureIntent.setType("image/*");
        startActivityForResult(pickPictureIntent, REQUEST_IMAGE_PICK);
    }

結果を次のように処理します。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_PICK && resultCode == RESULT_OK) {
        Uri selectedImage = data.getData();
        mCurrentPhotoPath = getRealPathFromURI(this, selectedImage);
        launchUploadActivity();
    }
}

private String getRealPathFromURI(Context context, Uri uri) {
    Cursor cursor = null;
    try {
        String [] proj = {MediaStore.Images.Media.DATA};
        cursor = context.getContentResolver().query(uri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null)
            cursor.close();
    }
}

グローバル変数に格納されたファイル パスを取得したらmCurrentPhotoPath、次のメソッドが呼び出されます。

private void launchUploadActivity() {
    Intent intent = new Intent(HomeActivity.this, UploadActivity.class);
    intent.putExtra(getString(R.string.photo_path), mCurrentPhotoPath);
    startActivityForResult(intent, REQUEST_IMAGE_UPLOAD);
}

Redmiでもここまではスムーズに動いています。UploadActivity の onCreate メソッドで、画像ファイルのパス文字列を正常に受け取りました。

しかし、それから、私は画像をプレビューしようとします:

private void previewPhoto() {
    imageView.setVisibility(View.VISIBLE);
    BitmapFactory.Options options = new BitmapFactory.Options();

    // Avoid OutOfMemory Exception
    options.inSampleSize = 8;

    // This line returns a null, only on the Xiaomi device
    final Bitmap bitmap = BitmapFactory.decodeFile(photopath, options);

    imageView.setImageBitmap(bitmap);
}

今、私はこの問題をデバッグしようとしましたが、BitmapFactory のソース コードに足を踏み入れると、Android Studio ( https://stackoverflow.com/a/40566459/3438497 ) で解決されていないように見える問題に遭遇し、役に立たなくなります。

ここから先に進む方法についての指針をいただければ幸いです。

4

3 に答える 3