6

ICSを実行し、同じGoogleアカウントを使用しているタブレットと電話でアプリをテストしていました。一方で写真を撮ると、もう一方のデバイスに表示されます(Picasa経由で同期)。奇妙なことに、通常の操作を行うと、両方のデバイスに写真が表示されます

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);

ユーザーがギャラリーから画像を選択できるようにします。私のonActivityResult()は次のようになります:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != Activity.RESULT_OK) {
        return; // user cancelled
    }

    Uri imageUri = data.getData();
    if (imageUri == null) {
        // (code to show error message goes here)
        return;
    }

    // Get image path from media store
    String[] filePathColumn = { android.provider.MediaStore.MediaColumns.DATA };
    Cursor cursor = this.getContentResolver().query(imageUri, filePathColumn, null, null, null);

    if(cursor == null || !cursor.moveToFirst()) {
        // (code to show error message goes here)
        return;
    }

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String imagePath = cursor.getString(columnIndex);
    cursor.close();

    if (imagePath == null) {
        // error happens here
    }
}

imagePathがnullになる最後まで、すべて問題ありません。このコードは、デバイス上の他の写真では完全に機能しますが、同期された写真では機能しません。ロギングコードを少し追加した後、これは非常にまれですが(10,000枚の写真のうち1枚未満)、本番環境の一部のユーザーに発生しているようです。

ACTION_GET_CONTENTにローカルファイルのみを表示するEXTRA_LOCAL_ONLYフラグがあることを理解していますが、これはAPIバージョン11以降でのみ使用できます。ACTION_GET_CONTENTには、開くことができるデータのみを表示するCATEGORY_OPENABLEもあります。私のACTION_PICKインテントは、実際にはローカルまたはオープン可能ではない写真を何らかの形で(誤って?)表示していますか?ドキュメントによると、INTERNAL_CONTENT_URIの使用は、内部に保存されている写真のみを表示することを想定しています。

または、onActivityResult()コードに問題がありますか?私はたくさんの異なるバリエーションを見てきました:

  • data.getData()。getPath()がnullでないことを確認するためのチェック
  • MediaStore.MediaColumns.DATAの代わりにMediaStore.Images.Media.DATAをプロジェクションとして使用する
  • MediaStore.MediaColumns.DATAの代わりにMediaStore.Images.ImageColumns.DATAをプロジェクションとして使用する
  • getContentResolver()。query()の代わりにmanagedQuery()を使用してカーソルを取得する
  • CursorLoaderを使用してカーソルを取得する(API 11以降)
  • getColumnIndex()の代わりにgetColumnIndexOrThrow()を使用する
  • cursor.getColumnIndex(MediaStore.Images.Media.DATA)を呼び出し、次にcursor.moveToFirst()を呼び出します。
  • 列名として「userImage」を使用(getColumnIndex()のパラメーター)

これらの変更のいずれかで問題が解決しますか?

4

1 に答える 1

0

ここで説明した同様の問題がありました

ContentResolver を使用してインテント URI から直接 InputStream を開くことで修正しました。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(requestCode == ACTIVITYRESULT_CHOOSEPICTURE) {
    final InputStream ist = context.getContentResolver().openInputStream(intent.getData());
    final Bitmap bitmap = BitmapFactory.decodeStream(ist);
    ist.close();
  }
}
于 2013-03-11T01:25:36.210 に答える