LoginButton facebook android NullPoiunterExecptioi

时间:2017-01-25 14:18:51

标签: android facebook nullpointerexception

我想将登录按钮添加到我的应用程序中,所以我按照facebook的指南进行操作。我创建了我的应用程序项目,我添加了一个android项目,告诉包的名称和mainactivity的路径以及从默认密钥库生成的哈希代码(我用它们告诉我android调试密钥库,因为目前应用程序是仅在alfa测试中,因此出于个人发展原因,我更喜欢使用android studio生成的调试版本。然后我将字符串资源放入应用程序ID,并在标签应用程序中输入带有facebook app id的元数据作为指南。然后我也设置了环境:

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

    /**
     *
     *
     * part dedicated to facebook button
     */
    manager=CallbackManager.Factory.create();

    setContentView(R.layout.activity_main);
    loginButton=(LoginButton)findViewById(R.id.facebook_logi);
    loginButton.setReadPermissions("email");

    loginButton.registerCallback(manager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.i("Facebook","Login success");
        }

        @Override
        public void onCancel() {
            Log.i("Facebook","Login cencelled");
        }

        @Override
        public void onError(FacebookException error) {
            Log.i("Facebook","Login error "+error.getMessage());

        }
    });

    /**
     *
     *
     * end of facebook part
     */

当我尝试运行它时,VM会生成此异常

 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
                                                                                      at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:746)
                                                                                      at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:774)
                                                                                      at com.facebook.internal.FetchedAppSettingsManager.queryAppSettings(FetchedAppSettingsManager.java:147)
                                                                                      at com.facebook.login.widget.LoginButton$1.run(LoginButton.java:499)
                                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                      at java.lang.Thread.run(Thread.java:818)

任何人都可以帮助我因为我在这里搜索类似的问题,但我只找到了人们在应用程序标签之外用facebook_app_id推送meda数据的人。感谢所有人。

1 个答案:

答案 0 :(得分:0)

你的元标记应该在Manifest中的应用程序标记内:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

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

</application>

此外,如果你使用自定义登录按钮;

将此添加到您的布局:

 <com.facebook.login.widget.LoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

在你的活动中

 loginButton=(LoginButton)findViewById(R.id.login_button);
loginButton.setReadPermissions("email");

loginButton.registerCallback(manager, new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        Log.i("Facebook","Login success");
    }

    @Override
    public void onCancel() {
        Log.i("Facebook","Login cencelled");
    }

    @Override
    public void onError(FacebookException error) {
        Log.i("Facebook","Login error "+error.getMessage());

    }
});

现在只需在用户点击您的自定义login button

时调用facebook button即可
public void onClick(View v) {
    if (v == facebook_logi) {
        loginButton.performClick();
    }
 }