java - 开始 ActivityforResult 显示已贬值
问题描述
运行 startActivityForResult 的代码显示错误:
Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, IMAGE_PICKER);
onActivity 结果错误:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMAGE_PICKER && resultCode == RESULT_OK) {
if (data != null) {
photoUri = data.getData();
updateBtn.setVisibility(View.VISIBLE);
}
}
}
解决方案
当您升级 Activity 库时,此方法似乎已弃用,现在您必须使用registerForActivityResult()
.
创建一个ActivityResultLauncher
ActivityResultLauncher<String> imagePickerResult = registerForActivityResult(new GetContent(),
new ActivityResultCallback<Uri>() {
@Override
public void onActivityResult(Uri uri) {
// Do what you need with that Uri
}
});
然后代替startActivityForResult
使用launch
imagePickerResult.launch("image/*");
然后在imagePickerResult
用户选择图像时触发。
请注意,在您的情况下,您可以使用默认值Activity Result Contract
,但如果您需要自定义合同,则必须自己创建它,这是它如何工作的示例。
public class PickRingtone extends ActivityResultContract<Integer, Uri> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, @NonNull Integer ringtoneType) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, ringtoneType.intValue());
return intent;
}
@Override
public Uri parseResult(int resultCode, @Nullable Intent result) {
if (resultCode != Activity.RESULT_OK || result == null) {
return null;
}
return result.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
}
}
推荐阅读
- node.js - 有人在赛普拉斯有一个使用 OneLogin 的例子吗?
- python - 类 __init__ 混合了固定长度和可变长度 **kwargs 参数
- ios - 访问组件的设置器时应用程序崩溃(iOS 13)
- python - Sagemaker 训练作业未将训练模型上传/保存到 S3 输出路径
- android - NoClassDefFoundError:com/amazonaws/mobile/client/AWSMobileClient
- java - Android WebView 进度条+滑动刷新
- javascript - 仅使用 javascrip 检查音频文件是否存在
- javascript - Firebase - AngularJS - 通过子值/键/名称获取父级
- c - 在 sudo 中运行程序时将目录的所有权更改为用户
- c# - 应用程序未正确运行 - 启用了自定义 Web 代理