Ciao! Io ho avuto modo ieri mattina di vedere un po' l'utilizzo del GPS. Vedo con quel poco che ho capito se posso aiutarti.
Cmq... ho visto che usi Criteria, secondo me non ti conviene utilizzare questa classe a meno che tu non abbia particolari esigenze, nel tuo caso si tratta solo di geotaggare la foto perchè non usi semplicemente le celle GSM se non hai il GPS attivato?
Non ho mai usato direttamente Criteria, però c'è qualcosa che non mi convince nel tuo codice. Tu prima chiedi il bestProvider con ACCURACY_FINE con il flag a false, quindi a regola ti potrebbe restituire anche uno not enable ( che suppongo significhi che possa anche non essere disponibile) già qui metterei "true"; poi dopo registri la callback al provider per richiedere gli aggiornamenti e dopo verifichi se il GPS è attivo. Che senso ha? se il GPS non è attivo ti ritrovi con il bestProvider che potrebbe anche essere non disponibile, sempre se ho interpretato bene la documentazione e qui potrebbe essere la magagna

Personalmente io prima verificherei che il GPS sia attivo, se è attivo allora lo preferisco come provider e lo registro, altrimenti prendi il bestProvider ma tra quelli abilitati (flag "true") anche se io a quel punto andrei di celle GSM con LocationManager.NETWORK_PROVIDER, che per geotaggare una foto vanno più che bene.

Fammi sapere se ci sono news!