je reçois l'erreur suivante lorsque j'essaie l'intégration de Facebook:
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)
ci-dessous est mon activité principale:
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();
}
}
};
}
}
ci-dessous est le grade de l'application:
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'
}
ci-dessous est le fichier manifeste:
<?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>
j'ai essayé toutes les choses possibles mais je ne peux pas comprendre l'erreur. ce serait très gentil si quelqu'un pouvait m'aider avec ce problème. Je viens de passer d'Eclipse au studio Android. ce code fonctionnait bien dans Eclipse mais ne fonctionne pas dans le studio Android.
j'ai résolu ce problème après tant de travaux de recherche et développement… .. Ce que vous devez faire est de simplement définir Facebook APPID dans string.xml et d'utiliser cette chaîne dans les métadonnées du manifeste sous balise d'application.
string.xml
<string name="facebook_app_id">XXXXXX</string>
manifeste.xml
<meta-data
Android:name="com.facebook.sdk.ApplicationId"
Android:value="@string/facebook_app_id"/>
J'ai finalement compris le problème et proposé le correctif. Le problème était que le bouton de connexion ne pouvait pas localiser l'ID de l'application. Il vous suffisait de placer la balise méta de l'ID de l'application dans l'élément de balise de l'application.
Si vous implémentez ceci dans un fragment, faites alors:
loginbutton.setfragment(this)
J'espère que cela t'aides.
Dans Callback-manager, vérifiez si une erreur est présente. Si oui. le gérer.
Pour chaque autorisation, la fonction de rappel est appelée. Vérifiez les autorisations que l'utilisateur a approuvées et traitez les informations en conséquence.