I am trying to release my app on Google Play. I have a Facebook login in my app. Up until yesterday all was working fine till the time I was running the application with
Try this below code in on create method
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());
Log.i("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));//will give developer key hash
Toast.makeText(getApplicationContext(),Base64.encodeToString(md.digest(), Base64.DEFAULT), Toast.LENGTH_LONG).show(); //will give app key hash or release key hash
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
For Linux
Open Terminal :
For Debug Build
keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
you wil find debug.keystore from ".android" folder copy it from and paste on desktop and run above command
For release Build
keytool -exportcert -alias <aliasNameUseInReleseKeystore> -keystore <RelesekeystoreFilePath> | openssl sha1 -binary | openssl base64
NOTE : Make sure In Both case it must ask for password. If it does not asks for password that means something is wrong in command.
I have found a fantastic solution to manage debug and release environments.
1.Generate two hashes, for debug using this command:
keytool -exportcert -alias androiddebugkey -keystore c:\Users\YourUser\.android\debug.keystore | openssl sha1 -binary | openssl base64
And this one for release:
keytool -exportcert -alias "yourAliasUsedWhenYouGeneratedTheKey" -keystore "C:\Users\YourUser\AppData\Local\Android\android-studio\key.jks" | openssl sha1 -binary | openssl base64
2.Go to Facebook Applications and create TWO applications, one "Your Application" and other "Your Application (debug)". Then assign the debug hash to the debug application and the release hash to the normal application (obvious).
3.Get both Application Id and write them in the strings.xml file this way:
<string name="app_id">123456789</string>
<string name="app_id_debug">987654321</string>
4.And finally, in your code, register the appId programatically in your Facebook Login fragment this way:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
String appId;
try {
ApplicationInfo appinfo = getActivity().getPackageManager().getApplicationInfo(getActivity().getPackageName(), 0);
boolean isDebugMode = (0 != (appinfo.flags &= ApplicationInfo.FLAG_DEBUGGABLE));
if (isDebugMode)
appId = getString(R.string.app_id_debug);
else
appId = getString(R.string.app_id);
} catch (PackageManager.NameNotFoundException e) {
appId = getString(R.string.app_id);
}
Session session = new Session.Builder(getActivity().getBaseContext()).setApplicationId(appId).build();
Session.setActiveSession(session);
return inflater.inflate(R.layout.fragment_facebook_login, container, false);
}
This way you will use the right appId and the right application on every environment without changing anything!!
Here is what I did that solved the problem:
Used openssl-0.9.8e_WIN64 Instead of openssl-0.9.8k_WIN64 from here
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | PATH_TO_OPENSSL_LIBRARY\bin\openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64
example :
keytool -exportcert -alias "yourAliasKey" -keystore "C:\Users\YourUser\AppData\Local\Android\android-studio\key.jks" | PATH_TO_OPENSSL_LIBRARY\bin\openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64
use your playstore keystore alias as RELEASE_KEY_ALIAS and its's saved path with file name as RELEASE_KEY_PATH.
Note: use your playstore keystore password when if ask for type password.
Here is what I did that solved the problem:
I used this instead:
keytool -exportcert -alias <aliasNameUseInReleaseKeystore> -keystore <ReleasekeystoreFilePath> | openssl sha1 -binary | openssl base64
P.S. The method which I have posted in my question is really useless. It did nothing more than confuse me to no end.