2016-07-30 4 views
0

페이스 북 SDK에 연결하고 페이스 북에 로그인하고 내 벽에 메시지를 게시하는 샘플 안드로이드 어플리케이션을 빌드하려고합니다.페이 스북 로그인에서 페이스 북 로그인에서 인 텐트에 인 텐트로 LoginResult를 전달하는 방법

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는 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

페이스 북의 LoginResultSerializable 인터페이스를 구현하지 않습니다, 어느 쪽도 아니는 Parcelable 인터페이스를 구현 않는 자바 객체 인에 개체를 전달합니다. 이 의미는 의도를 통해 전달할 수 없다는 의미입니다.

내 제안은 LoginResult를 다음 활동으로 전달해야하는 이유를 강조하고 의도를 통과하지 않고 필요한 정보를 검색하는 더 나은 방법을 찾아 보겠습니다. 당신은 내가 개인적으로 그에게 조언을하지 않을지라도, 그 일에 구부러진하는 경우


그러나, 여기 당신이 할 수있는 작업은 다음과 같습니다

당신이 LoginResult 클래스의 documentation 보면 여기에서 AccessToken, recentlyGrantedPermissionsrecentlyDeniedPermissions을 얻을 수 있습니다.

또한 AccessToken의 소스 코드를 보면 Parcelable을 구현한다는 것을 알 수 있습니다. 즉, intent.putExtra()을 통해 AccessToken을 전달할 수 있습니다. 당신은 같은 것을 할 수있는 의미 :

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

다른 방법 getRecentlyDeniedPermissions()getRecentlyGrantedPermissions() 각각 Set 포함 된 문자열을 반환합니다. 이 둘은 Serializable를 구현하기 때문에 그 자체로 설정

A는 의도를 통해 전달 될 수없고 Parcelable, 당신은 (Serializable를 구현하는)이없는 두 가지 이유가 있습니다

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

HashSet 주위를 포장 할 수 있습니다 추천 :

  1. 당신은 항상 때문에 성능 이유, 가능한 대신 된 직렬화 Parcelables를 전달하는 시도해야합니다.
  2. 이것은 너무 많은 해킹처럼 느껴집니다. 당신이하고 싶은 일을 할 수있는 가장 좋은 방법이있을 것입니다.
관련 문제