public class Permission3 extends AppCompatActivity {

    TextView mTv3;
    boolean perm1, perm2, perm3;
    AlertDialog alertDialog1, alertDialog2, alertDialog3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ceti_permission3);

        mTv3 = (TextView) findViewById(R.id.tv3);

        mTv3.append("권한체크 전...!\n");

        if (ContextCompat.checkSelfPermission(CetiPermission3.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            perm1 = true;
        }
        if (ContextCompat.checkSelfPermission(CetiPermission3.this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            perm2 = true;
        }
        if (ContextCompat.checkSelfPermission(CetiPermission3.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            perm3 = true;
        }
        if (!perm1 || !perm2 || !perm3) {
            ActivityCompat.requestPermissions(CetiPermission3.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_FINE_LOCATION}, 300);
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 300 && grantResults.length > 0) {
            if (grantResults[0] == -1) {
                dialogMaker(alertDialog1, "이 앱을 실행하기 위해서는 사진과 영상을 촬영할 수 있는 권한이 필요합니다.");
            } else if (grantResults[0] == 0) {
                perm1 = true;
            }
            if (grantResults[1] == -1) {
                dialogMaker(alertDialog2, "이 앱을 실행하기 위해서는 전화를 걸고 관리할 수 있는 권한이 필요합니다.");
            } else if (grantResults[1] == 0) {
                perm2 = true;
            }
            if (grantResults[2] == -1) {
                dialogMaker(alertDialog3, "이 앱을 실행하기 위해서는 위치정보를 조회할 수 있는 권한이 필요합니다.");
            } else if (grantResults[2] == 0) {
                perm3 = true;
            }
        }
    }

    DialogInterface.OnClickListener dialogListener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int i) {
            if (dialog == alertDialog1 && i == DialogInterface.BUTTON_POSITIVE) {
                ActivityCompat.requestPermissions(CetiPermission3.this, new String[]{Manifest.permission.CAMERA}, 1);
            } else if (dialog == alertDialog2 && i == DialogInterface.BUTTON_POSITIVE) {
                ActivityCompat.requestPermissions(CetiPermission3.this, new String[]{Manifest.permission.READ_PHONE_STATE}, 2);
            } else if (dialog == alertDialog3 && i == DialogInterface.BUTTON_POSITIVE) {
                ActivityCompat.requestPermissions(CetiPermission3.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 3);
            }
        }
    };

    public void dialogMaker(AlertDialog dialog, String message) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("알림");
                builder.setMessage(message);
                builder.setPositiveButton("허가",dialogListener);
                builder.setNegativeButton("취소",null);
                builder.setCancelable(false);
    dialog=builder.create();
    dialog.show();
    }
}

필요할 경우 그대로 복사해서 사용해도 된다!

승인이 필요한 권한만 교체하거나 추가해서 사용하자.

거부한 사용자에게 승인을 권하는 멘트도 자유롭게!