Facebook Android SDK & java.яз..Исключение NullPointerException
У меня возникли проблемы с открытием активной сессии facebook в моем android-приложении в соответствии с учебником, опубликованным на https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/
Я боролся с этим в течение достаточно долгого времени без каких-либо удачи! Я буду рад, если кто-нибудь из вас укажет мне верное направление! (бьюсь об заклад, что ошибка с какой-то настройкой на моей стороне, но я не могу ее обнаружить )
Вот ошибка, которую я вижу после сеанс вызова.openActiveSession (это, правда, новая сессия.StatusCallback () в onCreate моей деятельности (я в значительной степени следую инструкциям, приведенным в facevook developer tutorials)
Редактировать: Сначала регистрируется следующее предупреждение, за которым следует сообщение об ошибке на следующем снимке экрана
09-03 19:26:22.726: W / Bundle (17458): Ключ ком.фейсбук.платформа.протокол.PROTOCOL_VERSION ожидаемая строка, но значение было а Ява.яз..Целое число. Было возвращено значение по умолчанию. 09-03 19: 26: 22.736: W / Bundle (17458): попытка бросить сгенерированный внутреннее исключение: 09-03 19: 26: 22.736: W / Bundle(17458): Ява.яз..ClassCastException: java.яз..Целое число не может быть приведено к Ява.яз..Строка 09-03 19: 26: 22.736: W / Bundle (17458): at андроид.ос.Пакет.getString (связка.java: 1061) 09-03 19: 26: 22.736: W / Bundle (17458): at андроид.содержание.Намерение.getStringExtra (намерение.java: 4466) 09-03 19: 26: 22.736: W / Bundle (17458): at ком.фейсбук.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize (AuthorizationClient.java: 821) 09-03 19: 26: 22.736: W / Bundle (17458): at ком.фейсбук.Авторизационный центр.tryCurrentHandler (AuthorizationClient.java: 272)
09-02 22:55:04.110: E / AndroidRuntime (13287): фатальное исключение: main 09-02 22: 55: 04.110: E / AndroidRuntime(13287): Ява.яз..RuntimeException: не удается возобновить действие {com.хороший.amrfbintegration / com.фейсбук.LoginActivity }: [13]}java.яз..Исключение NullPointerException 09-02 22:55:04.110: E / AndroidRuntime (13287): at андроид.апп.ActivityThread.performResumeActivity (ActivityThread.java: 3036) 09-02 22: 55: 04.110: E / AndroidRuntime(13287): at андроид.апп.ActivityThread.handleResumeActivity (ActivityThread.java: 3077) 09-02 22: 55: 04.110: E / AndroidRuntime(13287): at андроид.апп.ActivityThread.handleLaunchActivity (ActivityThread.java: 2373)
Вот что я сделал до сих пор
Обновил приложение на Facebook со следующей информацией (я использовал хэш-ключ, созданный с помощью отладочного хранилища ключей моей машины)
Вот соответствующая информация из моего файла манифеста (@string/app_id-идентификатор приложения из портала Facebook dev)
Я добавил ссылку на Facebook SDK в свой проект таким образом
Вот код в моем методе OnCreate основной деятельности
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
if (session.isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}
}});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
При выполнении сеанса.openActiveSession, чтение logcat отображает сообщение об ошибке показано в моем первом скриншоте.
Сессия.Метод вызова StatusCallback () выполняется один раз (в то время как сеанс имеет состояние "открытие"), но приложение аварийно завершает работу в следующий раз. вот что я вижу перед сбоем Приложения
Любая помощь будет весьма признательна!
6 ответов:
{Facebook SDK, Пожалуйста, загрузите и используйте Facebook SDK 3.5.2 из этого приложения. URL: - https://developers.facebook.com/docs/android/
Да. Проверьте свой код,
Убедитесь, что у вас есть эти вещи на Манифесте.xml
<activity android:name="com.facebook.LoginActivity"/> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
И @string/app_id должны содержать идентификатор app_id, полученный из сведений о конфигурации приложения facebook. Также там вы должны поставить правильный keyhash.
Так что убедитесь -
- ваш хэш ключа правильный
- вы правильно настроили приложение в интернете и позаботились о том, чтобы поместить идентификатор приложения в конфигурацию приложения.
Это случилось и со мной сегодня.
Моя проблема заключалась в том, что приложение Facebook находилось в режиме песочницы. Так что пользоваться им могли только разработчики и тестировщики.
Измените его на странице свойств разработчика Facebook вашего приложения: https://developers.facebook.com/apps
Также нашел свой ответ здесь: не удается получить доступ к сессии Facebook-UnknownError: недопустимое приложение
// Just write your code in onResume() rather than onCreate(). @Override public void onResume() { super.onResume(); if(Session.getActiveSession()==null){ session = new Session(this); Session.setActiveSession(session); } if (Session.getActiveSession().isOpened()) { Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show(); }else{ Session.openActiveSession(this, true, new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { if (session.isOpened()) { Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show(); } }}); } } }
Я немного покопался в SDK (3.5), и кажется, что EXTRA_PROTOCOL_VERSION всегда хранится как целое число, а не как строка. То есть в Нативпротоколе.java:
public static Intent createPlatformActivityIntent(Context context, String action, int version, Bundle extras) { Intent intent = new Intent() .setAction(INTENT_ACTION_PLATFORM_ACTIVITY) .setPackage(FACEBOOK_PACKAGE) .addCategory(Intent.CATEGORY_DEFAULT) .putExtras(extras) .putExtra(EXTRA_PROTOCOL_VERSION, version) //version --> int .putExtra(EXTRA_PROTOCOL_ACTION, action); return validateKatanaActivityIntent(context, intent); } public static Intent createPlatformServiceIntent(Context context) { Intent intent = new Intent(INTENT_ACTION_PLATFORM_SERVICE) .setPackage(FACEBOOK_PACKAGE) .addCategory(Intent.CATEGORY_DEFAULT); return validateKatanaServiceIntent(context, intent); } public static Intent createLoginDialog20121101Intent(Context context, String applicationId, ArrayList<String> permissions, String audience) { Intent intent = new Intent() .setAction(INTENT_ACTION_PLATFORM_ACTIVITY) .setPackage(FACEBOOK_PACKAGE) .addCategory(Intent.CATEGORY_DEFAULT) .putExtra(EXTRA_PROTOCOL_VERSION, PROTOCOL_VERSION_20121101) // PROTOCOL_VERSION_20121101 --> int .putExtra(EXTRA_PROTOCOL_ACTION, ACTION_LOGIN_DIALOG) .putExtra(EXTRA_APPLICATION_ID, applicationId) .putStringArrayListExtra(EXTRA_PERMISSIONS, ensureDefaultPermissions(permissions)) .putExtra(EXTRA_PROTOCOL_CALL_ID, generateCallId()) .putExtra(EXTRA_WRITE_PRIVACY, ensureDefaultAudience(audience)); return validateKatanaActivityIntent(context, intent); }
И в том месте, где разработчики обычно получают эту ошибку, она читается как строка (AuthorizationCLient.java l: 820):
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION, intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));
Это не будет работать в любом случае, так что это все еще ошибка в SDK. Просто при некоторых обстоятельствах этот сегмент исполняется.
Какие-нибудь комментарии?
Я получал ту же ошибку, google делал много вещей, и, наконец, это то, что я сделал, чтобы уйти от этой ошибки
private void getHashKey() { PackageInfo info; try { info = getPackageManager().getPackageInfo("Your_Package_Name", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) {MessageDigest md; md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); //String something = new String(Base64.encode(md.digest(), 0)); String something = new String(Base64.encode(md.digest(),0)); Log.e("** Hash Key", something); } } catch (NameNotFoundException e1) { Log.e("name not found", e1.toString()); } catch (NoSuchAlgorithmException e) { Log.e("no such an algorithm", e.toString()); } catch (Exception e){ Log.e("exception", e.toString()); } }
Итак, я использовал hash_key, созданный этим кодом,и обновил его в своей консоли разработчика facebook. Это решило мою проблему.Возможно,какие-то проблемы с windows key_gen или Android key_store
А также проверьте свой AuthorizationClient.java-файл из Facebook Sdk в строке 820
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,"" + intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));
Я добрался до "getIntExtra ", где они имели его как "getStringExtra ". Внесение этих изменений, работало на меня. Надеюсь, это сработает и для тебя.