我想从画廊创建一个图片选择器。我使用代码
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);
我的问题是在这个活动和视频文件显示。是否有一种方法可以过滤显示的文件,以便在此活动中不显示视频文件?
当前回答
你可以做的比下面的回答更简单:
Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);
其他回答
感谢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/*")
}
}
}
由于startActivityForResult()已经废弃,我们可以使用ActivityResultLauncher以以下方式从图库中选择图像:
首先,我们需要定义一个ActivityResultLauncher<String[]>并在onCreate()(用于活动)或onViewCreated()(用于片段)中初始化它
ActivityResultLauncher<String[]> galleryActivityLauncher = registerForActivityResult(new ActivityResultContracts.OpenDocument(), new ActivityResultCallback<Uri>() {
@Override
public void onActivityResult(Uri result) {
if (result != null) {
// perform desired operations using the result Uri
} else {
Log.d(TAG, "onActivityResult: the result is null for some reason");
}
}
});
假设我们需要在点击submitButton时打开图库。
在onClickListener中,我们需要调用
galleryActivityLauncher.launch(new String[]{"image/*"});
这里的技巧是launch()的参数。通过在参数数组中添加"image/*",我们指定文件资源管理器只加载图像。
对于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)
}
再见startActivityForResult ()
现在AndroidX活动的正确方法是活动结果api,这是谷歌强烈推荐的方法
private val selectImageFromGalleryResult = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let { previewImage.setImageURI(uri) }
}
需要时只需调用selectImageFromGallery()
private fun selectImageFromGallery() = selectImageFromGalleryResult.launch("image/*")
2021 Kotlin解决方案与新版本的Fragment:
dependencies {
implementation "androidx.fragment:fragment:1.3.3"
}
class YourFragment : Fragment() {
private val fileChooserContract = registerForActivityResult(ActivityResultContracts.GetContent()) { imageUri ->
if (imageUri != null) {
// imageUri now contains URI to selected image
}
}
// ...
fun openFileChooser() {
fileChooserContract.launch("image/*")
}
}