android 从图库中选择图像
我想从图库创建一个图片选择器。我使用代码
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, TFRequestCodes.GALLERY);
我的问题是在此活动中显示视频文件。有没有办法过滤显示的文件,以便此活动中不会显示任何视频文件?
I want to create a picture chooser from gallery. I use code
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, TFRequestCodes.GALLERY);
My problem is that in this activity and video files are displayed. Is there a way to filter displayed files so that no video files will be displayed in this activity?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(23)
绝对地。尝试一下:
不要忘记创建常量 PICK_IMAGE,这样您就可以识别用户何时从图片库返回。 活动:
这就是我对图片库的称呼。把它放进去,看看它是否适合你。
编辑:
这将打开文档应用程序。为了允许用户也使用他们可能安装的任何图库应用程序:
Absolutely. Try this:
Don't forget also to create the constant PICK_IMAGE, so you can recognize when the user comes back from the image gallery Activity:
That's how I call the image gallery. Put it in and see if it works for you.
EDIT:
This brings up the Documents app. To allow the user to also use any gallery apps they might have installed:
有时,您无法从您选择的图片中获取文件。
这是因为所选的服务来自 Google+、Drive、Dropbox 或任何其他提供商。
最好的解决方案是要求系统通过 Intent.ACTION_GET_CONTENT< 选择内容/a> 并通过内容提供商获取结果。
您可以按照下面的代码操作或查看我的更新的要点。
Sometimes, you can't get a file from the picture you choose.
It's because the choosen one came from Google+, Drive, Dropbox or any other provider.
The best solution is to ask the system to pick a content via Intent.ACTION_GET_CONTENT and get the result with a content provider.
You can follow the code bellow or look at my updated gist.
您可以使用此方法从图库中选取图像。仅显示图像。
并将 onActivityResult 重写为
You can use this method to pick image from gallery. Only images will be displayed.
and override onActivityResult as
这是请求权限的完整示例(如果需要),从图库中选择图像,然后将图像转换为
位图
或文件
AndroidManifesh.xml
< strong>活动
演示
https://github.com/PhanVanLinh/AndroidPickImage
Here is a full example for request permission (if need), pick image from gallery, then convert image to
bitmap
orfile
AndroidManifesh.xml
Activity
Demo
https://github.com/PhanVanLinh/AndroidPickImage
带有新版本 Fragment 的 2021 Kotlin 解决方案:
2021 Kotlin solution with new version of Fragment:
我有同样的问题。我使用此代码
addIntent
添加 onActivityResult
FileUtil class
并且您必须将 provider_paths.xml 添加到 xml 文件夹,如图像
provider_paths.xml
并最终在 AndroidManifest.xml 中添加以下内容,
希望对您有所帮助
I have same problem .I use this codes
addIntent
add onActivityResult
FileUtil class
and you must add provider_paths.xml to xml folder like image
provider_paths.xml
and finaly add below in AndroidManifest.xml
I hope I helped
再见 startActivityForResult()
现在使用 AndroidX Activity 的正确方法是 Activity Result API,这是 google
只需在需要时调用 selectImageFromGallery()
Goodbye startActivityForResult()
Proper way nowadays with AndroidX Activity, is Activity Result APIs and that is strongly recommended way by google
Simply call selectImageFromGallery() when needed
由于startActivityForResult()已被弃用,我们可以通过以下方式仅从图库中选择图像使用 ActivityResultLauncher:
首先我们需要定义一个
ActivityResultLauncher
并在onCreate()
(对于活动)或onViewCreated()
(对于片段)中初始化它 假设我们需要在
submitButton
时打开图库点击。因此,在
onClickListener
中,我们需要调用这里的技巧是
launch()
的参数。通过将"image/*"
添加到参数数组,我们指定文件资源管理器应仅加载图像。Since startActivityForResult() is depracated we can choose only image from gallery in the following way using ActivityResultLauncher:
At first we need to define an
ActivityResultLauncher<String[]>
and initialize it inonCreate()
(for Activities) oronViewCreated()
(for fragments)Let's say we need to open the gallery when
submitButton
is clicked.So inside the
onClickListener
we need to callThe trick here is the argument for
launch()
. By adding"image/*"
to the argument array, we are specifying that the file explorer should load images only.OnActivityResult 方法已弃用
OnActivityResult method is deprecated
只是为了根据文档为 API 最低为 19 的人提供答案的更新:
使用存储访问框架打开文件 - Android 文档
Just to offer an update to the answer for people with API min 19, per the docs:
Open files using storage access framework - Android Docs
如果您只是寻找图像和多项选择。
看@一次 https://stackoverflow.com/a/15029515/1136023
对未来很有帮助。我个人感觉很棒使用 MultipleImagePick。
If you are only looking for images and multiple selection.
Look @ once https://stackoverflow.com/a/15029515/1136023
It's helpful for future.I personally feel great by using MultipleImagePick.
感谢 mklkj。
这是活动版本。
fileChooserContract
可以选择图像。filesChooserContract
可以选择多张图片。thanks to mklkj.
this is a activity version.
fileChooserContract
can select a image.filesChooserContract
can select multi images.这是 kotlin 中 util 方法的工作代码:
现在重写 onActivityResult 方法:
}
Here is working code a util method in kotlin:
Now override onActivityResult method:
}
OPTION-1
下面的代码允许用户从任何文件资源管理器应用程序中选择图像,
但在某些设备中,上述解决方案不会获取带有 EXIF 信息(例如方向)的图像。因此,在这些设备中,无法按预期执行 EXIF 处理(例如更改图像方向)。
OPTION-2
下面的代码允许用户从任何图库应用程序中选择图像,
但在某些设备中,在设置意图类型时,上述解决方案将清除意图数据(
MediaStore.Images. Media.EXTERNAL_CONTENT_URI
),这可能会阻碍图库的打开过程。OPTION-3
最后,我建议使用下面的代码,该代码允许用户从任何图库应用程序中选择图像,这不会导致任何问题,也不会显示任何警告
OPTION-1
The below code allows user to select an image from any file explorer application
But in some devices, the above solution will not fetch the image with EXIF information such as orientation. So in those devices, EXIF processing such as changing image orientation could not be performed as expected.
OPTION-2
The below code allows user to select an image from any gallery application
But in some devices, while setting the intent type, the above solution will clear the intent data (
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
) which could hinder the gallery opening process.OPTION-3
Finally, I suggest the below code which allows user to select an image from any gallery application which does not cause any problem and does not show up any warning
Pick Media 2023
实施块字段并注册单个媒体选择。
在调用 onCreate 方法之前强制执行,或者以某种方式考虑生命周期。
实现 launch 方法:
用法:
Pick Media 2023
Implement a block field and register a single media selection.
Mandatory before calling the onCreate method or somehow take into account the life cycle.
Implement the launch method:
Usage:
仅从本地选择添加此:
并且这工作很好:
For only pick from local add this :
And this working nice :
Kotlin
:当您想要提示用户时,打开ACTION_GET_CONTENT
事件:用户选择图像后,在
中处理该事件Activity 的 onActivityResult
函数。作为示例,我将其显示在ImageView
中并将其存储在应用程序缓存中:理想情况下,将
9998
替换为您的应用程序使用的一些内部请求代码枚举。这只是为了让您可以区分回调和您自己的请求。与 getParcelable("data") 不同,这不需要任何权限。
请注意,这不会处理设置它的图像上的 Exif 旋转位,因此一些图像最终会出现错误方向(Kotlin 解决方案)。
Kotlin
: Open theACTION_GET_CONTENT
event when you want to prompt the user:After the user picked an image, handle that event in the
onActivityResult
function of your Activity. As an example I am displaying it in anImageView
and storing it in the app cache:Ideally, replace
9998
with some internal request code enum your app uses. This is just so you can differentiate callbacks from your own requests.Unlike
getParcelable("data")
this does not require any permissions.Note that this doesn't handle the Exif rotation bit on images that set it, so a few images will end up with incorrect orientation (Kotlin solution).
对于使用新的
ActivityResultContracts
的 Kotlin,因为startActivityForResult
已被弃用:For Kotlin using new
ActivityResultContracts
sincestartActivityForResult
is depricated:在 Compose 中我们可以选择这样的图像:
in Compose we can choose an image like this:
您可以使用挑选照片
You can use pick Pick Photo
正如我在这个答案中解释的那样,更喜欢使用 GetContent 而不是 PickVisualMedia
Google play 从图库中选择媒体时出现错误
prefer using GetContent instead of PickVisualMedia as I explained in this answer
Google play Something went wrong error on pick a media from gallery
你可以比这个答案更容易做到:
U can do it easier than this answers :