androidギャラリーから画像を選択


196

ギャラリーから画像選択を作成したい。コードを使用

 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(intent, TFRequestCodes.GALLERY);

私の問題は、このアクティビティとビデオファイルが表示されることです。表示されたファイルをフィルタリングして、このアクティビティでビデオファイルが表示されないようにする方法はありますか?


3
:この記事ではうまくギャラリーから画像を選択する方法について説明しandroidbitmaps.blogspot.com/2015/04/...
アンディRES

あなたと同じような質問が1つあります。 stackoverflow.com/a/31382240/1835650
TeeTracker

回答:


346

もちろんです。これを試して:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

また、定数PICK_IMAGEを作成することも忘れないでください。そうすれば、ユーザーが画像ギャラリーアクティビティから戻ってきたことがわかります。

public static final int PICK_IMAGE = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == PICK_IMAGE) {
        //TODO: action
    }
}

それが私がイメージギャラリーと呼ぶ方法です。それを入れて、それがあなたのために働くかどうか見てください。

編集:

これにより、ドキュメントアプリが表示されます。ユーザーがインストールした可能性のあるギャラリーアプリも使用できるようにするには:

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    getIntent.setType("image/*");

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, PICK_IMAGE);

6
この「Androidシステム」、「ドキュメント」の2つのオプションがあります。Androidシステムを選択すると、ギャラリーと写真が表示されます。この中間オプションリストを削除するにはどうすればよいですか?
2015

4
@Udayこれは、単にデフォルトを設定していないためです。そのままにしておいてください:)
Tristan Wiley

13
PICK_IMAGE定数には何を設定する必要がありますか?「シンボル「PICK_IMAGE」を解決できません
マイケル

3
@Michael PICK_IMAGE定数は、このクラスでユーザーが決定した静的なint値を保持します。これはさらに@Override関数onActivityResult(int requestCode, resultCode, Intent data)で使用されrequestCodeます。アクションを実行する前に、この定数を使用してパラメーターを確認することをお勧めします:)
Gabriel Checchia Vitali

次のコード(RESULT_OKを想定)を使用すると、onActivityResult(...)メソッドからビットマップを取得できます。
Shn_Android_Dev 2018年

197

選択した画像からファイルを取得できない場合があります。それは、選ばれたものがGoogle+、ドライブ、Dropbox、または他のプロバイダーからのものだったからです。

最善の解決策は、Intent.ACTION_GET_CONTENTを介してコンテンツを選択し、コンテンツプロバイダーで結果を取得するようにシステムに要求することです。

あなたは以下のコードに従うか、私の更新された要点を見ることができます

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

14
if(resultCode == Activity.RESULT_OK) {...}成功/キャンセルを検出するために使用できます
Thamme Gowda 2014

どうすればパスを取得できますか?
2015年

@delive、私はあなたが試してみることができると思いますnew File(data.getData()).getAbsolutePath()推測、私はそれを試していません
誰かどこか

1
のフラグメントでのAndroid StudioによるFileNotFound例外警告getActivity().getContentResolver().openInputStream(data.getData());
Iqbal 2016年

1
これは、ファイルのパスが返されない特定のデバイスで機能します。ただし、InputStreamを取得したら、画像の向きを判別する方法を確認する方法はありません。
ケーシーパーキンス

30
public void FromCamera() {

    Log.i("camera", "startCameraActivity()");
    File file = new File(path);
    Uri outputFileUri = Uri.fromFile(file);
    Intent intent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, 1);

}

public void FromCard() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 2);
}

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2 && resultCode == RESULT_OK
            && null != data) {

        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

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

        bitmap = BitmapFactory.decodeFile(picturePath);
        image.setImageBitmap(bitmap);

        if (bitmap != null) {
            ImageView rotate = (ImageView) findViewById(R.id.rotate);

        }

    } else {

        Log.i("SonaSys", "resultCode: " + resultCode);
        switch (resultCode) {
        case 0:
            Log.i("SonaSys", "User cancelled");
            break;
        case -1:
            onPhotoTaken();
            break;

        }

    }

}

protected void onPhotoTaken() {
    // Log message
    Log.i("SonaSys", "onPhotoTaken");
    taken = true;
    imgCapFlag = true;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    bitmap = BitmapFactory.decodeFile(path, options);
    image.setImageBitmap(bitmap);


}

どうもありがとうございました。この答えは、私が後に画像をアップロードする助け
ロザリオ・ペレイラ・フェルナンデス

OnActivityResultのスイッチで、ケース-1:ではなく、ケース1:を意味していると思います。
Mathias

私はそれが新しい質問であることを知っていますが、なぜ画像パスを取得するためにこれをすべて実行したのですか?data.getDataは何を返しますか?
moumenShobakey

の価値はpath何ですか?中File file = new File(path);
ラヴィVaniya

23

このメソッドを使用して、ギャラリーから画像を選択できます。画像のみが表示されます。

public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("scale", true);
    intent.putExtra("outputX", 256);
    intent.putExtra("outputY", 256);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
}

そしてonActivityResultを次のようにオーバーライドします

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == 1) {
            final Bundle extras = data.getExtras();
            if (extras != null) {
                //Get image
                Bitmap newProfilePic = extras.getParcelable("data");
            }
        }
    }

2
@Abhishek ... ACTION_PICKインテントに許可されているエクストラのリストはどこで見つけましたか?ありがとう!
Johnny Wu

1
APIレベル23以上の場合、READ_EXTERNAL_STORAGEおよびWRITE_EXTERNAL_STORAGEの実行時権限を追加することを忘れないでください。そうしないと、ギャラリーからビットマップをnullとして取得できない場合があります。stackoverflow.com/a/35285667/3341089を
oguzhan

1
URIを設定した後にsetTypeを呼び出すと、データがクリアされます。
Taslim Oseni

11

これは、リクエストの許可(必要な場合)の完全な例であり、ギャラリーから画像を選択してから、画像をbitmapまたはに変換しますfile

AndroidManifesh.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

アクティビティ

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

デモ
https://github.com/PhanVanLinh/AndroidPickImage


これは、特にそのクロップとアスペクト比機能を備えたライブラリに他なりません。そのようなことが存在することを私は知りませんでした。ありがとうございます。
Lalit Fauzdar

1
ここに戻って、第一印象を期待していたほど良くない。スナップシードで編集しても画像は選択されず、クラッシュはありませんが画像はありません。Huaweiのデフォルトのギャラリーアプリは、編集後に次をクリックしても何も実行せず、Googleフォトから選択したときに画像を編集せず、元に戻しますそれなしで直接。huaweiのデフォルトのギャラリーとグーグルの写真を選択して編集した場合にのみ機能します。
Lalit Fauzdar


2

ドキュメントに従って、API min 19の人々に回答の更新を提供するだけです:

Android 4.4(APIレベル19)以降では、ACTION_OPEN_DOCUMENTインテントを使用する追加オプションがあり、他のアプリが利用可能にしたすべてのファイルをユーザーが閲覧できるように制御されるシステム制御のピッカーUIを表示します。この単一のUIから、ユーザーはサポートされている任意のアプリからファイルを選択できます。

Android 5.0(APIレベル21)以降では、ACTION_OPEN_DOCUMENT_TREEインテントを使用して、ユーザーがクライアントアプリがアクセスするディレクトリを選択することもできます。

ストレージアクセスフレームワークを使用してファイルを開く-Android Docs

     val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
     intent.type = "image/*"
     startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)

0

ローカルから選ぶだけの場合はこれを追加してください:

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

そして、これはうまくいきます:

    val i = Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    i.type = "image/*"
    i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)
    startActivityForResult(Intent.createChooser(i,"Select Photo"),pickImageRequestCode)

-7

Uはこの答えよりも簡単に行うことができます:

Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);

私はそれをやって、それはうまくいった。たとえば、サーバーに送信するためにファイルを使用する必要がある場合は、他の方法を使用する必要がありますが、イメージをimageviewにロードするためだけに、この簡単なソリューションを実行できます。
Alireza Taghizadeh 2015年

5
SOへようこそ!自分の投稿にコメントする代わりに、投稿を編集することもできます。あなたのコメントが答えを説明することになっているなら、なぜそれを答え自体に入れませんか?個人的には、この古い質問に対するあなたの(遅い)回答が質問とどのように関連しているかはわかりません。まず、まだ受け入れられていない質問への回答に集中することをお勧めしますか?
cfi 2015年

1
私はアンドロイドの質問を見つけることができません。Androidの質問だけを表示するにはどうすればよいですか?
Alireza Taghizadeh 2015年

3
ヘルプページをお読みください。また、コメントはサイトの仕組みに関するディスカッション用ではなく、チャットルームを使用して他のユーザーとのライブディスカッションを行うことができます。また、メタ(ヘルプ
cfi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.