我想从画廊创建一个图片选择器。我使用代码
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);
我的问题是在这个活动和视频文件显示。是否有一种方法可以过滤显示的文件,以便在此活动中不显示视频文件?
当前回答
您可以使用此方法从图库中选择图像。只显示图像。
public void pickImage() {
Intent intent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("scale", true);
intent.putExtra("outputX", 256);
intent.putExtra("outputY", 256);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("return-data", true);
startActivityForResult(intent, 1);
}
并重写onActivityResult as
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
if (requestCode == 1) {
final Bundle extras = data.getExtras();
if (extras != null) {
//Get image
Bitmap newProfilePic = extras.getParcelable("data");
}
}
}
其他回答
您可以使用此方法从图库中选择图像。只显示图像。
public void pickImage() {
Intent intent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("scale", true);
intent.putExtra("outputX", 256);
intent.putExtra("outputY", 256);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("return-data", true);
startActivityForResult(intent, 1);
}
并重写onActivityResult as
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
if (requestCode == 1) {
final Bundle extras = data.getExtras();
if (extras != null) {
//Get image
Bitmap newProfilePic = extras.getParcelable("data");
}
}
}
再见startActivityForResult ()
现在AndroidX活动的正确方法是活动结果api,这是谷歌强烈推荐的方法
private val selectImageFromGalleryResult = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let { previewImage.setImageURI(uri) }
}
需要时只需调用selectImageFromGallery()
private fun selectImageFromGallery() = selectImageFromGalleryResult.launch("image/*")
你可以做的比下面的回答更简单:
Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);
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解决方案)。
感谢mklkj。
这是一个活动版本。
fileChooserContract可以选择一个图像。 filesChooserContract可以选择多张图片。
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "MainActivity"
}
lateinit var viewBinding: ActivityMainBinding
private val fileChooserContract = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
Log.d(TAG, "onActivityResult: uri $uri")
}
private val filesChooserContract = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) { uriList ->
for (uri in uriList) {
Log.d(TAG, "onActivityResult: uri $uri")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
viewBinding.btnPick.setOnClickListener {
fileChooserContract.launch("image/*")
}
viewBinding.btnPickMulti.setOnClickListener {
filesChooserContract.launch("image/*")
}
}
}