2013-05-14 7 views
0

J'ai lu beaucoup de tutoriel et les réponses, mais je ne suis pas capable de mettre en œuvre un bouton qui a cliqué, publier un texte sur le mur (avec une connexion effectuée par programme). J'ai essayé avec un fragment et deux boutons, mais ce code lance unesur le mur avec publierai Facebook sdk 3.0 et 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. 

le code est:

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

où est le problème? je deviens fou! Merci beaucoup!

+0

J'ai vraiment le même problème. Avez-vous compris votre problème? – Andy

+0

J'ai changé mon code du tout, en le réécrivant similaire ..... si vous voulez ici: http: //stackoverflow.com/questions/16835999/publishing-on-faccebook-with-sdk-3-0 -and-android-doesnt-travail j'ai posté mon nouveau code entier – gauss

Répondre

1

Je pense que votre problème est que vous appelez explicitement surSessionStateChange dans votre méthode onResume, où le rappel l'aura appelée de toute façon (via onActivityResult, lorsque votre demande d'autorisation reviendra). Il en résulte 2 publient les demandes d'autorisation simultanément, ce qui est la raison pour laquelle vous voyez cette erreur. Essayez de supprimer la méthode onSessionStateChange dans votre onResume().

+0

Merci pour la réponse! J'ai essayé mais rien n'a changé ... même erreur ... 05-15 08: 06: 14.612: E/AndroidRuntime (393): \t à com.example.informavenezia.FFacebook.publishStory (FFacebook.java:146) c'est le morceau de code qui lance l'exception – gauss

+0

Où ouvrez-vous la session en premier lieu, est-ce dans la même activité? –

+0

c'est dans le même fragment – gauss

Questions connexes