Ошибка входа в Facebook на некоторых устройствах
я реализовал логин Facebook, и он отлично работает на некоторых устройствах/AVDs. Мое устройство разработки-это пряничный телефон, но тестируя его с помощью устройства 4.1.1, он просто не входит в систему. После нажатия кнопки facebook отображается пустой экран (попытка подключения Facebook), а через 1-2 секунды он возвращается на главный экран. Кроме того, никакие ошибки не поджариваются или не отображаются в Logcat. О, и приложение Facebook установлено в устройстве... Любой идеи?
обновление:
Я включил ведение журнала, как предложил Марк Венцке и используя этой процедура, и я получил это предупреждение (дважды) при каждой попытке входа в систему (Примечание: тестирование с телефоном HTC One S):
07-05 20:14:50.582: W/PackageManager(605): Unable to load service info ResolveInfo{4171dbf0 com.htc.socialnetwork.facebook.remote.FacebookSyncService p=0 o=0 m=0x108000}
обратите внимание на com.компании HTC.socialnetwork.фейсбук.дистанционный.Линия FacebookSyncService, поэтому есть ли дополнительный шаг необходим для устройств HTC?
кроме того, я прикрепляю код, где находится логин исполняется:
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (isResumed) {
FragmentManager manager = getSupportFragmentManager();
int backStackSize = manager.getBackStackEntryCount();
for (int i = 0; i < backStackSize; i++) {
manager.popBackStack();
}
com.facebook.Settings.addLoggingBehavior(LoggingBehavior.REQUESTS);
if (state.isOpened()) {
Bundle params = new Bundle();
params.putString("fields", "id");
params.putString("limit", "1");
Request request = new Request(Session.getActiveSession(), "me", params, HttpMethod.GET, new Callback()
{
@Override
public void onCompleted(Response response)
{
if (response != null)
{
Log.d("AuthGraphResponse", response.toString());
long id;
try {
id = response.getGraphObject().getInnerJSONObject().getLong("id");
app.setFacebookId(id);
Log.d("UserID", Long.valueOf(id).toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
showFragment(AUTH, false);
} else if (state.isClosed()) {
showFragment(UNAUTH, false);
}
}
}
обновление 2:
возможно ли, что HTC переименует имя пакета приложения Facebook по умолчанию во всех устройствах (или некоторых из них, независимо) в com.компании HTC.socialnetwork.facebook (вместо com.фейсбук.катана) и это приводит к этому конфликту? Я действительно не думаю, что удаление приложения по умолчанию и установка Facebook из Google Play является приемлемым решением (кроме того, я думаю, что приложения по умолчанию не могут быть удаленный.)
обновление 3:
еще не решено. 19 часов, чтобы наградить 100 репутации баунти!
обновление 4:
еще одна интересная строка LogCat:
07-15 10:55:51.718: E/chromium(30475): external/chromium/net/disk_cache/stat_hub.cc:216: [0715/105551:ERROR:stat_hub.cc(216)] StatHub::Init - App com.facebook.katana isn't supported.
10 ответов
существует, безусловно, конфликт между вашим приложением stock и SDK. Поэтому, если вы не хотите uninnstall приложение HTC и по-прежнему использовать SDK 3.0, я думаю, что лучше всего без изменения исходного кода sdk было бы отключить SSO и войти только через webview.
Это можно легко сделать, добавив SessionLoginBehavior.SUPPRESS_SSO каждый раз, когда вы пытаетесь открыть новый сеанс. Вот пример, который я изменил из SessionLoginSample (LoginUsingActivityActivity) из Facebook SDK, чтобы показать вам, что делать :
@Override
public void onCreate(Bundle savedInstanceState) {
...
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, statusCallback, savedInstanceState);
}
if (session == null) {
session = new Session(this);
}
Session.setActiveSession(session);
//add the check, for if session is opened
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED) || !session.getState().isOpened()) {
//Add the suppress SSO behavior to force webview auth dialog to popup
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO));
}
}
...
}
//then put your code in the statusCallback method or keep it in the session state change listener
в противном случае, если вы не против изменить код Facebook sdk, вы должны проверить этой из
Shirley Facebook login не сломан на всех устройствах 4.1.1, поэтому это что-то с вашей реализацией.
вы уверены, что хэш ключа на этом устройстве совпадает с тем, что вы настроили на developer.facebook.com? Если вы использовали другой ключ dev или он был установлен сторонним магазином, возможно, хэши ключей не совпадают.
включить ведение журнала отладки в исходном коде Facebook SDK и перестроить его. По умолчанию он выключен по соображениям безопасности. В зависимости от вашей версии SDK, он может быть в Util.java или какое-либо другое место, и может быть переменной под названием 'ENABLE_LOG'.
Я думаю, что ошибка входа в facebook в основном происходит так, чтобы решить эту проблему, вы следуете там учебник шаг за шагом снова с терпением.
другие мудрые его очень трудно решить ваши проблемы. Таким образом, вы можете ссылаться на эту ссылку.
http://developers.facebook.com/android/
Я надеюсь, что вы будете успеха.
в вашем вопросе недостаточно информации. Итак, я делаю несколько предположений.
1) Сначала посмотрите на ответ Майка Венцке.
2) Если это не работает, попробуйте это: Вам нужно войти в устройство с помощью SSO (Single Sign On). Итак, вот шаги, которые вы можете предпринять.
удалить построение. переустановить ее. и когда вас попросят разрешения с вашего устройства, разрешите их.
Если вы не вернулись в свое приложение, вам нужно добавить их в свое файл манифеста:
<activity
android:name="com.facebook.LoginActivity"
android:label="@string/app_name" >
</activity>
<meta-data android:value="@string/app_id" android:name="com.facebook.sdk.ApplicationId"/>
где app_name и app_id - ваш соответствующий идентификатор приложения и имя приложения на странице приложения Facebook.
вы добавили эти кстати?
вам нужно это разрешение, а также
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Если вы опубликуете дополнительную информацию, я могу догадаться о проблеме.
Я думаю, что проблема с вашим приложением Facebook android в устройстве. Поэтому сначала удалите приложение facebook android с устройства и убедитесь, что логин facebook работает правильно или нет.
поскольку Honeycomb вы не можете совершать интернет-звонки в основном потоке, попробуйте использовать Android AsyncTask или создать новый поток самостоятельно.
http://developer.android.com/reference/android/os/AsyncTask.html
Я получил эту ошибку при использовании устройства со старой версией facebook. Удаление facebook полностью или обновление приложения facebook исправлено.
Я уверен, что это происходит потому, что Facebook для Android было просто завернуто WebView с мобильного сайта.
также обратите внимание, что некоторые устройства (мой невероятный 4G LTE) переустановит старую (webview) версию facebook, если вы попытаетесь удалить его.
подключите устройство к eclipse, чтобы увидеть logcat. если log cat не запускает приглашение open cmd в windows и запускает перезапуск adb, (сначала установите путь adb). затем вы можете увидеть logcat работает. теперь откройте приложение и нажать на кнопку входа в facebook. вы можете получить правильный хэш-ключ в желтом цвете в log cat. поместите этот ключ на facebook, и теперь Facebook login будет работать на каждом устройстве. спасибо.
List<String> permissions = new ArrayList<String>();
permissions.add("email");
//start Facebook session
openActiveSession(this, true, new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
//make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
String firstName = user.getFirstName();
String lastName = user.getLastName();
String id = user.getId();
String email=null;
try {
email = user.getProperty("email").toString();
} catch (Exception e) {
// TODO: handle exception
}
String gender = (String) user.getProperty("gender");
String birthday = user.getBirthday();
//welcome.setText("Hello \n" + firstName+"\n"+lastName+"\n"+email+"\n"+gender+"\n"+birthday+"!");
if(firstName!=null)
{
SharedPreferences.Editor editor = settings.edit();
editor.putString("fligin", "1");
editor.putString("firstName", firstName);
editor.putString("lastName", lastName);
editor.putString("email", email);
editor.putString("gender", gender);
editor.putString("birthday", birthday);
editor.commit();
Intent intent=new Intent(getApplicationContext(), RegistrationOneActivity.class);
startActivity(intent);
//overridePendingTransition( R.anim.slide_in_up, R.anim.slide_out_up );
finish();
}
else {
Toast.makeText(getApplicationContext(),"Person information is null", Toast.LENGTH_SHORT).show();
finish();
}
}
}
});
}
}
}, permissions);
попробуйте вставить эту строку, где вы определяете кнопку входа в исходный код java
LoginButton fb_button = (LoginButton)findViewById(//your resource id);
fb_button.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);