首页 > 解决方案 > 开始 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);

            }

        }

    }

想添加 onActivityResult 但不工作

在此处输入图像描述

标签: javaandroid

解决方案


当您升级 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);
    }
}

推荐阅读