Android Studio中PhotoPicker官方代码报错如何解决?
问题排查与解决方案
错误原因
从报错截图可知触发了IllegalStateException,核心问题是:registerForActivityResult()方法不能在点击事件等动态回调中调用,它必须在Activity的生命周期初始化阶段(比如onCreate)完成注册,否则系统会判定注册时机非法。
修复后的代码
package com.example.photopicker; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.PickVisualMediaRequest; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { Button addimage; // 声明为类成员变量 private ActivityResultLauncher<PickVisualMediaRequest> pickMedia; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addimage = findViewById(R.id.button_pick_photo); // 在onCreate生命周期内完成Launcher注册 pickMedia = registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), uri -> { if (uri != null) { Log.d("PhotoPicker", "Selected URI: " + uri); } else { Log.d("PhotoPicker", "No media selected"); } }); addimage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击事件仅触发选择器启动操作 pickMedia.launch(new PickVisualMediaRequest.Builder() .setMediaType(new ActivityResultContracts.PickVisualMedia.ImageAndVideo()) .build()); } }); } }
关键说明
registerForActivityResult()必须绑定到Activity的生命周期,只能在onCreate、onStart这类初始化阶段执行,不能延迟到用户交互事件中注册。- 修复后,Launcher在Activity创建时完成注册,点击事件仅负责触发选择器启动,完全符合Jetpack组件的生命周期规范。
内容的提问来源于stack exchange,提问作者Saleem Manasfi
相关产品推荐
相关产品推荐

