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