android - 如何将 LoginResult 从 Facebook 登录传递到 Android 中的 Intent

标签 android facebook-graph-api

我正在尝试构建一个示例 Android 应用程序,它连接到 Facebook SDK,登录到 facebook 并在我的墙上发布一条消息。

LoginManager.getInstance().logInWithPublishPermissions(MainActivity.this, Arrays.asList("manage_pages,publish_pages"));
        LoginManager.getInstance().registerCallback(callbackManager,new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult result) {
                serialize_login sl = new serialize_login();
                sl.result=result;
                   Intent myIntent = new Intent(MainActivity.this,PublishMessage.class);
                myIntent.putExtra("LoginResult",sl);
                startActivity(myIntent);

            }

如果登录成功,我想调用另一个负责消息发布的 Activity 。我需要 accessToken 来完成它,我正在尝试将它传递给 Intent。由于 Intent 只接受字符串,因此我构建了一个名为 serialize_login 的可序列化类。在接收端,我这样做

LoginResult lr = (LoginResult)myIntent.getExtras().getSerializable("result");
        GraphRequest request = GraphRequest.newPostRequest(lr.getAccessToken(), pageID
                , null, new GraphRequest.Callback() {

我得到以下异常。

Caused by: java.io.NotSerializableException: com.facebook.login.LoginResult
                                                                                    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
                                                                                    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
                                                                                    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)

有人可以帮忙吗?如果序列化不是正确的做法,我该如何将对象传递给 Intent (字符串除外)

最佳答案

Facebook 的 LoginResult是一个未实现 Serializable 的 Java 对象接口(interface),它也不实现 Parcelable界面。 这意味着,您不能通过 Intent 传递它。

我的建议是强调为什么需要将 LoginResult 传递给下一个 Activity ,让我们找到一种无需传递 Intent 即可检索所需信息的更好方法。


但是,如果您执意要这样做,即使我个人不建议您这样做,您也可以这样做:

如果您查看 documentation在此处的 LoginResult 类中,您将看到可以获取 AccessTokenrecentlyGrantedPermissions 以及 recentlyDeniedPermissions

此外,查看 AccessToken 的源代码, 你会看到它实现了 Parcelable ,这意味着您可以通过 intent.putExtra() 传递 AccessToken。这意味着您可以执行以下操作:

intent.putExtra("AccessToken", loginResult.getAccessToken());

其他方法 getRecentlyDeniedPermissions()getRecentlyGrantedPermissions() 各自返回一个 Set包含字符串。

集合本身不能通过 Intent 传递,因为它既没有实现可序列化也没有实现可打包,您可以将其包装在 HashSet 周围(实现可序列化)

intent.putSerializable("RecentlyGrantedPermissions", new HashSet<>(loginResult.getRecentlyGrantedPermissions());

不推荐这样做的原因有两个:

  1. 出于性能原因,您应该始终尽可能尝试传递 Parcelabable 而不是 Serializable。
  2. 这感觉太过分了。很可能有更好的方法来做您想做的事。

关于android - 如何将 LoginResult 从 Facebook 登录传递到 Android 中的 Intent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671788/

相关文章:

facebook-graph-api - 通过 Instagram 图形 api 刷新长期 token

facebook - 视频源和图形 API

java - 如何使用 Jersey Client 将 HTTP 400 响应解析为 Java 类?

java - 将项目添加到自定义 ListView 仅在触摸时显示新项目

android - ObservableOnSubscribe 回调中监听器的生命周期是什么 - Rxjava

java - Android增量计数器不会重置?

android - 在圆形 ImageView 中获取用户个人资料图片

android - 如何在android中使用View Stub

java - 如何从 Activity 线程修改适配器中的行?

javascript - 如何使用 promise 和递归通过 Facebook Graph API 检索用户的所有帖子?