You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中选取图库图片功能失效,点击ImageView仅闪烁无响应

问题解决:头像选择功能无响应及startActivityForResult弃用处理

一、核心问题分析

  1. 权限处理缺失:代码未实现权限请求后的回调逻辑,用户授予权限后无法自动打开图库;同时Android 13+(API 33)已废弃READ_EXTERNAL_STORAGE,需改用READ_MEDIA_IMAGES权限。
  2. 废弃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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:44:54