Facebook Android SDK&显示java.lang.NullPointerException

时间:2013-09-03 04:02:08

标签: android facebook android-facebook facebook-sdk-3.0

根据https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/发布的教程

,我无法在Android应用中打开有效的facebook会话

我一直在苦苦挣扎这段时间,现在没有任何运气!如果你们中的一个人能指出我正确的方向,我将很高兴! (我打赌错误是我身边的一些设置,但我无法发现它

这是我在调用Session.openActiveSession后看到的错误(在我的活动的onCreate中这是真的,新的Session.StatusCallback()(我几乎遵循facevook开发人员教程中给出的步骤)


编辑: 首先记录以下警告消息,然后在随后的屏幕快照中显示错误消息

  

09-03 19:26:22.726:W / Bundle(17458):关键    com.facebook.platform.protocol.PROTOCOL_VERSION期望String但是   value是一个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):at   android.content.Intent.getStringExtra(Intent.java:4466)09-03   19:26:22.736:W / Bundle(17458):at   com.facebook.AuthorizationClient $ KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821)   09-03 19:26:22.736:W / Bundle(17458):at   com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)

enter image description here


  

09-02 22:55:04.110:E / AndroidRuntime(13287):致命异常:主要   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):at   android.app.ActivityThread.performResumeActivity(ActivityThread.java:3036)   09-02 22:55:04.110:E / AndroidRuntime(13287):at   android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3077)   09-02 22:55:04.110:E / AndroidRuntime(13287):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373)

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

Session.StatusCallback()的调用方法执行一次(会话状态为'opening')但应用程序崩溃了后续时间。这是我在App崩溃之前看到的内容

enter image description here

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:7)

由于Facebook SDK的问题,请从此下载并使用Facebook SDK 3.5.2  网址: - https://developers.facebook.com/docs/android/

答案 1 :(得分: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。你也应该把正确的keyhash。

所以确保 -

  1. 您的密钥哈希是正确的
  2. 您已在网络上正确配置了应用,并负责将应用ID添加到您的应用配置中。

答案 2 :(得分:2)

今天也发生在我身上。

我的问题是Facebook应用程序处于沙盒模式。所以只有开发人员和测试人员才能使用它。

从应用的Facebook Developer属性页面更改它: https://developers.facebook.com/apps

我的答案也在这里找到: Can not access Facebook session - UnknownError: Invalid application

答案 3 :(得分: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();
            }
          }});
       }
   }
}

答案 4 :(得分:0)

我挖了一下SDK(3.5),似乎EXTRA_PROTOCOL_VERSION总是存储为Integer而不是String。即在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);
}

在devs通常得到此错误的地方被读取为String(AuthorizationCLient.java l:820):

addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,
                intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));

这在任何情况下都无效,所以它仍然是SDK中的一个错误。只是在某些情况下,该段才会被执行。

有任何意见吗?

答案 5 :(得分:0)

我得到了同样的错误,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

的一些问题

另外,请在第820行检查来自Facebook Sdk的AuthorizationClient.java文件

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

我将其设为“ getIntExtra ”,将其设为“ getStringExtra ”。做出这些改变,对我有用。 希望它也适合你。