Per semplificare, in Manifest dichiari i permessi che l'app richiede mentre nel codice effettui la richiesta runtime all'utente.
Una volta concesso il permesso questo viene rgeistrato da Android e quindi se l'utemte non lo revoca (Settings/Applicazioni..) non verrà chiesto nuovamente. Hai anche una funzione che eseguirebbe un semplice check, ma ha più senso in un service ed in casi particolari; in genere se ne sconsiglia l'uso.
Per la CAMERA ti comporti allo stesso modo che per la DirExternal
Non ricordo in quale thread, ma trovi facilmente anche del codice che chiede tutti permessi necessari, uno dietro l'atro, così poi decidi se chiudere l'app o proseguire con funzionalità limitate o funzionamento diverso