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)


РЕДАКТИРОВАТЬ: Следующее предупреждающее сообщение регистрируется первым и сопровождается сообщением об ошибке на следующем снимке экрана

09-03 19: 26: 22.726: W/Bundle (17458): Key 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)

enter image description here


09-02 22: 55: 04.110: E/AndroidRuntime (13287): FATAL EXCEPTION: main 09-02 22: 55: 04.110: E/AndroidRuntime (13287): java.lang.RuntimeException: Невозможно возобновить работу{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)

enter image description here

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

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

enter image description here

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

enter image description here

Я добавил ссылку на SDK для Facebook таким образом

enter image description here

Вот код в моем методе 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() запускается один раз (в то время как сеанс имеет состояние "открытие" ), но приложение сбрасывает последующее время. вот что я вижу перед тем, как приложение выйдет из строя

enter image description here

Любая помощь будет принята с благодарностью!

Ответ 2

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

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

Итак, убедитесь, что

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

Ответ 3

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

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

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

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

Ответ 4

// 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();
            }
          }});
       }
   }
}

Ответ 5

Я выкопал бит в 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. Просто в некоторых случаях этот сегмент выполняется.

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

Ответ 6

Я получал ту же ошибку, google'd много вещей, и, наконец, это то, что я сделал, чтобы уйти от этой ошибки

  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. Это решило мою проблему. Вероятно, некоторые проблемы с окнами key_gen или андроид key_store

А также проверьте файл AuthorizationClient.java из Facebook Sdk на линии 820

addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,"" + 
                    intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));

Я сделал это с getIntExtra ", где у меня было это как" getStringExtra ". Сделав эти изменения, работал на меня. Надеюсь, он тоже сработает для вас.