Ответ 1
Что вызвало проблему, так это то, что я переопределял onclicklistener кнопки входа в систему, чтобы вызвать функцию входа в LoginManager. Просто не делайте.
У меня возникли проблемы с входом в webview для Facebook на Android.
Я следил за учебниками, и логин прекрасно работает, когда у пользователя установлено приложение Facebook. Когда приложение Facebook не установлено, появляется веб-просмотр для входа в facebook; однако после входа в систему и принятия разрешений веб-просмотр просто перенаправляется обратно на экран входа в систему. Он никогда не возвращается в мое приложение.
Кто-нибудь еще столкнулся с этой проблемой?
FacebookSdk.sdkInitialize(this);
profileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile profile, Profile profile2) {
if (profile2 != null) {
loggedIn(profile2);
} else {
loggedOut();
}
}
};
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken accessToken, AccessToken accessToken2) {
Profile.fetchProfileForCurrentAccessToken();
}
};
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
getProfileInfo();
}
@Override
public void onCancel() {
// App code
Log.e("Facebook Login", "Login Cancelled");
loggedOut();
}
@Override
public void onError(FacebookException exception) {
// App code
Log.e("Facebook Login", "Failed to Login " + exception.toString());
loggedOut();
}
});
При просмотре журналов без фильтров во время входа в систему я вижу несколько возможных журналов.
I/chromium﹕ [INFO:CONSOLE(0)] "event.returnValue is deprecated. Please use the standard event.preventDefault() instead.", source: (0)
I/Auth.Core﹕ [TokenCache] Missing snowballing token: no granted scopes set.
Что вызвало проблему, так это то, что я переопределял onclicklistener кнопки входа в систему, чтобы вызвать функцию входа в LoginManager. Просто не делайте.
Я думаю, вы забыли использовать callbackManager для правильного рабочего процесса. Использованный CallbackManager для обратного вызова регистрации должен быть вызван в onActivityResult активности хоста. Активность не должна быть в singleInstance launchMode, потому что она не сможет запустить startActivityForResult (facebook внутренне запускает FacebookActivity, используя этот метод). Поэтому добавьте в свою деятельность:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
Учитывая ваше описание, я воображаю, что вы либо не подключены в Интернете , либо, что вы не обрабатываете обратные вызовы входа.
Вот полный фейсбук 4.0. + пример входа в систему.
Изменить На основе вашего кода:
Вам нужно использовать FacebookSdk.sdkInitialize(this);
до setContentView()
.
Это рабочий пример без использования приложения Facebook, и если вы закроете приложение и снова его откроете, вы автоматически войдете в систему, если не выйдете из системы. Здесь мы получаем адрес электронной почты пользователя и список друзей после входа в систему.
public class MainActivity extends Activity {
private CallbackManager callbackManager;
private LoginButton loginButton;
private static final String TAG = "logTag";
private TextView mFriend, mEmail;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
setContentView(R.layout.activity_main);
mFriend = (TextView) findViewById(R.id.tv_friend);
mEmail = (TextView) findViewById(R.id.tv_email);
loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions(Arrays.asList("public_profile, email, user_birthday, user_friends"));
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "Successful Login");
GraphRequest friendsRequest = GraphRequest.newMyFriendsRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONArrayCallback() {
@Override
public void onCompleted(JSONArray objects, GraphResponse response) {
String x = objects.opt(0).toString();
mFriend.setText(x);
}
});
GraphRequest meRequest = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
try {
String email = response.getJSONObject().getString("email").toString();
mEmail.setText(email);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, name, email, gender");
meRequest.setParameters(parameters);
meRequest.executeAsync();
parameters = new Bundle();
parameters.putString("field", "user_friends");
friendsRequest.setParameters(parameters);
friendsRequest.executeAsync();
}
@Override
public void onCancel() {
Log.d(TAG, "Login Canceled");
}
@Override
public void onError(FacebookException error) {
Log.d(TAG, "Login Error");
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// manage login results
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}