1

我有一些問題與Android哈希鍵和Facebook SDK。我實現了一個登錄頁面,如解釋here,當我第一次嘗試登錄一切正常工作。之後,我註銷並嘗試再次登錄,現在我得到一個關於Android kay哈希的錯誤,看起來與this完全相同。Android鍵哈希和Facebook登錄

我已經在Android開發人員控件和Facebook控制面板中同時爲我的應用程序簽名。我的哈希關鍵是SHA1,看起來像9A:BC:08 ...

這裏是源代碼:

activity_facebook_login.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.axelfiedler.stayup.FacebookLoginActivity" > 

<com.facebook.widget.LoginButton 
    android:id="@+id/authButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginTop="30dp" 
    /> 

FacebookLoginActivity.java

package com.axelfiedler.stayup; 

import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class FacebookLoginActivity extends FragmentActivity { 

private MainFragment mainFragment; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState == null) { 
     // Add the fragment on initial activity setup 
     mainFragment = new MainFragment(); 
     getSupportFragmentManager() 
     .beginTransaction() 
     .add(android.R.id.content, mainFragment) 
     .commit(); 
    } else { 
     // Or set the fragment from restored state info 
     mainFragment = (MainFragment) getSupportFragmentManager() 
     .findFragmentById(android.R.id.content); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.facebook_login, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

MainFragment.java

package com.axelfiedler.stayup; 

import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.UiLifecycleHelper; 
import com.facebook.widget.LoginButton; 

import android.support.v4.app.Fragment; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MainFragment extends Fragment { 

private static final String TAG = "MainFragment"; 
private UiLifecycleHelper uiHelper; 


private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (state.isOpened()) { 
     Log.i(TAG, "Logged in..."); 
    } else if (state.isClosed()) { 
     Log.i(TAG, "Logged out..."); 
    } 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    uiHelper = new UiLifecycleHelper(getActivity(), callback); 
    uiHelper.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_facebook_login, container, false); 
    LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); 
    authButton.setFragment(this); 

    return view; 



} 

@Override 
public void onResume() { 
    super.onResume(); 
    uiHelper.onResume(); 
    // For scenarios where the main activity is launched and user 
    // session is not null, the session state change notification 
    // may not be triggered. Trigger it if it's open/closed. 
    Session session = Session.getActiveSession(); 
    if (session != null && 
      (session.isOpened() || session.isClosed())) { 
     onSessionStateChange(session, session.getState(), null); 
    } 

    uiHelper.onResume(); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    uiHelper.onDestroy(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    uiHelper.onSaveInstanceState(outState); 
} 

} 

回答

1

您是否嘗試獲取通過應用程序發送的hashkey?您可以通過此代碼執行此操作:

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

try { 
    PackageInfo info = getPackageManager().getPackageInfo(
      "com.facebook.samples.loginhowto", 
      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) { 

} 
... 

這將記錄一個hashkey。這將驗證您是否擁有正確的hashkey。如果沒有,將這個hashkey添加到您的控制檯,它應該工作。這是我做我的正確哈希鍵。