ich erhalte den followin-Fehler, wenn ich die Facebook-Integration versuche:
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: Process: com.creaa.admin.mylogin, PID: 23052
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: Java.lang.NullPointerException: Attempt to invoke virtual method 'int Java.lang.Object.hashCode()' on a null object reference
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at Java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.Java:746)
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at Java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.Java:774)
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at com.facebook.internal.Utility.queryAppSettings(Utility.Java:822)
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at com.facebook.login.widget.LoginButton$1.run(LoginButton.Java:489)
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1112)
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:587)
11-18 15:57:54.186 23052-23093/com.creaa.admin.mylogin E/AndroidRuntime: at Java.lang.Thread.run(Thread.Java:818)
unten ist meine Haupttätigkeit:
public class MainActivity extends Activity {
private static String APP_ID = "1500167156975715"; // Replace your App ID here
CallbackManager callbackManager;
ArrayList<String> permissions;
Context cv = this;
boolean loginflag = false;
private ProfileTracker profiletracker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//initilise fb sdk
FacebookSdk.sdkInitialize(getApplicationContext());
//logout any previous logins
AccessToken accessToken = AccessToken.getCurrentAccessToken();
accessToken.setCurrentAccessToken(null);
Profile.getCurrentProfile().setCurrentProfile(null);
LoginManager.getInstance().logOut();
setContentView(R.layout.activity_main);
permissions = new ArrayList<String>();
permissions.add("email");
permissions.add("user_likes");
permissions.add("user_friends");
permissions.add("public_profile");
permissions.add("user_birthday");
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.example.facebooklogin",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("Parth", "KeyHash : " + Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
callbackManager = CallbackManager.Factory.create();
LoginButton loginbutton = (LoginButton) findViewById(R.id.login_button);
loginbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (AccessToken.getCurrentAccessToken() != null && Profile.getCurrentProfile() != null) {
if (loginflag) {
AccessToken accessToken = AccessToken.getCurrentAccessToken();
accessToken.setCurrentAccessToken(null);
Profile.getCurrentProfile().setCurrentProfile(null);
Toast.makeText(cv, "Logout", Toast.LENGTH_SHORT).show();
LoginManager.getInstance().logOut();
}
} else {
if (!loginflag) {
Toast.makeText(cv, "Login", Toast.LENGTH_SHORT).show();
LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, permissions);
}
}
}
});
loginbutton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult result) {
// TODO Auto-generated method stub
Toast.makeText(cv, "in onSucess", Toast.LENGTH_SHORT).show();
//get account details
GraphRequest request = GraphRequest.newMeRequest(result.getAccessToken(), new GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
// TODO Auto-generated method stub
Log.d("Parth", response.toString() + "\njson" + object.toString());
try {
String email = (String) object.get("email");
Toast.makeText(cv, email, Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email,gender,birthday");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onError(FacebookException error) {
// TODO Auto-generated method stub
Toast.makeText(cv, "in onError", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
Toast.makeText(cv, "in oncancel", Toast.LENGTH_SHORT).show();
}
});
profiletracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
// TODO Auto-generated method stub
if (currentProfile != null) {
Toast.makeText(cv, "in Currentprofilechanged", Toast.LENGTH_SHORT).show();
String name = currentProfile.getName();
String fname = currentProfile.getFirstName();
Toast.makeText(MainActivity.this, fname, Toast.LENGTH_SHORT).show();
}
}
};
}
}
unten ist die app gradle:
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.creaa.admin.mylogin"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
}
repositories { mavenCentral() }
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.facebook.Android:facebook-Android-sdk:4.6.0'
}
unten ist die Manifestdatei:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.creaa.admin.mylogin" >
<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" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name="com.facebook.FacebookActivity"
Android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
Android:label="@string/app_name"
Android:theme="@Android:style/Theme.Translucent.NoTitleBar" />
<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="1500167156975715"/>
<provider
Android:name="com.facebook.FacebookContentProvider"
Android:authorities="com.facebook.app.FacebookContentProvider233936543368280"
Android:exported="true" />
</application>
</manifest>
ich habe alle möglichen Dinge ausprobiert, aber ich kann den Fehler nicht herausfinden. Es wäre sehr nett, wenn mir jemand bei diesem Problem helfen könnte. Ich habe gerade von Eclipse zu Android Studio gewechselt. Dieser Code hat in Eclipse gut funktioniert, funktioniert aber nicht in Android Studio.
ich habe dieses Problem nach so viel Forschung und Entwicklung gelöst. Was Sie tun müssen, ist Facebook APPID in string.xml zu definieren und diese Zeichenfolge in Metadaten im Manifest unter application tag zu verwenden.
string.xml
<string name="facebook_app_id">XXXXXX</string>
manifest.xml
<meta-data
Android:name="com.facebook.sdk.ApplicationId"
Android:value="@string/facebook_app_id"/>
Ich fand das Problem schließlich heraus und kam zu dem Fix. Das Problem bestand darin, dass die Anmeldungsschaltfläche die Anwendungs-App-ID nicht finden konnte. Sie müssen lediglich das Meta-Tag der Anwendungs-ID in das Anwendungs-Tag-Element einfügen. Das ist alles
Wenn Sie dies in einem Fragment implementieren, führen Sie Folgendes aus:
loginbutton.setfragment(this)
Hoffe das hilft.
Prüfen Sie im Login-Manager Callback, ob ein Fehler vorliegt. Falls ja. handhaben.
Für jede Berechtigung wird die Rückruffunktion aufgerufen. Prüfen Sie, welche Berechtigungen der Benutzer genehmigt hat, und verarbeiten Sie die Informationen entsprechend.