Permission denied ao acessar galeria do celular

Já fazem 2 dias que estou quebrando a cabeça com esse problema que, pra mim, não faz sentido.
Preciso permitir que o usuário acesse a galeria do celular e selecionar uma foto. A galeria do celular abre normalmente, mas quando seleciono uma imagem, a aplicação para de responder e da o erro de permissão negada. Criei uma classe que trata as permissões e uma pra constantes pra ficar mais fácil de entender.
Meu código:

EditarPerfil.java:

public class EditarPerfil extends AppCompatActivity {
    private Bitmap bitmap;
    ImageView imgperfil;
    Permissao p = new Permissao();
    Constants c = new Constants();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.editar_perfil);

        TextView alterarimg = (TextView) findViewById(R.id.alterarimg);
        final Button salvar = (Button) findViewById(R.id.salvar);

        alterarimg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                carregarGaleria();
            }
        });

    public void carregarGaleria() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(intent, 1);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        InputStream stream = null;
        //define o nome e o código da permissão
        p.setNomePermissao(Manifest.permission.READ_EXTERNAL_STORAGE);
        p.setCodPermissao(c.REQUEST_PERMISSION_READ_EXTERNAL_STORAGE);
       //se não tem permissao
        if (!p.verificaPermissao(this,p.getNomePermissao())) {
            //solicita permissão
            ActivityCompat.requestPermissions(this, new String[] {p.getNomePermissao()},p.getCodPermissao());
            //se a permissão foi dada
            if(p.temPermissao) {
                if (requestCode == 1 && resultCode == RESULT_OK) {
                    try {
                        if (bitmap != null) {
                            bitmap.recycle();
                        }
                        stream = getContentResolver().openInputStream(data.getData());
                        bitmap = BitmapFactory.decodeStream(stream);
                        imgperfil.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } finally {
                        if (stream != null)
                            try {
                                stream.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                    }

                }
            }
        }else{//se tem permissão
            if (requestCode == 1 && resultCode == RESULT_OK) {
                try {
                    if (bitmap != null) {
                        bitmap.recycle();
                    }
                    stream = getContentResolver().openInputStream(data.getData());
                    bitmap = BitmapFactory.decodeStream(stream);
                    imgperfil.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    if (stream != null)
                        try {
                            stream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                }

            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 0:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    p.temPermissao = true;
                } else {
                    p.temPermissao = false;
                }
                break;
            default:
                break;
        }
    }


    private void alert(String s) {
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }

}

Classe Permissão:

public class Permissao {
int checaPermissao;
String nomePermissao;
int codPermissao;
boolean temPermissao = true;

public Permissao() {
}

public boolean verificaPermissao(Context context, String permissao) {
    boolean temPermissao = true;
    //se a API do dispositivo for igual ou superior a 23 precisa solicitar permissão
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checaPermissao = ContextCompat.checkSelfPermission(context, permissao);
        if (checaPermissao != PackageManager.PERMISSION_GRANTED) {
            temPermissao = false;
        }
    }
    return temPermissao;
}

public String getNomePermissao() {
    return nomePermissao;
}

public void setNomePermissao(String nomePermissao) {
    this.nomePermissao = nomePermissao;
}

public int getCodPermissao() {
    return codPermissao;
}

public void setCodPermissao(int codPermissao) {
    this.codPermissao = codPermissao;
}

public boolean isTemPermissao() {
    return temPermissao;
}

public void setTemPermissao(boolean temPermissao) {
    this.temPermissao = temPermissao;
}

Constants.java

public class Constants {
    public static int REQUEST_PERMISSION_CAMERA = 001;
    public static int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 002;
}

Manifest.xml

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

O dispositivo que estou testando tem API 19 e pelo que me falaram essa questão das permissões são tratadas a partir da API 23. Então, ao meu ver, esse erro nem deveria estar acontecendo. A solicitação de permissão nunca aparece para o usuário, então a permissão nunca é dada e nunca dá pra pegar a foto da galeria.