Facebook Android SDK и java.lang.NullPointerException

У меня возникли проблемы с открытием активного сеанса facebook в моем приложении для Android в соответствии с руководством, опубликованным по адресу https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/

Я боролся с этим в течение довольно долгого времени, но безуспешно! Я буду рад, если один из вас укажет мне правильное направление! (Бьюсь об заклад, ошибка связана с некоторыми настройками на моей стороне, но я не могу ее обнаружить)

Вот ошибка, которую я вижу после вызова Session.openActiveSession(this, true, new Session.StatusCallback() в onCreate моей активности (я в значительной степени следую шагам, указанным в руководствах для разработчиков facevook)


EDIT: сначала регистрируется следующее предупреждающее сообщение, а затем сообщение об ошибке на следующем снимке экрана.

09-03 19:26:22.726: W/Bundle(17458): ключ com.facebook.platform.protocol.PROTOCOL_VERSION ожидаемая строка, но значение было java.lang.Integer. Было возвращено значение по умолчанию. 09-03 19:26:22.736: W/Bundle(17458): попытка приведения сгенерировала внутреннее исключение: 09-03 19:26:22.736: W/Bundle(17458): java .lang.ClassCastException: java.lang.Integer нельзя преобразовать в java.lang.String 09-03 19:26:22.736: W/Bundle(17458): at android.os.Bundle.getString(Bundle.java:1061) 09-03 19:26:22.736: W/Bundle(17458): в android.content.Intent.getStringExtra(Intent.java:4466) 09-03 19:26:22.736: W/Bundle(17458): в com. facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821) 09-03 19:26:22.736: W/Bundle(17458): в com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)

введите здесь описание изображения


09-02 22:55:04.110: E/AndroidRuntime(13287): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 09-02 22:55:04.110: E/AndroidRuntime(13287): java.lang.RuntimeException: Невозможно возобновить активность< /strong> {com.good.amrfbintegration/com.facebook.LoginActivity}: java.lang.NullPointerException 09-02 22:55:04.110: E/AndroidRuntime(13287 ): в android.app.ActivityThread.performResumeActivity(ActivityThread.java:3036) 09-02 22:55:04.110: E/AndroidRuntime(13287): в android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3077) 09- 02 22:55:04.110: E/AndroidRuntime(13287): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373)

введите здесь описание изображения

Вот что я сделал до сих пор

Обновлено приложение на Facebook со следующей информацией (я использовал хеш-ключ, сгенерированный с помощью хранилища ключей отладки моей машины)

введите здесь описание изображения

Вот соответствующая информация из моего файла манифеста (@string/app_id — это идентификатор приложения с портала разработчиков facebook)

введите здесь описание изображения

Таким образом я добавил ссылку на SDK Facebook в свой проект.

введите здесь описание изображения

Вот код в моем методе 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);
    }

При выполнении Session.openActiveSession logcat отображает ошибку, показанную на моем первом снимке экрана.

Метод вызова Session.StatusCallback() выполняется один раз (в то время как сеанс имеет состояние «открытие»), но в следующий раз приложение аварийно завершает работу. вот что я вижу перед сбоем приложения

введите здесь описание изображения

Будем очень благодарны любой помощи!


person infinity    schedule 03.09.2013    source источник
comment
Это может быть из-за Proguard. Он работал безупречно на всех моих устройствах, пока я не включил Proguard. Я до сих пор безуспешно занимаюсь этим вопросом. Дайте мне знать, если вы нашли выход ..   -  person Achin Kumar    schedule 06.09.2013
comment
У меня такая же проблема сегодня. И это произошло из-за несоответствия APP_ID в манифесте. com.facebook.platform.protocol.PROTOCOL_VERSION ожидал String, но значение было java.lang.Integer. Было возвращено значение по умолчанию.   -  person AnhSirk Dasarp    schedule 06.09.2013
comment
Вы разобрались, в чем дело? У меня была такая же проблема в течение нескольких дней, и я дергаю себя за волосы, пытаясь понять, что происходит.   -  person    schedule 11.10.2013
comment
Тони: Завтра я опубликую фрагмент кода, который отлично работает в моем приложении (мне неприятно это говорить... но YMMV). Более того, я думаю, что решение антилопы ниже может быть чем-то, что вы должны попробовать.   -  person infinity    schedule 11.10.2013
comment
Что ж, я обновил свое приложение, чтобы использовать последнюю версию SDK facebook (3.5.2), и теперь аутентификация работает нормально.   -  person infinity    schedule 14.11.2013


Ответы (6)


Эта проблема связана с Facebook SDK. Загрузите и используйте Facebook SDK 3.5.2 по этому URL-адресу: - https://developers.facebook.com/docs/android/

person Venkat    schedule 12.11.2013

да. Проверьте свой код,

Убедитесь, что у вас есть эти вещи в Manifest.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.

Так что убедитесь -

  1. ваш ключевой хэш правильный
  2. Вы правильно настроили приложение в Интернете и позаботились о том, чтобы указать идентификатор приложения в конфигурации вашего приложения.
person AnhSirk Dasarp    schedule 06.09.2013

Это случилось и со мной сегодня.

Моя проблема заключалась в том, что приложение Facebook находилось в режиме песочницы. Таким образом, его могли использовать только разработчики и тестировщики.

Измените его на странице свойств разработчика Facebook вашего приложения: https://developers.facebook.com/apps

Также нашел мой ответ здесь: Не удается получить доступ к сеансу Facebook - UnknownError: Invalid application

person Antilope    schedule 16.09.2013

Я немного покопался в SDK (3.5), и кажется, что EXTRA_PROTOCOL_VERSION всегда хранится как целое число, а не как строка. т.е. в NativeProtocol.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. Просто при некоторых обстоятельствах этот сегмент выполняется.

Любые комментарии?

person sinek    schedule 02.10.2013
comment
создание новой функции с вводом типа int в этом случае обычно работает, не так ли? занимаюсь такой же проблемой... - person Gabi Radu; 22.01.2014

Я получал ту же ошибку, много чего искал в 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". Внесение этих изменений сработало для меня. Надеюсь, это сработает и для вас.

person m0rpheu5    schedule 06.05.2014

person    schedule
comment
Не помогло - та же ошибка! Образец приложения на сайте developer.facebook.com/docs/android/getting-started/… также делает это в методе OnCreate. - person infinity; 03.09.2013