我正在尝试构建一个示例 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 类中,您将看到可以获取 AccessToken
、recentlyGrantedPermissions
以及 recentlyDeniedPermissions
。
此外,查看 AccessToken 的源代码, 你会看到它实现了 Parcelable ,这意味着您可以通过 intent.putExtra()
传递 AccessToken。这意味着您可以执行以下操作:
intent.putExtra("AccessToken", loginResult.getAccessToken());
其他方法 getRecentlyDeniedPermissions()
和 getRecentlyGrantedPermissions()
各自返回一个 Set包含字符串。
集合本身不能通过 Intent 传递,因为它既没有实现可序列化也没有实现可打包,您可以将其包装在 HashSet 周围(实现可序列化)
intent.putSerializable("RecentlyGrantedPermissions", new HashSet<>(loginResult.getRecentlyGrantedPermissions());
不推荐这样做的原因有两个:
- 出于性能原因,您应该始终尽可能尝试传递 Parcelabable 而不是 Serializable。
- 这感觉太过分了。很可能有更好的方法来做您想做的事。
关于android - 如何将 LoginResult 从 Facebook 登录传递到 Android 中的 Intent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671788/