Android Studio中选取图库图片功能失效,点击ImageView仅闪烁无响应
问题解决:头像选择功能无响应及
startActivityForResult弃用处理 一、核心问题分析
- 权限处理缺失:代码未实现权限请求后的回调逻辑,用户授予权限后无法自动打开图库;同时Android 13+(API 33)已废弃
READ_EXTERNAL_STORAGE,需改用READ_MEDIA_IMAGES权限。 - 废弃API未替换:
startActivityForResult已被官方废弃,需改用Activity Result API实现页面跳转与结果回调。
二、具体修复步骤
1. 适配Android 13+权限
在AndroidManifest.xml中添加对应权限:
<!-- Android 12及以下版本 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 13及以上版本 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
2. 替换startActivityForResult为Activity Result API
在Activity中注册ActivityResultLauncher,替代原有的onActivityResult逻辑:
// 声明图库选择的结果回调Launcher private ActivityResultLauncher<Intent> galleryLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_form_cadastro); // 初始化其他控件... // 注册图库选择的结果回调 galleryLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { Uri pickedImgUri = result.getData().getData(); ImguserPhoto.setImageURI(pickedImgUri); } }); }
3. 修复权限请求逻辑
添加权限请求结果回调,并适配不同Android版本的权限类型:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PReqCode) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予成功,打开图库 openGallery(); } else { Toast.makeText(this, "需要权限才能访问图库", Toast.LENGTH_SHORT).show(); } } } private void checkAndRequestForPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ 处理READ_MEDIA_IMAGES权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_MEDIA_IMAGES}, PReqCode); } else { openGallery(); } } else { // Android 12及以下处理READ_EXTERNAL_STORAGE权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Toast.makeText(this, "请授予访问图库的权限", Toast.LENGTH_SHORT).show(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PReqCode); } } else { openGallery(); } } }
4. 修改openGallery方法
使用注册好的galleryLauncher启动图库:
private void openGallery() { Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); galleryIntent.setType("image/*"); galleryLauncher.launch(galleryIntent); }
三、完整修改后的代码
package com.ete.smarthub; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; public class FormCadastro extends AppCompatActivity { EditText signupUsername; EditText signupSenha; EditText signupEmail; TextView logincadastroText; Button signupButton; FirebaseDatabase database; DatabaseReference reference; FirebaseAuth fAuth; ImageView ImguserPhoto; static int PReqCode = 1; Uri pickedImgUri; // 声明图库选择的Launcher private ActivityResultLauncher<Intent> galleryLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_form_cadastro); signupUsername = findViewById(R.id.signup_username); signupSenha = findViewById(R.id.signup_senha); signupEmail = findViewById(R.id.signup_email); logincadastroText = findViewById(R.id.logincadastroText); signupButton = findViewById(R.id.signup_button); ImguserPhoto = findViewById(R.id.regUserPhoto); // 注册图库选择的结果回调 galleryLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { pickedImgUri = result.getData().getData(); ImguserPhoto.setImageURI(pickedImgUri); } }); ImguserPhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkAndRequestForPermission(); } }); fAuth = FirebaseAuth.getInstance(); signupButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String Email = signupEmail.getText().toString(); String Usuario = signupUsername.getText().toString(); String Senha = signupSenha.getText().toString(); // 先做输入合法性验证,再执行数据库操作 if (TextUtils.isEmpty(Usuario)) { signupUsername.setError("Campo de Usuário vazio!"); return; } if (TextUtils.isEmpty(Email)) { signupEmail.setError("Campo de Email vazio!!"); return; } if (Senha.length() < 6) { signupSenha.setError("Senha deve conter no mínimo 6 caracteres!"); return; } if (TextUtils.isEmpty(Senha)) { signupSenha.setError("Campo de Senha vazio!"); return; } // 验证通过后写入数据库并创建用户 database = FirebaseDatabase.getInstance(); reference = database.getReference("users"); HelperClass helperClass = new HelperClass(Email, Usuario, Senha); reference.child(Usuario).setValue(helperClass); fAuth.createUserWithEmailAndPassword(Email, Senha).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Toast.makeText(FormCadastro.this, "Cadastro Realizado", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(FormCadastro.this, FormLogin.class); startActivity(intent); } else { Toast.makeText(FormCadastro.this, "Erro!" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); } }); logincadastroText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(FormCadastro.this, FormLogin.class); startActivity(intent); } }); } private void openGallery() { Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); galleryIntent.setType("image/*"); galleryLauncher.launch(galleryIntent); } private void checkAndRequestForPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ 权限处理 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_MEDIA_IMAGES}, PReqCode); } else { openGallery(); } } else { // Android 12及以下权限处理 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Toast.makeText(this, "请授予访问图库的权限", Toast.LENGTH_SHORT).show(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PReqCode); } } else { openGallery(); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PReqCode) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { openGallery(); } else { Toast.makeText(this, "需要权限才能访问图库", Toast.LENGTH_SHORT).show(); } } } }
额外优化点
- 原代码中先写入数据库再做输入验证,调整为先验证输入合法性,再执行数据库写入和用户创建,避免无效的数据库操作。
内容的提问来源于stack exchange,提问作者Ranyê Wilames
相关产品推荐
相关产品推荐

