图库中的最大图像选择限制 Android
maximum image selection limit from gallery Android
我正在尝试从我的应用程序内部的 Gallery 内置应用程序中获取图像的 Uri。
所以,我正在使用下面的 Intent,但它选择了更多图像。
我想设置限制。小于 3
@Override
public void onClick(View v) {
Intent intent = new Intent( );
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "select images"), PICK_IMAGE_MULTIPLE);
}
我该如何解决这个问题。
你有什么建议吗?
不幸的是,正如 http://developer.android.com/reference/android/content/Intent.html#EXTRA_ALLOW_MULTIPLE 所述,这是不可能的。
This is a boolean extra; the default is false. If true, an implementation is allowed to present the user with a UI where they can pick multiple items that are all returned to the caller.
您必须手动检查返回的数据,看它是否超过 3 个项目,如果是,请显示 Toast 让他们重试。
正如丹尼尔所说,Intent.EXTRA_ALLOW_MULTIPLE 不可能。不过,另一种方法是使用 MultipleImageSelect 库。您不仅可以 select 多张图片,还可以对用户 select 编辑的图片设置限制。
查看 repository or a sample。
步骤:
第一步:
将 MultipleImageSelect 库连同 jitpack.io 添加到您的 build.gradle 中,如下所示:
repositories {
maven {
url "https://jitpack.io"
}
}
dependencies {
implementation 'com.github.darsh2:MultipleImageSelect:v0.0.4'
}
第 2 步:
在项目的AndroidManifest.xml中,在application节点下添加:
<activity
android:name="com.darsh.multipleimageselect.activities.AlbumSelectActivity"
android:theme="@style/MultipleImageSelectTheme">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
第 3 步:
在 activity 调用图像的地方 select 或者,创建 Intent 如下:
mSelectImagesBtn.setOnClickListener(view -> {
Intent intent = new Intent(ListingImages.this, AlbumSelectActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_LIMIT, 3); //set desired image limit here
startActivityForResult(intent, Constants.REQUEST_CODE);
});
第 4 步:
并像这样覆盖 onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data !=null) {
ArrayList<Image> images =data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES);
imagePathList.clear();
StringBuffer stringBuffer = new StringBuffer();
//loop to retrieve the paths of each image and display to TextView
for (int i = 0; i < images.size(); i++) {
stringBuffer.append(images.get(i).path + "\n");
}
textView.setText(stringBuffer.toString());
}
}
完成
或者,
如果您使用适配器来膨胀图像以显示,您可以改为:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data != null) {
ArrayList<Image> images = data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES);
imagePathList.clear();
for (int i = 0; i < images.size(); i++) {
imagePathList.add(images.get(i).path);
}
imageAdapter.notifyDataSetChanged();
}
}
在 ImageAdapter 中,显示图像以填充 recyclerView,如下所示:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String path = imagePathList.get(position);
Picasso.with(mContext)
.load(new File(path))
.placeholder(R.drawable.ic_house_placeholder)
.into(holder.image);
}
我正在尝试从我的应用程序内部的 Gallery 内置应用程序中获取图像的 Uri。
所以,我正在使用下面的 Intent,但它选择了更多图像。
我想设置限制。小于 3
@Override
public void onClick(View v) {
Intent intent = new Intent( );
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "select images"), PICK_IMAGE_MULTIPLE);
}
我该如何解决这个问题。
你有什么建议吗?
不幸的是,正如 http://developer.android.com/reference/android/content/Intent.html#EXTRA_ALLOW_MULTIPLE 所述,这是不可能的。
This is a boolean extra; the default is false. If true, an implementation is allowed to present the user with a UI where they can pick multiple items that are all returned to the caller.
您必须手动检查返回的数据,看它是否超过 3 个项目,如果是,请显示 Toast 让他们重试。
正如丹尼尔所说,Intent.EXTRA_ALLOW_MULTIPLE 不可能。不过,另一种方法是使用 MultipleImageSelect 库。您不仅可以 select 多张图片,还可以对用户 select 编辑的图片设置限制。
查看 repository or a sample。
步骤:
第一步: 将 MultipleImageSelect 库连同 jitpack.io 添加到您的 build.gradle 中,如下所示:
repositories {
maven {
url "https://jitpack.io"
}
}
dependencies {
implementation 'com.github.darsh2:MultipleImageSelect:v0.0.4'
}
第 2 步: 在项目的AndroidManifest.xml中,在application节点下添加:
<activity
android:name="com.darsh.multipleimageselect.activities.AlbumSelectActivity"
android:theme="@style/MultipleImageSelectTheme">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
第 3 步: 在 activity 调用图像的地方 select 或者,创建 Intent 如下:
mSelectImagesBtn.setOnClickListener(view -> {
Intent intent = new Intent(ListingImages.this, AlbumSelectActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_LIMIT, 3); //set desired image limit here
startActivityForResult(intent, Constants.REQUEST_CODE);
});
第 4 步: 并像这样覆盖 onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data !=null) {
ArrayList<Image> images =data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES);
imagePathList.clear();
StringBuffer stringBuffer = new StringBuffer();
//loop to retrieve the paths of each image and display to TextView
for (int i = 0; i < images.size(); i++) {
stringBuffer.append(images.get(i).path + "\n");
}
textView.setText(stringBuffer.toString());
}
}
完成
或者,
如果您使用适配器来膨胀图像以显示,您可以改为:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_CODE && resultCode == RESULT_OK && data != null) {
ArrayList<Image> images = data.getParcelableArrayListExtra(Constants.INTENT_EXTRA_IMAGES);
imagePathList.clear();
for (int i = 0; i < images.size(); i++) {
imagePathList.add(images.get(i).path);
}
imageAdapter.notifyDataSetChanged();
}
}
在 ImageAdapter 中,显示图像以填充 recyclerView,如下所示:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String path = imagePathList.get(position);
Picasso.with(mContext)
.load(new File(path))
.placeholder(R.drawable.ic_house_placeholder)
.into(holder.image);
}