2013-05-14 2 views
0

나는 여기에서 많은 자습서와 답변을 읽었지만 클릭 한 버튼을 구현할 수는 없으며 벽에서 일부 텍스트를 게시 할 수 있습니다 (프로그래밍 방식으로 로그인하면 됨). 나는 조각과 두 개의 버튼으로했지만,이 코드는Facebook sdk 3.0 및 Android로 게시

05-14 09:26:32.548: E/AndroidRuntime(5080): java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request. 

코드가 실행 :

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; 
private boolean pendingPublishReauthorization = false; 
private static final String TAG = "MainFragment"; 
private static final String PUBLISH_ACTIONS_PERMISSION = null; 
private UiLifecycleHelper uiHelper; 
private LoginButton login; 
private Button shareButton; 


private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.facebook_fragment, container, false); 

    shareButton = (Button) view.findViewById(R.id.shareButton); 
    login=(LoginButton)view.findViewById(R.id.loginButton); 
    login.setPublishPermissions(PERMISSIONS); 

    if (savedInstanceState != null) { 
     pendingPublishReauthorization = 
      savedInstanceState.getBoolean(PENDING_PUBLISH_KEY, false); 
    } 
    shareButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      publishStory();   
     } 
    }); 
    return view; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    uiHelper = new UiLifecycleHelper(getActivity(), callback); 
    uiHelper.onCreate(savedInstanceState); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Session session = Session.getActiveSession(); 
    if (session != null && 
      (session.isOpened() || session.isClosed())) { 
     onSessionStateChange(session, session.getState(), null); 
    } 
    uiHelper.onResume(); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    uiHelper.onDestroy(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization); 

    uiHelper.onSaveInstanceState(outState); 
} 

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (state.isOpened()) { 
     Log.i(TAG, "Logged in..."); 
    } else if (state.isClosed()) { 
     Log.i(TAG, "Logged out..."); 
    } 
    if (pendingPublishReauthorization && 
      state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
     pendingPublishReauthorization = false; 
     publishStory(); 
    } 
} 

private void publishStory() { 
    Session session = Session.getActiveSession(); 

    if (session != null){ 

     // Check for publish permissions  
     List<String> permissions = session.getPermissions(); 
     if (!isSubsetOf(PERMISSIONS, permissions)) { 

      pendingPublishReauthorization = true; 
      Session.NewPermissionsRequest newPermissionsRequest = new Session 
        .NewPermissionsRequest(this, PERMISSIONS); 
      session.requestNewPublishPermissions(newPermissionsRequest); 
      return; 
     } 

     Bundle postParams = new Bundle(); 
     postParams.putString("name", "Facebook SDK for Android"); 
       postParams.putString("caption", "Build great social apps and get more installs."); 
       postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps."); 
       postParams.putString("link", "https://developers.facebook.com/android"); 

       Request.Callback callback= new Request.Callback() { 
        public void onCompleted(Response response) { 
         JSONObject graphResponse = response.getGraphObject().getInnerJSONObject(); 
         String postId = null; 
         try { 
          postId = graphResponse.getString("id"); 
         } catch (JSONException e) { 
          Log.i(TAG,"JSON error "+ e.getMessage()); 
         } 
         FacebookRequestError error = response.getError(); 
         if (error != null) { 
          Toast.makeText(getActivity().getApplicationContext(),error.getErrorMessage(),Toast.LENGTH_SHORT).show(); 
         } else { 
          Toast.makeText(getActivity().getApplicationContext(), postId,Toast.LENGTH_LONG).show(); 
         } 
        } 
       }; 

       Request request = new Request(session, "me/feed", postParams, HttpMethod.POST, callback); 

       RequestAsyncTask task = new RequestAsyncTask(request); 
       task.execute(); 
    } 

} 
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) { 
    for (String string : subset) { 
     if (!superset.contains(string)) { 
      return false; 
     } 
    } 
    return true; 
    } 
} 

어디에 문제가있어? 내가 미친거야! 매우 감사합니다!

+0

사실 나는 똑같은 문제가 있습니다. 문제를 파악 했습니까? – Andy

+0

내 코드를 변경 했으므로 비슷한 코드를 다시 작성하십시오. 여기에 원한다면 ..... http : //stackoverflow.com/questions/16835999/publishing-on-faccebook-with-sdk-3-0 - and - android-doesnt-work 내 새로운 코드를 게시했습니다 – gauss

답변

1

귀하의 문제는 귀하의 onResume 메소드에서 onSessionStateChange를 명시 적으로 호출하고있는 것입니다. 콜백은 어쨌든 (귀하의 승인 요청이 돌아 왔을 때 onActivityResult를 통해) 호출했을 것입니다. 이로 인해 2 개의 권한 요청이 동시에 게시되므로이 오류가 표시됩니다. onResume()에서 onSessionStateChange 메소드를 제거해보십시오.

+0

답변 주셔서 감사합니다! 나는 시도했지만 아무것도 ... 같은 오류가 변경되었습니다 05-15 08 : 06 : 14.612 : E/AndroidRuntime (393) : com.example.informavenezia.FFacebook.publishStory (FFacebook.java:146)에서 \t 이것은 예외를 시작하는 코드 조각입니다. – gauss

+0

처음에 세션을 열지 않습니까? 동일한 활동에 있습니까? –

+0

동일한 조각에 있어요 – gauss