2016-07-30 38 views
0

我正在嘗試構建一個示例Android應用程序,該應用程序連接到Facebook SDK,登錄Facebook並在牆上發佈消息。如何將LoginResult從Facebook登錄傳遞給Android中的Intent

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); 

      } 

如果登錄成功,我想調用另一個會照顧郵件發佈的活動。我需要accessToken來實現這一點,我試圖將它傳遞給Intent。由於Intent只接受String,所以我構建了一個名爲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) 

有人可以幫忙嗎?如果序列化是不應該做的事,我怎麼傳遞一個對象的意圖(字符串以外)

回答

0

Facebook的LoginResult是一個Java對象不實現Serializable接口,它也不會實現Parcelable接口。 這意味着什麼,你不能通過它的目的。

我的建議是強調爲什麼您需要將LoginResult傳遞給下一個活動,讓我們找到一種更好的方式來檢索您需要的信息而不必通過意圖。


但是,如果你在做這件事,儘管我個人不建議你到彎曲,這裏是你可以做什麼:

如果你看一下LoginResult類的documentation在這裏,你會看到你可以得到AccessTokenrecentlyGrantedPermissions,以及recentlyDeniedPermissions

另外,查看AccessToken的源代碼,您會看到它實現了Parcelable,這意味着您可以通過intent.putExtra()傳遞AccessToken。這意味着你可以這樣做:

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

其他方法getRecentlyDeniedPermissions()getRecentlyGrantedPermissions()每個返回一個包含字符串Set

一個由自己設定無法通過意圖傳遞,因爲它實現既不序列化,也不Parcelable,你可以用它HashSet左右(其中實現Serializable)

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

有兩個原因,這是不推薦:

  1. 由於性能方面的原因,您應該總是儘可能地傳遞Parcelables而不是Serializables。
  2. 這感覺就像一個黑客太多。最有可能有更好的方式來做你想做的事情。
相關問題