Problemas con la solicitud de permisos Marshmallow

Estoy tratando de hacer una aplicación de cámara básica que pueda acceder a la foto guardada desde la galería (necesaria como parte de otra aplicación, pero debido a problemas que he tenido, la estoy desarrollando en un proyecto en blanco), y la he seguido principalmente este tutorialhttps://guides.codepath.com/android/Accessing-the-Camera-and-Stored-Media

Luego de darme cuenta de que simplemente se bloquearía debido a cómo funcionan los permisos en Marshmallow, y que necesito compatibilidad con versiones anteriores, he intentado seguir los tutoriales sobre la implementación de solicitudes de permisos para poder usar la aplicación.

Esto es lo que tengo actualmente después de varias horas de intentarlo. He agregado permisos en el manifiesto, pero como son bastante estándar, no me he molestado en copiarlos y pegarlos. Esto se bloquea actualmente en el método test () porque no hay un grupo llamado Almacenamiento. Con esa línea comentada, solo dirá permiso denegado sin pedirme que ordene los permisos (ya sea en un dispositivo Marshmallow o no). Francamente, ahora estoy perdido. Lo que necesito hacer es antes de iniciar la cámara en el método onLaunchCamera (que se inicia con un clic de botón), para obtener los permisos para leer y escribir en el almacenamiento externo y para acceder a la cámara. Cualquier ayuda que pueda dar sería muy apreciada.

private boolean cameraPermissionsCheck() {
    return ContextCompat.checkSelfPermission(this, Manifest.permission_group.CAMERA) == PackageManager.PERMISSION_GRANTED;
}

private boolean storagePermissionsCheck() {
    return ContextCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE) == PackageManager.PERMISSION_GRANTED;
}

private void requestPermissions() {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission_group.CAMERA, Manifest.permission_group.STORAGE}, 123);
}

private void test() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission_group.STORAGE)) {
        //was a toast notification here
        requestPermissions();
    } else {
        requestPermissions();
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 123
            && grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
    }
}

public void onLaunchCamera(View view) {

    //btn = (Button) findViewById(R.id.button);
    if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        if(!cameraPermissionsCheck() || !storagePermissionsCheck()){
            test();
        }
        else {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, getPhotoFileUri(photoFileName)); // set the image file name

            if (intent.resolveActivity(getPackageManager()) != null) {
            // Start the image capture intent to take photo
            startActivityForResult(intent, 0);
            }
        }
    } else {
        Toast.makeText(MainActivity.this, "No Camera",
                Toast.LENGTH_LONG).show();
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta