我正在尝试通过我的Android应用程序登录facebook登录,但它总是给我一个无效的密钥哈希。我已经使用facebook开发者网站上给出的命令通过我的mac上的终端正确生成了哈希密钥,并且还正确使用了我的facebook应用程序ID。这是我登录活动类的代码:
LoginActivity.java
package com.titmus.worldscope;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.webkit.WebView;
import android.widget.Toast;
import com.facebook.AccessToken;
import com.titmus.worldscope.model.WorldScopeUser;
import com.titmus.worldscope.utility.WorldScopeAPIService;
import com.titmus.worldscope.utility.WorldScopeRestAPI;
import java.security.MessageDigest;
import fragment.FacebookLoginFragment;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class LoginActivity extends AppCompatActivity implements FacebookLoginFragment.OnFragmentInteractionListener {
private static final String TAG = "LoginActivity";
private static final String WELCOME_GIF_LINK = "file:///android_asset/welcomeGifAssets/welcome.html";
private static final String APP_SERVER_AUTH_FAILED_MSG = "Authentication with WorldScope's server has failed, please check that you have internet connections and try again.";
private static Context context;
private FacebookLoginFragment facebookLoginFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facebook_login);
context = this;
loadGifIntoWebView();
}
@Override
public void onFacebookLoginSuccess(AccessToken accessToken) {
// Successful login -> Redirect to Main activity
Log.d(TAG, "Login Success!");
Log.d(TAG, "AccessToken: " + accessToken.getToken());
// Instantiate and make a call to login user into WorldScope servers
Call<WorldScopeUser> call = new WorldScopeRestAPI(context).buildWorldScopeAPIService().loginUser(new WorldScopeAPIService.LoginUserRequest(accessToken.getToken()));
call.enqueue(new Callback<WorldScopeUser>() {
@Override
public void onResponse(Response<WorldScopeUser> response) {
if(response.isSuccess()) {
Log.d(TAG, "Success!");
Log.d(TAG, "" + response.body().toString());
WorldScopeUser user = response.body();
WorldScopeAPIService.setUser(user);
// Redirect to MainActivity if successful
redirectToMainActivity();
} else {
Log.d(TAG, "Failure" + response.code() + ": " + response.message());
// Logout of Facebook
logoutOfFacebook();
}
}
@Override
public void onFailure(Throwable t) {
Log.d(TAG, "Failure: " + t.getMessage());
// Logout of Facebook
logoutOfFacebook();
}
});
}
//Redirects to MainActivity
protected void redirectToMainActivity() {
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("activity", TAG);
startActivity(intent);
}
// Called to logout of Facebook when attempt to authenticate with App server fails
private void logoutOfFacebook() {
if(facebookLoginFragment == null) {
// Get FacebookLoginFragment if missing
facebookLoginFragment = (FacebookLoginFragment) getSupportFragmentManager().findFragmentById(R.id.facebookLoginButtonFragment);
}
// Toast to inform user
Toast toast = Toast.makeText(context, APP_SERVER_AUTH_FAILED_MSG, Toast.LENGTH_LONG);
toast.show();
facebookLoginFragment.logoutFromFacebook();
}
// Method to load Gif's html data into WebView
private void loadGifIntoWebView() {
WebView welcomeGifWebView = (WebView) findViewById(R.id.welcomeGifWebView);
welcomeGifWebView.loadUrl(WELCOME_GIF_LINK);
}
}
activity_facebook_login.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/loginActivity"
tools:context="com.titmus.worldscope.LoginActivity">
<WebView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/welcomeGifWebView"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/facebookLoginButtonFragment"
android:layout_centerHorizontal="true"
android:layout_marginBottom="48dp">
<ImageView
android:layout_width="32dp"
android:layout_height="match_parent"
android:id="@+id/imageView"
android:src="@drawable/ic_logo"
android:layout_alignBottom="@+id/textView4"
android:layout_toStartOf="@+id/textView4"
android:layout_marginEnd="4dp"
android:paddingTop="6dp"
android:paddingBottom="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="WorldScope"
android:id="@+id/textView4"
android:textColor="#ffffff"
android:textStyle="bold"
android:textSize="32sp"
android:layout_above="@+id/facebookLoginButtonFragment"
android:layout_centerHorizontal="true" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="By logging in you agree to WorldScope's Privacy Policy and Terms of Use."
android:id="@+id/textView6"
android:textColor="#eeeeee"
android:textSize="14dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textAlignment="center"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="57dp" />
<fragment
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:name="fragment.FacebookLoginFragment"
android:id="@+id/facebookLoginButtonFragment"
tools:layout="@layout/fragment_facebook_login"
android:layout_marginBottom="14dp"
android:layout_above="@+id/textView6"
android:layout_alignParentStart="true" />
</RelativeLayout>
答案 0 :(得分:1)
使用cmd生成的keyhash适用于第一个,然后它没有。
因此,请使用此方法在任何类
中生成keyHashpublic void printHashKey(){
// Add code to print out the key hash
try {
PackageInfo info = getPackageManager().getPackageInfo(
"net.simplifiedcoding.androidlogin",
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) {
}
}
然后复制密钥哈希生成,并将其粘贴到您在Facebook开发人员控制台中添加由cmd生成的keyhash的位置。
它可以工作,并且不会将应用程序仅限制在Facebook开发人员控制台中的一个设备