2016-08-01 81 views
1

我正在使用Facebook登錄集成到我的應用程序。我爲已簽名的APK配置了散列鍵Facebook,併成功運行。但有時當我釋放一個新的APK文件時,散列鍵不再有效(「無效的密鑰散列Facebook的android不匹配任何存儲」)。已簽名APK的Android Facebook哈希鍵有時會更改

我讀下面這個鏈接,發現「此外,根據計算機的,有時鍵可以改變,如果是這樣,哈希值發生變化,你就會有隻適應該」 android hash key

莫非你請幫我解釋一下這方面的更多細節? 簽名APK的散列鍵Facebook有時會更改嗎?如何將應用上傳到Play商店?

非常感謝。

+0

我面臨同樣的問題,之後我得到的哈希鍵的同時調試標誌apk.that鍵爲我工作。 – Vasant

+0

您需要在Facebook開發者控制檯註冊您的散列鍵,同時釋放您的APK在發佈模式! – Piyush

+0

在Facebook應用程序設置頁面中,有一個選項可以添加多個哈希值...如果您使用的是android studio,您可以通過直接從右側窗口中的gradle任務列表運行「signingReport」任務,輕鬆獲得簽名構建的哈希值。 ..感謝 –

回答

0

因爲每臺PC都有不同的debug.keystore文件,所以在切換PC時調試密鑰散列會發生變化。當你使用release.keystore文件釋放keyhash時,即使切換PC,也不會改變。在這種情況下,您正在使用相同的release.keystore文件。

+0

隨着你的評論,這意味着如果我們只使用一個文件release.keystore,散列鍵從來沒有改變,不是嗎? –

+0

是的..它不會根據Facebook的開發者文檔改變。 – LvN

+0

如果它正在更改,請確保您使用的是同一個文件,並且您添加到Facebook開發者控制檯的keyhash是正確的。我建議你使用logcat進行keyhash,不要去命令行工具,因爲它令人困惑。你可以使用@ user3793589的答案。生成已簽名的apk並在您的設備上運行它,檢查logcat並獲得您的版本keyhash。 – LvN

0

每當您的應用程序正在開發中調試散列鍵用於facebook集成。調試哈希密鑰是特定於計算機的(即,您正在其中工作的PC)

雖然釋放哈希鍵與調試密鑰(它不會更改)相比不同。當您爲上傳生成已簽名的apk時,必須更新發布哈希鍵才能與您的應用進行Facebook集成。

閱讀this關於如何創建Facebook的

釋放散列鍵可以使用下面的代碼檢查你的密鑰散列更好的理解:

// Add code to print out the key hash 
    try { 
     String PACKAGE_NAME=getApplicationContext().getPackageName();; 
     PackageInfo info = getPackageManager().getPackageInfo(
       PACKAGE_NAME, 
       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 (NameNotFoundException e) { 

    } catch (NoSuchAlgorithmException e) { 

    }  
+0

感謝您的回覆。正如我注意到的,我成功運行帶簽名APK的Facebook的哈希鍵,但有時當我生成新的APK文件進行測試時,哈希鍵不再有效。我只用了一臺PC。隨着你的評論,這意味着當我們生成一個新的APK文件時,哈希鍵可以改變,是不是? –

+0

@DinhThang你是否改變了包名?或項目名稱? – Arshak

+0

@DinhThang我添加了代碼,它將在運行您的應用程序時在logcat中顯示您的keyhash。您可以將其與Facebook開發者控制檯中存儲的keyhash進行比較,如果不同,請添加keyhash。 – Arshak

0

您需要註冊既是開發商hashkey (與您的計算機相關)以及Facebook上的生產hashkey(與簽名版本相關)。 爲了確保您有正確的鑰匙,在你的代碼運行此並複製輸出:

try { 
     PackageInfo info = getPackageManager().getPackageInfo(
       "Your package name", 
       PackageManager.GET_SIGNATURES); 
     for (Signature signature : info.signatures) { 
      MessageDigest md = MessageDigest.getInstance("SHA"); 
      md.update(signature.toByteArray()); 
      System.out.println(Base64.encodeToString(md.digest(), Base64.DEFAULT)); 
      } 
    } catch (NameNotFoundException e) { 

    } catch (NoSuchAlgorithmException e) { 

    }