12

根据https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/上发布的教程,我无法在我的 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): 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): at com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)

在此处输入图像描述


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):在 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 上的应用程序(我使用了使用我机器的调试密钥库生成的 hashkey)

在此处输入图像描述

以下是我的清单文件中的相关信息(@string/app_id 是来自 facebook 开发门户的 App Id)

在此处输入图像描述

我以这种方式在我的项目中添加了对 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);
    }

在执行 Session.openActiveSession 时,logcat 会显示我的第一个屏幕截图中显示的错误。

Session.StatusCallback() 的调用方法被执行一次(而会话的状态为“正在打开”),但应用程序在随后的时间崩溃。这是我在应用程序崩溃之前看到的

在此处输入图像描述

任何帮助将不胜感激!

4

6 回答 6

7

这个问题是因为 Facebook SDK,请从这个 URL 下载并使用 Facebook SDK 3.5.2:- https://developers.facebook.com/docs/android/

于 2013-11-12T11:29:26.883 回答
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. 您已在 Web 上正确配置了应用程序,并注意将应用程序 ID 放入您的应用程序配置中。
于 2013-09-06T08:34:25.150 回答
2

今天也发生在我身上。

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

从您的应用程序的 Facebook 开发人员属性页面更改它: https ://developers.facebook.com/apps

还在这里找到了我的答案: 无法访问 Facebook 会话 - UnknownError: Invalid application

于 2013-09-16T06:36:27.310 回答
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 key_gen 或 android key_store 的一些问题

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

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

我做到了“ getIntExtra ”,他们把它命名为“ getStringExtra ”。做出这些改变,对我有用。希望它也对你有用。

于 2014-05-06T14:04:23.463 回答
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();
            }
          }});
       }
   }
}
于 2013-09-03T04:14:14.440 回答
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 中的一个错误。只是在某些情况下,该段被执行。

任何意见?

于 2013-10-02T10:52:55.267 回答