我想从画廊创建一个图片选择器。我使用代码
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, TFRequestCodes.GALLERY);
我的问题是在这个活动和视频文件显示。是否有一种方法可以过滤显示的文件,以便在此活动中不显示视频文件?
我想从画廊创建一个图片选择器。我使用代码
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, TFRequestCodes.GALLERY);
我的问题是在这个活动和视频文件显示。是否有一种方法可以过滤显示的文件,以便在此活动中不显示视频文件?
当前回答
OnActivityResult方法已弃用
val singleImageResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
// There are no request codes
val data: Intent? = result.data
val selectedImageUri: Uri? = data?.data
if (null != selectedImageUri) {
// Get the path from the Uri
val path = getPathFromURI(selectedImageUri)
findViewById<TextView>(R.id.textView).text = path
findViewById<ImageView>(R.id.imageView2).setImageURI(selectedImageUri)
}
}
}
findViewById<Button>(R.id.oneImageSelectBtn).setOnClickListener {
val intent = Intent()
intent.type = "image/*"
intent.action = Intent.ACTION_GET_CONTENT
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
singleImageResultLauncher.launch(Intent.createChooser(intent, "Select Picture"))
}
private fun getPathFromURI(uri: Uri?): String {
var path = ""
if (contentResolver != null) {
val cursor = contentResolver.query(uri!!, null, null, null, null)
if (cursor != null) {
cursor.moveToFirst()
val idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME)
path = cursor.getString(idx)
cursor.close()
}
}
return path
}
其他回答
如果你只是寻找图像和多重选择。
看一次https://stackoverflow.com/a/15029515/1136023
这对将来很有帮助。我个人觉得使用MultipleImagePick很棒。
这是一个完整的示例请求权限(如果需要),从图库中选择图像,然后将图像转换为位图或文件
AndroidManifesh.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button_pick_image.setOnClickListener {
pickImage()
}
}
private fun pickImage() {
if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
val intent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI
)
intent.type = "image/*"
intent.putExtra("crop", "true")
intent.putExtra("scale", true)
intent.putExtra("aspectX", 16)
intent.putExtra("aspectY", 9)
startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
} else {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
READ_EXTERNAL_STORAGE_REQUEST_CODE
)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK_IMAGE_REQUEST_CODE) {
if (resultCode != Activity.RESULT_OK) {
return
}
val uri = data?.data
if (uri != null) {
val imageFile = uriToImageFile(uri)
// todo do something with file
}
if (uri != null) {
val imageBitmap = uriToBitmap(uri)
// todo do something with bitmap
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// pick image after request permission success
pickImage()
}
}
}
}
private fun uriToImageFile(uri: Uri): File? {
val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
if (cursor != null) {
if (cursor.moveToFirst()) {
val columnIndex = cursor.getColumnIndex(filePathColumn[0])
val filePath = cursor.getString(columnIndex)
cursor.close()
return File(filePath)
}
cursor.close()
}
return null
}
private fun uriToBitmap(uri: Uri): Bitmap {
return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
}
companion object {
const val PICK_IMAGE_REQUEST_CODE = 1000
const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
}
}
演示 https://github.com/PhanVanLinh/AndroidPickImage
再见startActivityForResult ()
现在AndroidX活动的正确方法是活动结果api,这是谷歌强烈推荐的方法
private val selectImageFromGalleryResult = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let { previewImage.setImageURI(uri) }
}
需要时只需调用selectImageFromGallery()
private fun selectImageFromGallery() = selectImageFromGalleryResult.launch("image/*")
Kotlin:当你想提示用户时,打开ACTION_GET_CONTENT事件:
val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" }
startActivityForResult(intent, 9998)
当用户选择了一张图片后,在Activity的onActivityResult函数中处理该事件。作为一个例子,我在一个ImageView中显示它,并将它存储在应用程序缓存中:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 9998) {
val uri: Uri = data?.data ?: return
val bytes = contentResolver.openInputStream(uri)?.readBytes() ?: return
imageView.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.size))
File("$cacheDir/imgPicked").writeBytes(bytes) // if needed: store to cache
}
}
理想情况下,将9998替换为应用程序使用的一些内部请求代码。这只是为了区分回调与您自己的请求。
与getParcelable("data")不同,它不需要任何权限。
注意,这不会处理设置它的图像上的Exif旋转位,因此一些图像最终会出现不正确的方向(Kotlin解决方案)。
对于Kotlin使用新的ActivityResultContracts,因为startActivityForResult是废弃的:
private val mSelectedPicDataResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val selectedPicUri = result.data?.data
//use your selected pic
}
}
private fun startSelectPic() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
mSelectedPicDataResult.launch(intent)
}