android galeriden görüntüleri almak


197

Galeriden bir resim seçici oluşturmak istiyorum. Kod kullanıyorum

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

Benim sorunum bu aktivitede ve video dosyalarının görüntülenmesidir. Görüntülenen dosyaları bu aktivitede hiçbir video dosyasının gösterilmemesi için filtrelemenin bir yolu var mı?


3
Bu makalede, galeriden nasıl resim seçileceği açıklanmaktadır: androidbitmaps.blogspot.com/2015/04/…
Andy Res

Senin gibi bir soru daha var. stackoverflow.com/a/31382240/1835650
TeeTracker

Yanıtlar:


347

Kesinlikle. Bunu dene:

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

Sabit PICK_IMAGE sabitini oluşturmayı da unutmayın , böylece kullanıcının resim galerisinden ne zaman geri geldiğini anlayabilirsiniz. Etkinlik:

public static final int PICK_IMAGE = 1;

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

Resim galerisine böyle diyorum. Koyun ve sizin için işe yarayıp yaramadığını görün.

DÜZENLE:

Bu, Belgeler uygulamasını açar. Kullanıcının yüklemiş olabileceği galeri uygulamalarını da kullanmasına izin vermek için:

    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
Bu "Android Sistemi", "Belgeler" de 2 seçenek elde ediyorum. Android Sistem'i seçersem, bana Galeri ve Fotoğraflar sunuyor. Bu ara seçenek listesinden nasıl kurtulurum?
Uday

4
@ Bugün sadece varsayılanı ayarlamadığınız için. Sadece bırak :)
Tristan Wiley

13
PICK_IMAGE sabiti neye ayarlanmalıdır? "Sembol PICK_IMAGE" çözülemiyor
Michael

3
@Michael the PICK_IMAGE sabiti bu sınıfta sizin tarafınızdan belirlenen herhangi bir statik int değerini tutar , bu @Overridefonksiyon üzerinde daha fazla kullanılır onActivityResult(int requestCode, resultCode, Intent data), burada requestCodeherhangi bir işlem yapmadan önce parametreyi kontrol etmek için bu sabiti kullanmanız önerilir :)
Gabcvit

Bitmap'i onActivityResult (...) yönteminden aşağıdaki kodla alabilirsiniz (RESULT_OK varsayarak): Bitmap bitmap = data.getExtras (). GetParcelable ("data");
Shn_Android_Dev

197

Bazen, seçtiğiniz resimden bir dosya alamazsınız. Bunun nedeni seçilen kişinin Google+, Drive, Dropbox veya başka bir sağlayıcıdan gelmesidir.

En iyi çözüm, sistemden Intent.ACTION_GET_CONTENT aracılığıyla bir içerik seçmesini ve sonucu bir içerik sağlayıcıyla almasını istemektir .

Aşağıdaki kodu takip edebilir veya güncellenmiş özüme bakabilirsiniz .

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) {...}tespit etmek / iptal etmek için kullanılabilir
Thamme Gowda

Nasıl yol alabilirsin?
Delive

@delive, new File(data.getData()).getAbsolutePath()sanırım deneyebilirsin Sadece bir tahmin, ben denemedim
Birisi

1
İçinde Android Studio tarafından FileNotFound istisna uyarısı getActivity().getContentResolver().openInputStream(data.getData());.
İkbal

1
Bu, dosya yolunun döndürülmediği belirli aygıtlarda çalışır. Ancak, bir kez ben InputStream var - nasıl görüntünün yönünü belirlemek için bir yol göremiyorum.
Casey Perkins

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


}

Çok teşekkür ederim. Bu yanıt daha sonra görüntüyü yüklememe yardımcı oldu
Rosário Pereira Fernandes

OnActivityResult anahtarında durum 1: yerine durum -1: demek istediğini sanırım.
Mathias

newibe sorusu biliyorum ama, neden resim yolu almak için tüm bunları yaptım, ne data.getData sonra döner?
moumenShobakey

değeri pathnedir? inFile file = new File(path);
Ravi Vaniya

24

Galeriden resim seçmek için bu yöntemi kullanabilirsiniz. Sadece görüntüler gösterilecektir.

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);
}

ve onActivityResult as olarak geçersiz kıl

    @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 amacı için izin verilen ekstraların listesini nerede buldun? Teşekkürler!
Johnny Wu

1
Lütfen 23. düzey ve üstü için READ_EXTERNAL_STORAGE ve WRITE_EXTERNAL_STORAGE için çalışma zamanı izinleri eklemeyi unutmayın. Aksi takdirde galeriden bitmap'i null olarak alamazsınız. Bkz. Stackoverflow.com/a/35285667/3341089
oguzhan

1
URI ayarlandıktan sonra setType çağrıldığında veriler silinir.
Taslim Oseni

11

İşte istek izni (gerekirse) için tam bir örnek, galeriden resim seçin, ardından resmi bitmapveyafile

AndroidManifesh.xml

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

Aktivite

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
    }
}

Demo
https://github.com/PhanVanLinh/AndroidPickImage


Bu, özellikle o kırpma ve en boy oranı özelliğiyle bir kitaplıktan başka bir şey değildir. Böyle bir şeyin olduğunu asla bilmiyordum. Çok teşekkür ederim efendim.
Lalit Fauzdar

1
Buraya, ilk izlenimleri görmeyi umduğum kadar iyi değil. Snapseed ile düzenlendiğinde görüntüyü seçmiyor, çökme yok, ancak görüntü yok, huawei'nin varsayılan galeri uygulaması, düzenlemeden sonra bir sonraki tıkladığımda hiçbir şey yapmıyor, google fotoğraflarından seçildiğinde görüntüyü düzenlemiyor, geri getiriyor doğrudan olmadan. Sadece huawei'nin varsayılan galerisini ve düzenlemek için google fotoğraflarını seçersem iyi çalışır.
Lalit Fauzdar


2

Doküman başına API min 19 olan kişilerin cevabına bir güncelleme sunmak için:

Android 4.4 (API seviye 19) ve sonraki sürümlerde, kullanıcının diğer uygulamaların sunduğu tüm dosyalara göz atmasını sağlayan sistem kontrollü bir seçici kullanıcı arayüzü kontrollü ACTION_OPEN_DOCUMENT amacını kullanma seçeneğiniz vardır. Bu tek kullanıcı arayüzünden, kullanıcı desteklenen uygulamalardan herhangi birinden dosya seçebilir.

Android 5.0 (API düzey 21) ve sonraki sürümlerde, kullanıcının istemci uygulaması için bir dizin seçmesine izin veren ACTION_OPEN_DOCUMENT_TREE amacını da kullanabilirsiniz.

Depolama erişimi çerçevesini kullanarak dosyaları açma - Android Belgeleri

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

0

Yalnızca yerel seçim için şunu ekleyin:

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

Ve bu iyi çalışıyor:

    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 bu cevaplardan daha kolay yapabilir:

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

Ben yaptım ve işe yaradı. u sunucuya göndermek için örneğin dosya kullanmanız gerekiyorsa u başka yollar kullanmak zorunda ama sadece bir görüntü yüklemek için u bu kolay çözüm yapabilirsiniz.
Alireza Taghizadeh

5
SO hoş geldiniz! Kendi yayınınıza yorum yapmak yerine yayınınızı da düzenleyebilirsiniz. Yorumunuzun cevabı açıklaması gerekiyorsa, neden cevabın kendisine koymuyorsunuz? Şahsen, bu eski soruya (geç) cevabınızın soru ile nasıl ilişkili olduğunu görmüyorum. Henüz kabul edilmiş bir cevabı olmayan soruları cevaplamaya odaklanmayı önerebilir miyim?
cfi

1
Android soruları bulamıyorum. sadece android sorularını nasıl görebilirim?
Alireza Taghizadeh

3
Lütfen yardım sayfalarını okuyun. Ayrıca, yorumlar sitenin nasıl çalıştığıyla ilgili tartışmalar için değildir, diğer kullanıcılarla canlı tartışmalar için sohbet odalarını kullanabilir ve Meta (
yardım-
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.