ギャラリーから画像を選択するときに一部端末でnullになる


ギャラリーから画像を選択して、アプリ内に持ってくるときに、URIをFileに変換していると思います。

こんな感じでIntentして

private Uri mImageUri; //画像のURI
private String image; //画像のパス
final private int IMAGE_SELECT = 10002;

//画像を選ぶイベント
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, IMAGE_SELECT);

こんな感じでonActivityResultして

@Override
protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
	// キャンセルボタンで戻ってきたときはRESULT_CANCELEDが入る
	if (resultCode == RESULT_OK) {
		switch (requestCode) {
		case intent_code1:
			break;
		case intent_code2:
			break;
		case IMAGE_SELECT:
			if (intent != null) {
				mImageUri = intent.getData();
				image = getPath(mImageUri);
			}
			break;
		default:
			break;
		}
	}
}

こんな感じで変換します

// uriからpathを取得するメソッド
public String getPath(Uri uri) {
	String[] projection = { MediaStore.Images.Media.DATA };
	Cursor cursor = managedQuery(uri, projection, null, null, null);
	int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
	cursor.moveToFirst();

	//無事取得できました
	String result = cursor.getString(column_index);
	return result;
}

しかし、一部端末ではこの方法で上手くいかなくなりました。
uriからpathに変換する過程で、nullになってしまうのです。

最初、原因は変換メソッドであるgetPath()にミスがあるのではないかと思いました。
が、しかしどうやら違うようで、実は、ギャラリーを立ち上げるintent部分に問題があったのです。
ただしいintentはこちら。

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "Select picture"), IMAGE_SELECT);

この”Select picture”の部分は、任意のメッセージを入れてください。
setActionの値が、Intent.ACTION_GET_CONTENTからIntent.ACTION_PICKになりました。
これで全ての端末で問題なくギャラリーの画像を取得できるようになりました。

何が問題なのかは解っていませんが、Intent.ACTION_GET_CONTENTでギャラリーを立ち上げたときは、削除したはずの古い画像も一覧に表示されていました。もちろんその古い画像は選択しませんでしたが、存在するはずの画像でもnullになったので、もしかしたら、ギャラリーのサムネイルを表示するためのキャッシュにアクセスしていたのかもしれません。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください