Facebook Android SDK和java.lang.NullPointerException

12

我在我的安卓应用中按照 https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/ 上发布的教程尝试打开一个活动的Facebook会话,但是一直无法成功。我已经尝试了很长时间,但没有运气!如果有人能指点我方向,我将非常感激!(我猜错误出现在我的一些设置上,但我无法找到它)

以下是在我的活动的onCreate方法中调用Session.openActiveSession(this, true, new Session.StatusCallback()之后看到的错误信息。(基本上我正在遵循Facevook开发人员教程中给出的步骤)


编辑: 以下警告消息首先被记录,然后是随后的屏幕截图中的错误消息

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): 在android.os.Bundle.getString(Bundle.java:1061) 09-03 19:26:22.736: 在android.content.Intent.getStringExtra(Intent.java:4466) 09-03 19:26:22.736: 在com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821)中 在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: 在android.app.ActivityThread.performResumeActivity(ActivityThread.java:3036) 中的E/AndroidRuntime(13287): 09-02 22:55:04.110: 在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3077) 中的E/AndroidRuntime(13287): 09-02 22:55:04.110: 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373) 中的E/AndroidRuntime(13287): at

enter image description here

到目前为止,我已经完成了以下工作

在Facebook上更新应用程序并提供以下信息(使用我的机器的调试密钥库生成的哈希键)

enter image description here

这是我的清单文件中的相关信息(@string/app_id 是从Facebook开发门户获取的App Id)

enter image description here

我以这种方式在项目中引用了Facebook SDK

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显示了第一个截图中显示的错误。

在会话具有状态“opening”时,Session.StatusCallback()的调用方法只执行一次,但是应用程序在随后的时间崩溃。在应用程序崩溃之前,我看到了以下内容:

输入图像描述

非常感谢您的任何帮助!


这可能是由于Proguard引起的。在启用Proguard之前,它在我所有的设备上都能完美地运行。我仍然无助地处理这个问题。如果你找到了解决方法,请告诉我。 - Achin Kumar
1
今天我遇到了同样的问题。这是由于清单文件中的APP_ID不匹配所致。com.facebook.platform.protocol.PROTOCOL_VERSION期望字符串,但实际值为java.lang.Integer。因此返回了默认值。 - AnhSirk Dasarp
你解决问题了吗?我已经遇到同样的问题好几天了,我正在拼命地想弄清楚出了什么问题。 - user445338
Tony - 明天我会发布在我的应用上运行良好的代码片段(我感到很烦恼要说这个...但你的情况可能有所不同)。此外,我认为下面羚羊的解决方案可能是你应该尝试的东西。 - infinity
我已经更新了我的应用程序,使用最新的Facebook SDK(3.5.2),现在认证似乎正常工作。 - infinity
6个回答

7

3
是的,请检查您的代码, 确保在Manifest.xml中有以下内容。
<activity android:name="com.facebook.LoginActivity"/>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>

同时,@string/app_id 应该包含您从 Facebook 应用程序配置详细信息中获取的 app_id。还要确保正确填写密钥哈希。

因此,请确保:

  1. 您的密钥哈希是正确的
  2. 您已在 Web 上正确配置应用程序,并注意将应用程序 ID 放入应用程序配置中。

2

0

我深入研究了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中的一个错误。只是在某些情况下,该段代码会被执行。

有任何评论吗?


创建一个带有整数输入的新函数,在这种情况下通常应该可以工作,不是吗?我正在处理相同的问题... - Gabi Radu

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

2
它没有修复 - 我遇到了相同的错误!developers.facebook.com/docs/android/getting-started/…中的示例应用程序也在OnCreate方法中执行。 - infinity

0

我曾经遇到过同样的错误,搜寻了很多资料,最终找到了解决方法。

  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 密钥生成或 Android 密钥存储有关的一些问题。

还有,请检查您的 Facebook Sdk 中 AuthorizationClient.java 文件的 820 行。

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

我到了“getIntExtra”,他们使用的是“getStringExtra”。对于我来说,做出这些更改是有效的。希望对你也有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接