我是Android开发新手,正在尝试使用facebook登录功能构建应用。 在运行应用程序时出现错误不幸的是,应用程序已停止。 我无法理解。请帮助弄清楚。
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.amdroid.route">
<uses-permission android:name="android.permission.INTERNET"/>
<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">
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<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.example.amdroid.route.MainActivity">
<com.facebook.login.widget.LoginButton
android:id="@+id/fb_login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
MainActivity.java
package com.example.amdroid.route;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MainActivity extends AppCompatActivity {
private CallbackManager callbackManager;
private LoginButton fbLoginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
//You need this method to be used only once to configure
//your key hash in your App Console at
// developers.facebook.com/apps
getFbKeyHash("com.example.amdroid.route");
setContentView(R.layout.activity_main);
fbLoginButton = (LoginButton)findViewById(R.id.fb_login_button);
fbLoginButton.registerCallback(callbackManager, new
FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
System.out.println("Facebook Login Successful!");
System.out.println("Logged in user Details : ");
System.out.println("--------------------------");
System.out.println("User ID : " +
loginResult.getAccessToken().getUserId());
System.out.println("Authentication Token : " +
loginResult.getAccessToken().getToken());
Toast.makeText(MainActivity.this, "Login Successful!",
Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "Login cancelled by user!",
Toast.LENGTH_LONG).show();
System.out.println("Facebook Login failed!!");
}
@Override
public void onError(FacebookException e) {
Toast.makeText(MainActivity.this, "Login unsuccessful!",
Toast.LENGTH_LONG).show();
System.out.println("Facebook Login failed!!");
}
});
}
public void getFbKeyHash(String packageName) {
try {
PackageInfo info = getPackageManager().getPackageInfo(
packageName,
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("YourKeyHash :", Base64.encodeToString(md.digest(),
Base64.DEFAULT));
System.out.println("YourKeyHash: "+
Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
@Override
protected void onActivityResult(int reqCode, int resCode, Intent i) {
callbackManager.onActivityResult(reqCode, resCode, i);
}
}
logcat的
04-06 00:50:41.517 31495-31528/com.example.amdroid.route E/AndroidRuntime:
FATAL EXCEPTION: AsyncTask #5
Process: com.example.amdroid.route, PID: 31495
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:772)
\
at
java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:800)
at com.facebook.internal.Utility.queryAppSettings(Utility.java:823)
at com.facebook.login.widget.LoginButton$1.run(LoginButton.java:489)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at
java.util.concurrent.ThreadPoolExecutor中$ Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)