Jadi pada dasarnya apa yang saya mencoba untuk mencapai membuka Galeri
di Android dan membiarkan pengguna memilih beberapa gambar
. Sekarang pertanyaan ini telah diajukan sering tapi aku'm tidak puas dengan jawaban. Terutama karena saya menemukan sesuatu yang menarik di de docs dalam IDE (saya datang kembali tentang ini nanti) dan dengan demikian saya don't ingin menggunakan custom adapter tetapi hanya vanili satu.
Sekarang saya kode untuk memilih salah satu gambar adalah:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Sekarang orang-Orang pada JADI dan situs-situs lain akan memberitahu anda anda memiliki 2 pilihan:
tidak menggunakan ACTION_GET_CONTENT
tapi ACTION_SEND_MULTIPLE
sebagai gantinya.
yang satu Ini doesn't bekerja. Yang satu ini menurut docs untuk mengirimkan
file dan tidak mengambil
dan's persis apa yang dilakukannya. Ketika menggunakan ACTION_SEND_MULTIPLE aku punya jendela dibuka di perangkat saya di mana saya harus memilih sebuah aplikasi untuk mengirim data saya untuk. Yang's tidak apa yang saya inginkan, jadi saya bertanya-tanya bagaimana orang-orang yang punya ini dicapai dengan solusi ini.. Apa aku melewatkan sesuatu?
Menerapkan custom Galeri
. Sekarang ini adalah pilihan terakhir yang saya akan mempertimbangkan karena imho's tidak apa yang saya cari karena saya memiliki gaya sendiri DAN mengapa sih anda hanya dapat't pilih beberapa gambar di vanilla gallery?
Harus ada pilihan bagi ini.. Sekarang hal yang menarik dari apa yang saya'v temukan adalah ini:
saya menemukan ini di docs keterangan dari ACTION_GET_CONTENT
.
Jika penelepon dapat menangani beberapa item yang dikembalikan (user melakukan beberapa pilihan), maka dapat menentukan EXTRA_ALLOW_MULTIPLE untuk menunjukkan hal ini.
Ini cukup menarik. Di sini mereka merujuk kepada penggunaan kasus di mana pengguna dapat memilih beberapa item?
Kemudian mereka mengatakan dalam dokumen:
Anda dapat menggunakan EXTRA_ALLOW_MULTIPLE untuk memungkinkan pengguna untuk memilih beberapa barang-barang.
Jadi, ini adalah cukup jelas kan? Ini adalah apa yang saya butuhkan. Tapi saya berikut pertanyaannya adalah: di Mana saya dapat menempatkan ini EXTRA_ALLOW_MULTIPLE
? Yang menyedihkan adalah bahwa saya dapat't menemukan ini tidak ada tempat di pengembang.panduan android dan juga ini tidak didefinisikan sebagai suatu konstan di MAKSUD kelas.
Ada yang bisa membantu saya dengan ini EXTRA_ALLOW_MULTIPLE
?
Yang EXTRA_ALLOW_MULTIPLE pilihan ditetapkan pada maksud dan tujuan melalui Niat.putExtra() metode:
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
Kode di atas akan terlihat seperti ini:
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Catatan: EXTRA_ALLOW_MULTIPLE
pilihan ini hanya tersedia di Android API 18 dan lebih tinggi.
Mendefinisikan variabel-variabel ini di kelas:
int PICK_IMAGE_MULTIPLE = 1;
String imageEncoded;
List<String> imagesEncodedList;
Let's Berasumsi bahwa onClick pada tombol ini akan membuka galeri untuk memilih gambar
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE);
Maka anda harus meng-override Metode onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
// When an Image is picked
if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK
&& null != data) {
// Get the Image from data
String[] filePathColumn = { MediaStore.Images.Media.DATA };
imagesEncodedList = new ArrayList<String>();
if(data.getData()!=null){
Uri mImageUri=data.getData();
// Get the cursor
Cursor cursor = getContentResolver().query(mImageUri,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
cursor.close();
} else {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
mArrayUri.add(uri);
// Get the cursor
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
imagesEncodedList.add(imageEncoded);
cursor.close();
}
Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
}
}
} else {
Toast.makeText(this, "You haven't picked Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
.show();
}
super.onActivityResult(requestCode, resultCode, data);
}
PERHATIKAN BAHWA: galeri doesn't memberikan anda kemampuan untuk memilih multi-gambar jadi kami di sini buka semua gambar studio yang dapat anda pilih multi-gambar dari mereka. dan don't lupa untuk menambahkan izin anda terwujud
PENTING:
getData(); untuk mendapatkan satu gambar tunggal dan I've disimpan di sini di imageEncoded String
jika pengguna memilih multi-gambar kemudian
mereka harus disimpan dalam daftar
Jadi, anda harus memeriksa yang null untuk menggunakan yang lain
Berharap anda memiliki sebuah usaha yang bagus dan lain-lain
Saya berharap jawaban ini isn't akhir. Karena widget galeri doesn't mendukung beberapa pilihan secara default, tetapi anda dapat kustom gridview yang diterima anda multiselect maksud. Pilihan lain adalah untuk memperpanjang tampilan galeri dan menambahkan kode anda sendiri untuk memungkinkan beberapa pilihan.
Ini adalah sederhana perpustakaan dapat melakukannya: https://github.com/luminousman/MultipleImagePick
Update:
Dari @ilsy's komentar, CustomGalleryActivity di perpustakaan ini menggunakan manageQuery
, yang usang, sehingga harus diubah ke getContentResolver().query()
dan kursor.close()
seperti jawaban
Banyak dari jawaban-jawaban ini memiliki kesamaan tapi semua hilang bagian yang paling penting yang di onActivityResult
, periksa apakah data.getClipDataadalah null **sebelum** memeriksa data.getData
Kode untuk memanggil file chooser:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*"); //allows any image file type. Change * to specific extension to limit it
//**The following line is the important one!
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURES); //SELECT_PICTURES is simply a global int used to check the calling intent in onActivityResult
Kode untuk mendapatkan semua dari gambar yang dipilih:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == SELECT_PICTURES) {
if(resultCode == Activity.RESULT_OK) {
if(data.getClipData() != null) {
int count = data.getClipData().getItemCount(); //evaluate the count before the for loop --- otherwise, the count is evaluated every loop.
for(int i = 0; i < count; i++)
Uri imageUri = data.getClipData().getItemAt(i).getUri();
//do something with the image (save it to some directory or whatever you need to do with it here)
}
} else if(data.getData() != null) {
String imagePath = data.getData().getPath();
//do something with the image (save it to some directory or whatever you need to do with it here)
}
}
}
}
Perhatikan bahwa Android's pemilih memiliki Foto dan Galeri yang tersedia di beberapa perangkat. Foto memungkinkan beberapa gambar yang akan dipilih. Galeri memungkinkan hanya satu pada suatu waktu.
Menginisialisasi instance:
private String imagePath;
private List<String> imagePathList;
Di onActivityResult Anda harus menulis ini, If-else 2 blok. Satu untuk satu gambar dan satu lagi untuk beberapa gambar.
if (requestCode == GALLERY_CODE && resultCode == RESULT_OK && data != null){
imagePathList = new ArrayList<>();
if(data.getClipData() != null){
int count = data.getClipData().getItemCount();
for (int i=0; i<count; i++){
Uri imageUri = data.getClipData().getItemAt(i).getUri();
getImageFilePath(imageUri);
}
}
else if(data.getData() != null){
Uri imgUri = data.getData();
getImageFilePath(imgUri);
}
}
Bagian yang paling penting, Mendapatkan Path Gambar dari uri:
public void getImageFilePath(Uri uri) {
File file = new File(uri.getPath());
String[] filePath = file.getPath().split(":");
String image_id = filePath[filePath.length - 1];
Cursor cursor = getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);
if (cursor!=null) {
cursor.moveToFirst();
imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
imagePathList.add(imagePath);
cursor.close();
}
}
Harap ini dapat membantu anda.
Aku punya null dari Kursor
.
Kemudian ditemukan solusi untuk mengkonversi Uri
menjadi Bitmap
yang bekerja sempurna.
Di sini adalah solusi yang bekerja untuk saya:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
{
if (resultCode == Activity.RESULT_OK) {
if (requestCode == YOUR_REQUEST_CODE) {
if (data != null) {
if (data.getData() != null) {
Uri contentURI = data.getData();
ex_one.setImageURI(contentURI);
Log.d(TAG, "onActivityResult: " + contentURI.toString());
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), contentURI);
} catch (IOException e) {
e.printStackTrace();
}
} else {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
Coba yang satu ini IntentChooser. Hanya menambahkan beberapa baris kode, saya melakukan sisanya untuk anda.
private void startImageChooserActivity() {
Intent intent = ImageChooserMaker.newChooser(MainActivity.this)
.add(new ImageChooser(true))
.create("Select Image");
startActivityForResult(intent, REQUEST_IMAGE_CHOOSER);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) {
List<Uri> imageUris = ImageChooserMaker.getPickMultipleImageResultUris(this, data);
}
}
PS: seperti yang disebutkan pada jawaban di atas, EXTRA_ALLOW_MULTIPLE ini hanya tersedia untuk API >= 18. Dan beberapa aplikasi galeri don't membuat fitur ini tersedia (Google Foto dan Dokumen (com.android.documentsui
) bekerja.
Saya juga punya masalah yang sama. Saya juga ingin agar pengguna bisa mengambil foto dengan mudah saat memilih foto dari galeri. Tidak't menemukan asli cara melakukan ini, oleh karena itu saya memutuskan untuk membuat sebuah proyek opensource. Itu adalah banyak seperti MultipleImagePick tapi hanya cara yang lebih baik untuk melaksanakan itu.
https://github.com/giljulio/android-multiple-image-picker
private static final RESULT_CODE_PICKER_IMAGES = 9000;
Intent intent = new Intent(this, SmartImagePicker.class);
startActivityForResult(intent, RESULT_CODE_PICKER_IMAGES);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case RESULT_CODE_PICKER_IMAGES:
if(resultCode == Activity.RESULT_OK){
Parcelable[] parcelableUris = data.getParcelableArrayExtra(ImagePickerActivity.TAG_IMAGE_URI);
//Java doesn't allow array casting, this is a little hack
Uri[] uris = new Uri[parcelableUris.length];
System.arraycopy(parcelableUris, 0, uris, 0, parcelableUris.length);
//Do something with the uris array
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
Hi kode di bawah ini bekerja baik-baik saja.
Cursor imagecursor1 = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
null, orderBy + " DESC");
this.imageUrls = new ArrayList<String>();
imageUrls.size();
for (int i = 0; i < imagecursor1.getCount(); i++) {
imagecursor1.moveToPosition(i);
int dataColumnIndex = imagecursor1
.getColumnIndex(MediaStore.Images.Media.DATA);
imageUrls.add(imagecursor1.getString(dataColumnIndex));
}
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_image)
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.cacheInMemory().cacheOnDisc().build();
imageAdapter = new ImageAdapter(this, imageUrls);
gridView = (GridView) findViewById(R.id.PhoneImageGrid);
gridView.setAdapter(imageAdapter);
Anda ingin klarifikasi lebih. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html
Smart android galeri dengan gambar beberapa pilihan tindakan.
Pertama membuat tombol aksi dan anda dapat menggunakannya untuk single/multiple
Untuk Satu gambar pilihan:-
Untuk Beberapa gambar pilihan:-
MainActivity.java
// For single image
Intent i = new Intent(Action.ACTION_PICK);
startActivityForResult(i, 100);
// For multiple images
Intent i = new Intent(Action.ACTION_MULTIPLE_PICK);
startActivityForResult(i, 200);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
adapter.clear();
viewSwitcher.setDisplayedChild(1);
String single_path = data.getStringExtra("single_path");
imageLoader.displayImage("file://" + single_path, imgSinglePick);
} else if (requestCode == 200 && resultCode == Activity.RESULT_OK) {
String[] all_path = data.getStringArrayExtra("all_path");
ArrayList<CustomGallery> dataT = new ArrayList<CustomGallery>();
for (String string : all_path) {
CustomGallery item = new CustomGallery();
item.sdcardPath = string;
dataT.add(item);
}
viewSwitcher.setDisplayedChild(0);
adapter.addAll(dataT);
}
}
Di AndroidManifest.xml
<activity android:name="CustomGalleryActivity" >
<intent-filter>
<action android:name="luminous.ACTION_PICK" />
<action android:name="luminous.ACTION_MULTIPLE_PICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>