Facebook SDK 4.0.1 Login without login button

余生长醉 提交于 2019-11-28 17:36:35

Ok I don't know if you had already solve your problem but here is how I solved it

 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");

                }
            });

Try moving your meta-data and activity under the application node rather than the first activity node.

<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>
Menelaos Kotsollaris

Your issue is that you use FacebookSdk.sdkInitialize(getApplicationContext()); after setContentView(R.layout.activity_main);. You should use it before setContentView(). A full facebook login example with sample code can be found here.

Try in this way:

  • Create Android app on Facebook developer and set it to public instead development mode.

  • Manifest:

        <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

  • If you want to use fragment for Login the proper way is:

Step 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());
                }
            });
    }

Step 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);
        }
    }

Step 3: - inside OnClickListener

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

I was using getActivity() and because of this every time something flashes instead showing Facebook Login view. Basically instead getActivity() have to use FragmentClaseName.this. I hope this will help u. Happy coding!!!

maybe your forgot that add this code as bellowed in your 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" />

1) u should initialize sdk before setContentView()

2) u should write Loginmanager.getInstance().logInWithReadPermission(.....) on some button click listener

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!