web-dev-qa-db-fra.com

Tentative d'invoquer la méthode virtuelle 'int Java.lang.Object.hashCode ()' dans l'intégration facebook

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.

12
Parth Anjaria

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"/>
22
Deep Dave

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.

4
Izuchukwu Oleka

Si vous implémentez ceci dans un fragment, faites alors:

loginbutton.setfragment(this)

J'espère que cela t'aides.

0
mossman252

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.

0
TheAndroidFreak