如何从android中的图库中选择多个图像?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23426113/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to select multiple images from gallery in android?
提问by nawaab saab
I am making a project in which i want to select multiple photos from gallery and want to save that in imageview array. I am able to import single image and save at imageview Can anyone tell please how may i import multiple images and save in array or different imageviews?
我正在制作一个项目,我想从图库中选择多张照片并将其保存在 imageview 数组中。我能够导入单个图像并保存在 imageview 谁能告诉我如何导入多个图像并保存在数组或不同的图像视图中?
MainActivity extends Activity implements OnClickListener {
Button addphoto, save;
ImageView img1[];
Bitmap yourbitmap, resized;
int RESULT_LOAD_IMAGE1 =1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addphoto = (Button)findViewById(R.id.add);
img1[0] = (ImageView)findViewById(R.id.imageView1);
save = (Button)findViewById(R.id.save);
addphoto.setOnClickListener(this);
save.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch(arg0.getId()){
case R.id.add:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), RESULT_LOAD_IMAGE1);
break;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE1 && 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();
try {
yourbitmap = BitmapFactory.decodeFile(picturePath);
resized= Bitmap.createScaledBitmap(yourbitmap, 200,300, true);
img1[0].setImageBitmap(resized);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
回答by Haresh Chhelana
Implement custom gallery selector with below code :
使用以下代码实现自定义图库选择器:
activity_main
活动主
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/scroll1"
>
<LinearLayout
android:id="@+id/lnrImages"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/linearLayout">
<Button
android:id="@+id/btnAddPhots"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Add Phots"/>
<Button
android:id="@+id/btnSaveImages"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Save"/>
</LinearLayout>
custom_gallery
custom_gallery
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<GridView
android:id="@+id/grdImages"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:columnWidth="90dp"
android:stretchMode="columnWidth"
android:gravity="center"/>
<Button
android:id="@+id/btnSelect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select"
android:layout_marginTop="5dp"/>
</LinearLayout>
custom_gallery_item
custom_gallery_item
<ImageView
android:id="@+id/imgThumb"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<CheckBox
android:id="@+id/chkImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|right"/>
</FrameLayout>
MainActivity
主要活动
public class MainActivity extends Activity implements View.OnClickListener{
private LinearLayout lnrImages;
private Button btnAddPhots;
private Button btnSaveImages;
private ArrayList<String> imagesPathList;
private Bitmap yourbitmap;
private Bitmap resized;
private final int PICK_IMAGE_MULTIPLE =1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lnrImages = (LinearLayout)findViewById(R.id.lnrImages);
btnAddPhots = (Button)findViewById(R.id.btnAddPhots);
btnSaveImages = (Button)findViewById(R.id.btnSaveImages);
btnAddPhots.setOnClickListener(this);
btnSaveImages.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnAddPhots:
Intent intent = new Intent(MainActivity.this,CustomPhotoGalleryActivity.class);
startActivityForResult(intent,PICK_IMAGE_MULTIPLE);
break;
case R.id.btnSaveImages:
if(imagesPathList !=null){
if(imagesPathList.size()>1) {
Toast.makeText(MainActivity.this, imagesPathList.size() + " no of images are selected", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, imagesPathList.size() + " no of image are selected", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(MainActivity.this," no images are selected", Toast.LENGTH_SHORT).show();
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if(requestCode == PICK_IMAGE_MULTIPLE){
imagesPathList = new ArrayList<String>();
String[] imagesPath = data.getStringExtra("data").split("\|");
try{
lnrImages.removeAllViews();
}catch (Throwable e){
e.printStackTrace();
}
for (int i=0;i<imagesPath.length;i++){
imagesPathList.add(imagesPath[i]);
yourbitmap = BitmapFactory.decodeFile(imagesPath[i]);
ImageView imageView = new ImageView(this);
imageView.setImageBitmap(yourbitmap);
imageView.setAdjustViewBounds(true);
lnrImages.addView(imageView);
}
}
}
}
}
CustomPhotoGalleryActivity
自定义相册活动
public class CustomPhotoGalleryActivity extends Activity {
private GridView grdImages;
private Button btnSelect;
private ImageAdapter imageAdapter;
private String[] arrPath;
private boolean[] thumbnailsselection;
private int ids[];
private int count;
/**
* Overrides methods
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_gallery);
grdImages= (GridView) findViewById(R.id.grdImages);
btnSelect= (Button) findViewById(R.id.btnSelect);
final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
final String orderBy = MediaStore.Images.Media._ID;
@SuppressWarnings("deprecation")
Cursor imagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy);
int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
this.count = imagecursor.getCount();
this.arrPath = new String[this.count];
ids = new int[count];
this.thumbnailsselection = new boolean[this.count];
for (int i = 0; i < this.count; i++) {
imagecursor.moveToPosition(i);
ids[i] = imagecursor.getInt(image_column_index);
int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
arrPath[i] = imagecursor.getString(dataColumnIndex);
}
imageAdapter = new ImageAdapter();
grdImages.setAdapter(imageAdapter);
imagecursor.close();
btnSelect.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
final int len = thumbnailsselection.length;
int cnt = 0;
String selectImages = "";
for (int i = 0; i < len; i++) {
if (thumbnailsselection[i]) {
cnt++;
selectImages = selectImages + arrPath[i] + "|";
}
}
if (cnt == 0) {
Toast.makeText(getApplicationContext(), "Please select at least one image", Toast.LENGTH_LONG).show();
} else {
Log.d("SelectedImages", selectImages);
Intent i = new Intent();
i.putExtra("data", selectImages);
setResult(Activity.RESULT_OK, i);
finish();
}
}
});
}
@Override
public void onBackPressed() {
setResult(Activity.RESULT_CANCELED);
super.onBackPressed();
}
/**
* Class method
*/
/**
* This method used to set bitmap.
* @param iv represented ImageView
* @param id represented id
*/
private void setBitmap(final ImageView iv, final int id) {
new AsyncTask<Void, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... params) {
return MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null);
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
iv.setImageBitmap(result);
}
}.execute();
}
/**
* List adapter
* @author tasol
*/
public class ImageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public ImageAdapter() {
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return count;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.custom_gallery_item, null);
holder.imgThumb = (ImageView) convertView.findViewById(R.id.imgThumb);
holder.chkImage = (CheckBox) convertView.findViewById(R.id.chkImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.chkImage.setId(position);
holder.imgThumb.setId(position);
holder.chkImage.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
int id = cb.getId();
if (thumbnailsselection[id]) {
cb.setChecked(false);
thumbnailsselection[id] = false;
} else {
cb.setChecked(true);
thumbnailsselection[id] = true;
}
}
});
holder.imgThumb.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int id = holder.chkImage.getId();
if (thumbnailsselection[id]) {
holder.chkImage.setChecked(false);
thumbnailsselection[id] = false;
} else {
holder.chkImage.setChecked(true);
thumbnailsselection[id] = true;
}
}
});
try {
setBitmap(holder.imgThumb, ids[position]);
} catch (Throwable e) {
}
holder.chkImage.setChecked(thumbnailsselection[position]);
holder.id = position;
return convertView;
}
}
/**
* Inner class
* @author tasol
*/
class ViewHolder {
ImageView imgThumb;
CheckBox chkImage;
int id;
}
}
回答by GrIsHu
There is EXTRA_ALLOW_MULTIPLE
option is set on the intent through the Intent.putExtra()
method:
有EXTRA_ALLOW_MULTIPLE
选择是通过设置意图Intent.putExtra()
方法:
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
In your code write as below:
在您的代码中编写如下:
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"), RESULT_LOAD_IMAGE1);
Note:the EXTRA_ALLOW_MULTIPLE
option is only available in Android API 18 and higher.
注意:该EXTRA_ALLOW_MULTIPLE
选项仅适用于 Android API 18 及更高版本。
If you want to develop your own gallery then check out the Select Multiple Images from Gallery
如果您想开发自己的图库,请查看从图库中选择多个图像
回答by subrahmanyam boyapati
Use below library for multiple image selection from gallary. https://github.com/sangcomz/FishBun
使用下面的库从库中选择多个图像。 https://github.com/sangcomz/FishBun
回答by Hitesh Sahu
Complete Working Answer
完整的工作答案
Intent
意图
Intent intent = new Intent();
intent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_MULTIPLE);
Activity Result
活动结果
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
// When an Image is picked
if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK
&& null != data && null != data.getClipData()) {
ClipData mClipData = data.getClipData();
Toast.makeText(getActivity(), "You picked " +
(mClipData.getItemCount() > 1 ? mClipData.getItemCount() + "Images" :
mClipData.getItemCount() + "Image"),
Toast.LENGTH_LONG).show();
pickedImageContainer.removeAllViews();
int pickedImageCount;
for (pickedImageCount = 0; pickedImageCount < mClipData.getItemCount();
pickedImageCount++) {
ImageView productImageView =
new ImageView(getActivity());
productImageView.setAdjustViewBounds(true);
productImageView.setScaleType(ImageView.ScaleType.FIT_XY);
productImageView.setLayoutParams(new LinearLayout
.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
pickedImageContainer.addView(productImageView);
Glide.with(getActivity())
.load(mClipData.getItemAt(pickedImageCount).getUri())
.fitCenter().placeholder(R.drawable.map_default)
.error(R.drawable.map_default)
.into(productImageView);
}
} else {
Toast.makeText(getActivity(), "You haven't picked any Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(getActivity(), "Error: Something went wrong " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
super.onActivityResult(requestCode, resultCode, data);
}
回答by Roadies
Here is the code for Select Multiple Image and video from Default Gallery.
这是从默认图库中选择多个图像和视频的代码。
Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture);
buttonLoadImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i = new Intent();
i.setType("image/*");
//i.setType("video/*");
i.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(
Intent.createChooser(i, "android.intent.action.SEND_MULTIPLE"), 1);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("++data" + data.getClipData().getItemCount());// Get count of image here.
System.out.println("++count" + data.getClipData().getItemCount());
Uri selectedImage = data.getClipData().getItemAt(0).getUri();//As of now use static position 0 use as per itemcount.
Bitmap bitmap = null;
// Uri selectedImage1 = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("+++ clipdate" + selectedImage);
ImageView imageView = (ImageView) findViewById(R.id.imgView);
imageView.setImageBitmap(bitmap);
// }
}
回答by sreekumar v
I think android does not support selecting multiple images. For that need to use some library. i was also stuck in the same
我认为 android 不支持选择多个图像。为此需要使用一些库。我也陷入了同样的困境
https://github.com/luminousman/MultipleImagePick
https://github.com/luminousman/MultipleImagePick
this one helped me.
这个帮助了我。
回答by Aishwary Nipane
This is manifest file code for app to get consider you are sending images to your app
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.appshare"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action
android:name="android.intent.action.SEND_MULTIPLE" />
<action
android:name="android.intent.action.SEND" />
<category
android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="image/*" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Program code...
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MainActivity", "on Create ");
if (Intent.ACTION_SEND_MULTIPLE.equals(getIntent().getAction())&& getIntent().hasExtra(Intent.EXTRA_STREAM))
{
ArrayList<Parcelable> list =
getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
for (Parcelable parcel : list) {
Uri uri1 = (Uri) parcel;
Log.d("MainActivity", "on Create uri1 " + uri1);
String sourcepath=getPath(uri1);
Log.d("MainActivity", "on Create sourcepath " + sourcepath);
/// do things here with each image source path.
}
//Commented by Aishwary coz I want to open the app after selecting images otherwise uncomment to just select
//finish();
}else{
// This part is of single image by Aishwary
Uri imageUri =(Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM);
Log.d("MainActivity", "on Create ImageUri " + imageUri);
}
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
startManagingCursor(cursor);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
This will allow you to get source path and images url . Now you can make array for url and use this url as you want...
回答by Saeed Parand
int SELECT_PICTURE=1;
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),SELECT_PICTURE);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
switch (requestCode) {
case SELECT_PICTURE:
Uri selectedImageUri = data.getData();
imgPerview.setBackgroundColor(Color.TRANSPARENT);
LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
imgPerview.setLayoutParams(vp);
imgPerview.setScaleType(ImageView.ScaleType.FIT_XY);
imgPerview.setImageURI(selectedImageUri);
uri = selectedImageUri;
}
}
catch (Exception ex)
{}
}