2013-10-16 46 views
3

我想Facebook登錄融入我的應用程序如何Facebook登錄融入Android應用

我去了這個教程:https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/

下載的Facebook SDK 3.5

一步一步 - 下載的OpenSSL ,創建了一個androidkeystore,生成了hashkey,在facebook開發控制檯中創建了一個應用程序,爲它提供了我的程序包名稱,以及登錄的活動,以及設備在日誌控制檯中向我輸出的哈希碼,如教程建議+ hashkey我使用openssl生成,將app_id添加到字符串文件和t他所需的權限活動和元數據到Android清單文件

現在我打開應用程序並點擊「登錄與Facebook按鈕」 它要求我允許用戶配置文件,我點擊確定

,然後日誌打印此異常:

10-16 19:51:20.718: W/Bundle(8444): Key com.facebook.platform.protocol.PROTOCOL_VERSION expected String but value was a java.lang.Integer. The default value <null> was returned. 
10-16 19:51:20.718: W/Bundle(8444): Attempt to cast generated internal exception: 
10-16 19:51:20.718: W/Bundle(8444): java.lang.ClassCastException: java.lang.Integer 
10-16 19:51:20.718: W/Bundle(8444):  at android.os.Bundle.getString(Bundle.java:1040) 
10-16 19:51:20.718: W/Bundle(8444):  at android.content.Intent.getStringExtra(Intent.java:3412) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:829) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:278) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.AuthorizationClient.tryNextHandler(AuthorizationClient.java:244) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.AuthorizationClient$GetTokenAuthHandler.getTokenCompleted(AuthorizationClient.java:778) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.AuthorizationClient$GetTokenAuthHandler$1.completed(AuthorizationClient.java:737) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.internal.PlatformServiceClient.callback(PlatformServiceClient.java:144) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.internal.PlatformServiceClient.handleMessage(PlatformServiceClient.java:128) 
10-16 19:51:20.718: W/Bundle(8444):  at com.facebook.internal.PlatformServiceClient$1.handleMessage(PlatformServiceClient.java:54) 
10-16 19:51:20.718: W/Bundle(8444):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-16 19:51:20.718: W/Bundle(8444):  at android.os.Looper.loop(Looper.java:130) 
10-16 19:51:20.718: W/Bundle(8444):  at android.app.ActivityThread.main(ActivityThread.java:3906) 
10-16 19:51:20.718: W/Bundle(8444):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-16 19:51:20.718: W/Bundle(8444):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-16 19:51:20.718: W/Bundle(8444):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:840) 
10-16 19:51:20.718: W/Bundle(8444):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:598) 
10-16 19:51:20.718: W/Bundle(8444):  at dalvik.system.NativeStart.main(Native Method) 

這是一個警告,應用程序沒有崩潰,因爲這一點,但是在登錄本身出現故障

這是我的登錄流程代碼:

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 

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

public class MainActivity extends FragmentActivity { 

private static final int SPLASH = 0; 
private static final int SELECTION = 1; 
private static final int FRAGMENT_COUNT = SELECTION + 1; 

private Fragment[] fragments = new Fragment[FRAGMENT_COUNT]; 

private boolean isResumed = false; 

private UiLifecycleHelper uiHelper; 
private Session.StatusCallback callback = 
    new Session.StatusCallback() { 
    @Override 
    public void call(Session session, 
      SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 
/** 
* @param savedInstanceState 
*/ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    FragmentManager fm = getSupportFragmentManager(); 
    fragments[SPLASH] = fm.findFragmentById(R.id.splashFragment); 
    fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment); 

    FragmentTransaction transaction = fm.beginTransaction(); 
    for (int i = 0; i < fragments.length; i++) { 
     transaction.hide(fragments[i]); 
    } 
    transaction.commit(); 
} 


private void showFragment(int fragmentIndex, boolean addToBackStack) { 
    FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction transaction = fm.beginTransaction(); 
    for (int i = 0; i < fragments.length; i++) { 
     if (i == fragmentIndex) { 
      transaction.show(fragments[i]); 
     } else { 
      transaction.hide(fragments[i]); 
     } 
    } 
    if (addToBackStack) { 
     transaction.addToBackStack(null); 
    } 
    transaction.commit(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    uiHelper.onResume(); 
    isResumed = true; 
} 

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

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

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

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

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    // Only make changes if the activity is visible 
    if (isResumed) { 
     FragmentManager manager = getSupportFragmentManager(); 
     // Get the number of entries in the back stack 
     int backStackSize = manager.getBackStackEntryCount(); 
     // Clear the back stack 
     for (int i = 0; i < backStackSize; i++) { 
      manager.popBackStack(); 
     } 
     if (state.isOpened()) { 
      // If the session state is open: 
      // Show the authenticated fragment 
      showFragment(SELECTION, false); 
     } else if (state.isClosed()) { 
      // If the session state is closed: 
      // Show the login fragment 
      showFragment(SPLASH, false); 
     } 
    } 
} 

@Override 
protected void onResumeFragments() { 
    super.onResumeFragments(); 
    Session session = Session.getActiveSession(); 

    if (session != null && session.isOpened()) { 
     // if the session is already open, 
     // try to show the selection fragment 
     showFragment(SELECTION, false); 
    } else { 
     // otherwise present the splash screen 
     // and ask the person to login. 
     showFragment(SPLASH, false); 
    } 
} 

}

我到底做錯了什麼?爲什麼不起作用?

+0

https://androidbeasts.wordpress.com/2015/08/19/facebook-integration-in-android/#more-109 – Aakash

回答

4

的問題是 -

無處教程頁面上沒有它說,我必須退出,如果我試圖與不是Facebook的應用程序的管理員或定義的一個賬號登錄的沙盒模式假賬戶

一旦我把應用程序進入直播模式,它的工作