Facebook android login

孤街浪徒 提交于 2019-12-08 04:07:27

问题


In below code i am using facebook provided chrome custom tab feature, facebook login screen is opening in both chrome (if device having chrome browser) or else simple webview and also in facebook app (if device having app) but after granting the general permission graphapi not providing any data even after async call i'm not getting what i am doing wrong in this please help if possible

extra info :- This is calling inside a fragment, facebook login screen is opening in all three way just the callback is not working till now i am not able to find solution for this only get unanswered question, is their any way that we can contact facebook regarding this.

gradle dependencies

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

android manifest code

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

login code

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

回答1:


Finally found the solution. Well when you are doing this in fragment you have to make

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

in activity also as this sdk trigger that in activity from their you have to pass it to your fragment (replace fragment with your loginfragment)



来源:https://stackoverflow.com/questions/42735618/facebook-android-login

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