web-dev-qa-db-fra.com

Facebook SDK 4.0.1 Connexion sans bouton de connexion

J'essaie de me connecter sans utiliser le bouton de connexion. J'ai suivi le tutoriel facebook mais je ne peux pas le faire fonctionner, donnez-moi toujours NullPointerException. Mon manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.hema.testfcaebooksdk" >

    <uses-permission Android:name="Android.permission.INTERNET"/>

    <application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >

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

        <activity Android:name="com.facebook.FacebookActivity"
            Android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            Android:theme="@Android:style/Theme.Translucent.NoTitleBar"
            Android:label="@string/app_name" />

        <provider Android:authorities="com.facebook.app.FacebookContentProvider****************"
            Android:name="com.facebook.FacebookContentProvider"
            Android:exported="true" />

        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

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

</manifest>

Mon activité que je l'utilise pour me connecter à Facebook:

public class MainActivity extends ActionBarActivity {

    CallbackManager callbackManager;
    LoginManager loginManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FacebookSdk.sdkInitialize(getApplicationContext());

        callbackManager = CallbackManager.Factory.create();

        loginManager = LoginManager.getInstance();

        loginManager.registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        // App code
                        Toast.makeText(getApplicationContext(), loginResult.getAccessToken().toString(), Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onCancel() {
                        // App code
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                    }
                });

        Collection<String> permissions = Arrays.asList("public_profile", "user_friends");

        loginManager.logInWithReadPermissions(this, permissions); // Null Pointer Exception here
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
}

Mon chat de journal:

04-14 20:03:46.840    8075-8075/com.example.hema.testfacebooksdk E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.hema.testfacebooksdk, PID: 8075
    Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hema.testfacebooksdk/com.example.hema.testfacebooksdk.MainActivity}: Java.lang.NullPointerException
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2413)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2471)
            at Android.app.ActivityThread.access$900(ActivityThread.Java:175)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1308)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:146)
            at Android.app.ActivityThread.main(ActivityThread.Java:5602)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1283)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: Java.lang.NullPointerException
            at com.facebook.login.LoginManager.getLogger(LoginManager.Java:391)
            at com.facebook.login.LoginManager.logCompleteLogin(LoginManager.Java:414)
            at com.facebook.login.LoginManager.startLogin(LoginManager.Java:384)
            at com.facebook.login.LoginManager.logInWithReadPermissions(LoginManager.Java:262)
            at com.example.hema.testfacebooksdk.MainActivity.onCreate(MainActivity.Java:59)
            at Android.app.Activity.performCreate(Activity.Java:5451)
            at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1093)
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2377)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2471)
            at Android.app.ActivityThread.access$900(ActivityThread.Java:175)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1308)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:146)
            at Android.app.ActivityThread.main(ActivityThread.Java:5602)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1283)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)
            at dalvik.system.NativeStart.main(Native Method)

J'ai tout essayé mais je me suis retrouvé avec NullPointerException S'il vous plaît, aidez-moi!

18
Ibrahim Disouki

Ok je ne sais pas si vous aviez déjà résolu votre problème mais voici comment je l'ai résolu

 List<String> permissionNeeds= Arrays.asList("user_photos", "friends_photos", "email", "user_birthday", "user_friends");




 super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    mCallbackManager = CallbackManager.Factory.create();
    LoginManager.getInstance().logInWithReadPermissions(
            this,
           permissionNeeds);
    LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResults) {

                    GraphRequest request = GraphRequest.newMeRequest(
                            loginResults.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(
                                        JSONObject object,
                                        GraphResponse response) {
                                    // Application code
                                    Log.v("LoginActivity", response.toString());
                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,email,gender, birthday");
                    request.setParameters(parameters);
                    request.executeAsync();

                }
                @Override
                public void onCancel() {

                    Log.e("dd","facebook login canceled");

                }


                @Override
                public void onError(FacebookException e) {



                    Log.e("dd", "facebook login failed error");

                }
            });
21
Soham

Essayez de déplacer vos métadonnées et votre activité sous le nœud d'application plutôt que sur le premier nœud d'activité.

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >

    <meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/>
    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name" >
        <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" />
</application>
6
MParker

Votre problème est que vous utilisez FacebookSdk.sdkInitialize(getApplicationContext()); après setContentView(R.layout.activity_main);. Vous devez l'utiliser avant setContentView(). Un exemple de connexion Facebook complet avec un exemple de code peut être trouvé ici .

5

Essayez de cette façon:

  • Créez l'application Android sur le développeur Facebook et réglez-la en mode de développement public à la place.

  • Manifeste:

        <meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/>
    <activity
        Android:name="com.facebook.FacebookActivity"
        Android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        Android:label="@string/app_name"/>
    
  • Strings.xml

    XXXXXXXXXXXXXX

  • Si vous souhaitez utiliser fragment pour la connexion, la méthode appropriée est la suivante:

Étape 1:

    CallbackManager mCallbackManager;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //@Deprecated for latest version, without this line working fine. 
        //FacebookSdk.sdkInitialize(getActivity().getApplicationContext());


        mCallbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // App code
                    Log.e("Success", "Login");
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id, first_name, last_name ,email, gender, birthday");

                    GraphRequest gr = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject json, GraphResponse response) {
                                    if (response.getError() != null) {
                                        // handle error
                                        System.out.println("ERROR "+response.getError().toString());
                                    } else {
                                        //System.out.println("Success");
                                        try {

                                            String jsonresult = String.valueOf(json);
                                            System.out.println("JSON Result"+jsonresult);
                                            String resp = String.valueOf(response.getJSONObject());
                                            System.out.println("JSON resp "+resp);


                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }

                            });
                    gr.setParameters(parameters);
                    gr.executeAsync();

                }

                @Override
                public void onCancel() {
                    // App code
                    Log.e("onCancel", "Login");
                }

                @Override
                public void onError(FacebookException onError) {
                    // App code
                    Log.e("onError", "Login "+onError.getMessage());
                }
            });
    }

Étape 2:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            mCallbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }

Étape 3: - à l'intérieur d'OnClickListener

LoginManager.getInstance().logInWithReadPermissions(YourFragment.this, Arrays.asList("public_profile"));

J'utilisais getActivity() et à cause de cela à chaque fois quelque chose clignote montrant la vue de connexion Facebook. Fondamentalement, getActivity() doit utiliser FragmentClaseName.this. J'espère que cela vous aidera. Bon codage !!!

4
enam

vous avez peut-être oublié d'ajouter ce code comme ci-dessous dans votre AndroidManifest.xml

<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="@string/facebook_app_id" />
3
Guu

1) u devrait initialiser sdk avant setContentView ()

2) vous devez écrire Loginmanager.getInstance (). LogInWithReadPermission (.....) sur un écouteur de clic sur un bouton

0
Pratik Deogade