Facebook android 登录

Facebook android login

在下面的代码中,我使用的是 facebook 提供的 chrome 自定义标签功能, facebook 登录屏幕在 chrome(如果设备具有 chrome 浏览器)或简单的 webview 以及在 facebook 应用程序(如果设备具有应用程序)中打开,但在授予一般权限后 graphapi 甚至不提供任何数据在异步调用之后我没有得到我在这方面做错了什么请尽可能提供帮助

额外信息:- 这是在片段内调用,Facebook 登录屏幕以所有三种方式打开,只是回调不起作用,直到现在我无法找到解决方案,只能得到未答复问题是,我们可以就此联系 Facebook 的任何方式。

gradle 依赖关系

    compile 'com.facebook.android:facebook-android-sdk:[4,5)'

android 清单代码

    <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" />

    <activity
        android:name="com.facebook.CustomTabActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="@string/fb_login_protocol_scheme" />
        </intent-filter>
    </activity>

登录码

facebook_sign.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCallbackManager = CallbackManager.Factory.create();
            LoginManager.getInstance().logInWithReadPermissions(getActivity(), App_Contants.PERMISSIONS);
            LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response) {
                            try {
                                final String id = object.getString("id");
                                final String name = object.getString("name");
                                final String email = object.getString("email");
                                final String gender = object.getString("gender");
                                final String picture = object.getJSONObject("picture").getJSONObject("data").getString("url");
                                final String data = id + ", " + name + ", " + email + ", " + gender + ", "+ ", " + picture;
                                Log.e("my_data", response.getRawResponse());
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,email,gender,picture.width(400).height(400)");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

                @Override
                public void onCancel() {
                    Toast.makeText(mContext,"Facebook Login Cancel",Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onError(FacebookException error) {
                    error.printStackTrace();
                }
            });
        }
    });


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

    // Result returned from launching the Intent from
    //   GoogleSignInApi.getSignInIntent(...);
    if (requestCode == 1) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            GoogleSignInAccount acct = result.getSignInAccount();
            // Get account information
            Log.e("data",acct.getEmail());

            mGoogleApiClient.stopAutoManage(getActivity());
            mGoogleApiClient.disconnect();
        }else if(result.getStatus().isCanceled()){
            mGoogleApiClient.stopAutoManage(getActivity());
            mGoogleApiClient.disconnect();
        }else if(result.getStatus().isInterrupted()){
            mGoogleApiClient.stopAutoManage(getActivity());
            mGoogleApiClient.disconnect();
        }else{
            mGoogleApiClient.stopAutoManage(getActivity());
            mGoogleApiClient.disconnect();
        }
    }
}

终于找到解决办法了。好吧,当您在片段中执行此操作时,您必须

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

在 activity 中,因为这个 sdk 触发,在 activity 中,你必须从他们那里将它传递给你的片段(用你的 loginfragment 替换片段)