android-打开图库并选择图像和视频
Posted
技术标签:
【中文标题】android-打开图库并选择图像和视频【英文标题】:android- open gallery and choose image and video 【发布时间】:2013-03-29 13:17:51 【问题描述】:在我的项目中,我想通过单击按钮打开一个图库,并且应该能够选择图像或视频来获取它们的路径。
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
从上面的代码我可以打开画廊,但在这种情况下我只能选择图像。所以,请帮助我选择视频。 提前致谢。
【问题讨论】:
【参考方案1】:在 Android 6.0 及更高版本上,使用“video/* image/”或“image/ video/*”类型不起作用,它只能识别您指定的第一个过滤器。我用这段代码解决了这个问题:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("*/*");
photoPickerIntent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] "image/*", "video/*");
startActivityForResult(photoPickerIntent, Constants.SELECT_PHOTO);
虽然这会询问用户他们想使用哪个应用来选择图像/视频。
【讨论】:
谢谢,这个回复现在应该更高了 仅选择视频和图像展位并行的确切解决方案。 此方法在 android 6.0.1 上显示额外的选择器对话框。如果选择正确的 Google 相册,它会显示视频和照片。 它显示其他应用程序以及联系人、谷歌音乐。 截至 2021 年,我在下面添加了一个仅允许图像和视频的解决方案,我在网上没有找到其他有效的方法,所以我混合了一些答案并意外找到了解决方案【参考方案2】:可以使用下一个sn-p:
Intent mediaChooser = new Intent(Intent.ACTION_GET_CONTENT);
//comma-separated MIME types
mediaChooser.setType("video/*, image/*");
startActivityForResult(mediaChooser, RESULT_LOAD_IMAGE);
但我认为它只适用于 ICS 或更大
【讨论】:
应该是“image/*”而不是“images/*” 在 6.0 上只允许选择视频 这似乎被打破了,至少对于较新版本的安卓或谷歌照片应用程序。似乎只有逗号分隔列表中的第一个 mime 类型被识别。 如何多选照片和视频?【参考方案3】:您需要使用以下内容作为选择 Intent
Intent photoLibraryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoLibraryIntent.setType("image/* video/*");
【讨论】:
【参考方案4】:下面的代码解决了我的问题
final Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("*/*");
startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
【讨论】:
【参考方案5】:2022 Android 9
我已经尝试了所有可用的在线解决方案,但不小心混合了 2 个解决方案,结果证明是可行的。
这仅提供照片库和谷歌照片作为选项,您可以选择照片和视频。
libraryIntent.setType("video/*, image/*");
String[] mimetypes = "image/*", "video/*";
libraryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
【讨论】:
【参考方案6】:没有足够的代表发表评论,但@YYamil 的回复效果很好。
Intent mediaChooser = new Intent(Intent.ACTION_GET_CONTENT);
//comma-separated MIME types
mediaChooser.setType("video/*, image/*");
startActivityForResult(mediaChooser, RESULT_LOAD_IMAGE);
如果您使用新的registerForResultActivity,请创建ActivityResultContracts.GetMultipleContents()
的副本并输入createIntent
:
@CallSuper
override fun createIntent(context: Context, input: String): Intent
return Intent(Intent.ACTION_GET_CONTENT)
.addCategory(Intent.CATEGORY_OPENABLE)
.setType(input)
.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*")) // this does the trick
【讨论】:
【参考方案7】:这是我所知道的最好的......试试这个......
final CharSequence[] options = "Images", "Videos", "Cancel";
AlertDialog.Builder builder = new AlertDialog.Builder(OpenGallery.this);
builder.setTitle("Select From...");
builder.setItems(options, new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int item)
if (options[item].equals("Images"))
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 1);
else if (options[item].equals("Videos"))
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 1);
else if (options[item].equals("Cancel"))
dialog.dismiss();
dialog.dismiss();
);
builder.show();
【讨论】:
【参考方案8】:将您的意图更改为:
Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
在尝试获取视频时,您需要向 mediaStore 声明该视频是有序的,而不是您编写的图像。
【讨论】:
【参考方案9】:Android 对访问外部内容设置了很多限制。我最终使用了 3rd 方库。这个不错: https://github.com/AnilFurkanOkcun/UWMediaPicker-Android
implementation 'com.github.AnilFurkanOkcun:UWMediaPicker-Android:1.3.0'
UwMediaPicker
.with(this) // Activity or Fragment
.setGalleryMode(UwMediaPicker.GalleryMode.ImageGallery) // GalleryMode: ImageGallery/VideoGallery/ImageAndVideoGallery, default is ImageGallery
.setGridColumnCount(4) // Grid column count, default is 3
.setMaxSelectableMediaCount(10) // Maximum selectable media count, default is null which means infinite
.setLightStatusBar(true) // Is llight status bar enable, default is true
.enableImageCompression(true) // Is image compression enable, default is false
.setCompressionMaxWidth(1280F) // Compressed image's max width px, default is 1280
.setCompressionMaxHeight(720F) // Compressed image's max height px, default is 720
.setCompressFormat(Bitmap.CompressFormat.JPEG) // Compressed image's format, default is JPEG
.setCompressionQuality(85) // Image compression quality, default is 85
.setCompressedFileDestinationPath(destinationPath) // Compressed image file's destination path, default is "$application.getExternalFilesDir(null).path/Pictures"
.launchselectedMediaList-> // (::onMediaSelected) // Will be called when media is selected
【讨论】:
以上是关于android-打开图库并选择图像和视频的主要内容,如果未能解决你的问题,请参考以下文章
android:从图库中选择图像,然后裁剪并显示在图像视图中