簡體   English   中英

facebook登錄null指針異常android

[英]facebook login null pointer exception android

我通過stackoverflow搜索了很多,但我找不到解決我的問題的答案。 因此我發布這個。

我有一個示例Android應用程序,我正在嘗試使用Facebook登錄。 以下是我遵循的步驟:

環境:Android工作室Android SDK版本:22 Facebook SDK:4.0

按照以下步驟在模擬器上安裝FB APK,生成Developer哈希密鑰並在app-> settings中更新它。 我的android清單有這些代碼

<uses-permission android:name="android.permission.INTERNET"/>

<activity android:name="com.facebook.FacebookActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/app_name" />

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>

在我的activity_main.xml布局文件中,我有這段代碼

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

最后在我的主要活動中我有這個

public class MainActivity extends Activity {
LoginButton loginButton;
CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    callbackManager = CallbackManager.Factory.create();
    loginButton = (LoginButton) findViewById(R.id.fblogin_button);
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Toast.makeText(getApplicationContext(),"Fb Login Success",Toast.LENGTH_LONG);
        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(),"Fb on cancel",Toast.LENGTH_LONG);
        }

        @Override
        public void onError(FacebookException e) {
            Toast.makeText(getApplicationContext(),"Fb Login Error",Toast.LENGTH_LONG);
        }
    });
    setContentView(R.layout.activity_main);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("Inside Fb login","on Activiry result");
    callbackManager.onActivityResult(requestCode, resultCode, data);
}}

我得到一個空指針異常,如下所示

 java.lang.RuntimeException: Unable to start activity componentInfo{PROJECT.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.login.widget.LoginButton.registerCallback(com.facebook.CallbackManager, com.facebook.FacebookCallback)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我在這里錯過了什么?

看起來你得到一個NullPointerException因為你在調用setContentView()之前調用了findViewById() setContentView() ,所以當你調用loginButton.registerCallback()時, loginButton為null。

只需將調用setContentView()移到頂部:

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

    FacebookSdk.sdkInitialize(getApplicationContext());

    setContentView(R.layout.activity_main); //Moved up here to resolve NPE

    callbackManager = CallbackManager.Factory.create();
    loginButton = (LoginButton) findViewById(R.id.fblogin_button);
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Toast.makeText(getApplicationContext(),"Fb Login Success",Toast.LENGTH_LONG);
        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(),"Fb on cancel",Toast.LENGTH_LONG);
        }

        @Override
        public void onError(FacebookException e) {
            Toast.makeText(getApplicationContext(),"Fb Login Error",Toast.LENGTH_LONG);
        }
    });

}

崩潰似乎與我們在AndoridMenifest.xml文件中設置的AndoridMenifest.xml 正如我發現當facebook sdk正在創建LoginFramment然后ApplicationId將LoginFramment nullcom.facebook.login.LoginFragment類的onCreate方法

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null) {
            this.loginClient = (LoginClient)savedInstanceState.getParcelable("loginClient");
            this.loginClient.setFragment(this);
        } else {
            this.loginClient = new LoginClient(this);
        }

        this.loginClient.setOnCompletedListener(new OnCompletedListener() {
            public void onCompleted(Result outcome) {
                LoginFragment.this.onLoginClientCompleted(outcome);
            }
        });
        FragmentActivity activity = this.getActivity();
        if(activity != null) {
            this.initializeCallingPackage(activity);
            if(activity.getIntent() != null) {
                //the applicationId in this.request object is null 
                this.request = (Request)activity.getIntent().getParcelableExtra("request");

            }

        }
    }

正如varoius帖子所指出的那樣,applicationId將變為null,因為android沒有正確解析字符串資源app_id https://github.com/jamesward/AndroidStringBug

我在初始化facebook sdk后手動設置applicationId解決了這個問題,如下面onCreate方法中給出的那樣。

FacebookSdk.sdkInitialize(getApplicationContext());
FacebookSdk.setApplicationId(getResources().getString(R.string.app_id));
mFacebookCallbackManager = CallbackManager.Factory.create();

作為anj指出的問題通常與ApplicationId沒有被讀取。 就我而言,問題在於命名空間。 確保您的類的命名空間是根命名空間。 所以我的應用程序是一個xamarin Android應用程序,我使用命名空間如下,但我的Android應用程序的命名空間是myApp.Droid,這樣方式ApplicaitonId不讀取strings.xml更改為myApp.Droid解決了我的問題。 我希望它可以幫助其他有類似問題的人

[assembly: MetaData("com.facebook.sdk.ApplicationId", Value = "@string/app_id")]
namespace myApp.Droid.Renderer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM