web-dev-qa-db-ja.com

facebook login null pointer exception android

Stackoverflowをよく検索しましたが、問題を解決する答えが見つかりませんでした。したがって、私はこれを投稿しています。

サンプルAndroid Facebookのログインを使用しようとしているアプリがあります。次の手順に従います。

環境:Android studio Android SDKバージョン:22 Facebook SDK:4.0

エミュレータにFB APKをインストールする手順に従って、開発者ハッシュキーを生成し、app-> settingsで更新しました。 My 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);
}}

以下に示すように、nullポインター例外が発生しています

 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)

ここに何が欠けていますか?

10
user2752910

findViewById()を呼び出す前にsetContentView()を呼び出しているため、NullPointerExceptionを取得しているように見えるので、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);
        }
    });

}
16
Daniel Nugent

クラッシュは、AndoridMenifest.xmlファイルで設定しているapplicationIdに関連しているようです。 facebook sdkがLoginFrammentを作成するように結びついている場合、ApplicationIdはnullとして開始されることがわかりました。ここにcom.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投稿で指摘されているように、文字列リソースapp_idがAndroidによって正しく解析されていないため、applicationIdはnullになります。 https://github.com/jamesward/AndroidStringBug

以下のonCreateメソッドで示すように、facebook sdkを初期化した後にapplicationIdを手動で設定することで、この問題を解決しました。

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

anjが示す問題は、通常ApplicationIdが読み取られなかったためです。私の場合、問題は名前空間にありました。クラスの名前空間がルート名前空間であることを確認してください。だから私のアプリはxamarin Androidアプリであり、私は以下のように名前空間を使用していましたが、私のAndroid strings.xmlをmyApp.Droidに変更すると、私の問題が修正されました。

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