Se si arriva a chiedersi come poter ottenere una hash key per integrare Facebook nelle proprie applicazioni significa che probabilmente, durante il loro sviluppo, vi siete imbattuti nell'errore "This app has no android key hashes configured. Configure your app key hashes at http: //developers.facebook.com/apps/..." oppure se avete già provato ad inserirne una non valida "Invalid key hash. The key hash … does not match any stored key hashes. Configure your app key hashes at http: //developers.facebook.com/apps/...".
La soluzione è più semplice di quanto si pensi dato che ponendosi questo problema è certo che avete già installato l'SDK di Android e pertanto è necessario seguire un passaggio già compreso nella guida presente sul sito degli sviluppatori di Facebook, in particolare nella parte relativa al rilascio della hash key (release-key-hash) che vado a riassumere di seguito:
Su Os X da Terminale:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Su Windows da Console:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%.androiddebug.keystore | openssl sha1 -binary | openssl base64
L'esecuzione del codice di cui sopra, rilascia una stringa di 28 caratteri valida per l'ottenimento di una hash key a fini di test/debug, essa dovrà essere inserita nell'apposito campo di testo presente nelle impostazioni della pagina relativa al proprio account sviluppatore ed è univoca per essere utilizzata con la macchina che l'ha generata. E' possibile generare più stringhe a seconda del numero di macchine di test.
Per l'utilizzo di una stringa per la versione non di sviluppo ma di rilascio è sufficiente seguire i passaggi succesivi sempre presenti nella guida ufficiale presente nel link precedentemente riportato.
Una volta lanciato il comando vi verrà chiesto di Immettere la password del keystore, sarà sufficiente inserirla e premere Invio per veder comparire la stringa di 28 caratteri di nostro interesse.
Nel caso in cui permanga l'errore "Invalid key hash. The key hash … does not match any stored key hashes. Configure your app key hashes at http: //developers.facebook.com/apps/..." significa che effettivamente quella chiave utilizzata non è valida e per risolvere il problema è necessario ottenere la chiave direttamente dall'applicazione inserendo nel codice lo script per ottenerla, inserire quindi subito dopo l'inizializzazione dell'SDK di Facebook la seguente porzione di codice sostituendo a "nome_del_package" il vostro effettivo nome del package:
try {
PackageInfo info = getPackageManager().getPackageInfo(“nome_del_package”, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
Sarà necessario importare le opportune dichiarazione e quando è la volta di quelle relative a "Signature" ci sarà una scelta multipla e quella di nostro interessa è la seguente:
import android.content.pm.Signature;
Non resta altro che eseguire il build ed il debug dell'applicazione e filtrare il Logcat con la chiave KeyHash per poter recuperare la stringa di 28 caratteri da inserire nell'apposito campo della pagina dell'app sotto il proprio account degli sviluppatori di Facebook, e sarà quindi possibile verificare come magicamente la comunicazione tra app e Facebook verrà stabilita.
Grazie mille il tuo articolo mi e' stato utilissimo, grazie mille..
La tua guida è inutile quanto la guida sviluppatori Facebook dato che da terminale se viene digitato quella stringa riconosce keytool o openssl come comandi non riconosciuti. Di almeno dove l'utente si deve spostare per avviare questo comando e farlo riconoscere. INUTILE GUIDA.
Ciao Nicolò,
mi spiace per la tua frustrazione ma mi spiace ancor di più, oltre leggere un messaggio di bassa educazione e rispetto, il fatto che non metti minimamente in discussione una tua eventuale concausa al problema, perché se ricevi quel messaggio di errore... proprio di questo si tratta...
Come puoi leggere nella "inutile" guida ho espressamente indicato la banalità dell'operazione ponendo che l'utente abbia già installato l'SDK di Android.
Questo lo dico perché se l'SDK è installato correttamente e le variabili di ambiente sono state configurate a dovere non hai bisogno di conoscere il percorso "dove l'utente si deve spostare per avviare questo comando e farlo riconoscere" in quanto da qualsiasi posizione il comando verrà lanciato, nel terminale, verrà riconosciuto e funzionerà (senza bisogno di accedere al path dove hai installato i tools dell'SKD).
Ti consiglio pertanto di rivedere l'installazione del tuo SDK e riprovare nonché la prossima volta di essere un po' più riflessivo nel rispondere dato che se c'è una guida ufficiale del produttore (Facebook), così come una guida agevolata e collaudata (la presente), senza contare le migliaia se non milioni di app che integrano Facebook, probabilmente a sbagliare non sono tutti ma è qualcosa generato da noi stessi.
Piccolo consiglio: per ottenere il nome del package da Android si può utilizzare il metodo getPackageName() da Activity, potresti metterlo al posto di "nome_del_package" così puoi generalizzare...
Ciao Luca Murra,
grazie del consiglio! Non potendo effettuare un test in questo momento sul codice oggetto di questo articolo ho inserito un link di tipo ancora nel testo al termine "nome del package" che rimanda al tuo commento così da renderlo di riferimento per l'informazione fornita.
Di nuovo grazie e un saluto!