2013-02-20 4 views
11

Ora sto facendo un piccolo progetto che vuole avere un pulsante di condivisione (finestra di dialogo), quando gli utenti lo cliccano, accederà automaticamente al proprio account fb e condividere il contenuto che vogliono.Facebook Android SDK 3.0, come condividere il contenuto senza LoginButton

Dopo il tutorial di fb dev, la mia app può condividere il contenuto a muro, ma è necessario effettuare il login con un pulsante fblogin prima di condividerlo.

Ho letto un post da StackOverflow: Android - Facebook SDK 3 - How to login programmatically without LoginButton

UPDATE: devo realizzare il feedDialog con onActivityResult nel mio progetto, ho scoperto che posso accedere e condividere con un solo pulsante. TUTTO, quando ricostruisco l'app/riavvia il telefono, devo premere il pulsante due volte per condividere la prima volta, ma diventare normale (premere una volta) in seguito.

P.S.I hanno attuarla con ShareActionProvider

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getSupportMenuInflater().inflate(R.menu.content_main, menu); 
    /** Getting the actionprovider associated with the menu item whose id is share */ 
    mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.share).getActionProvider(); 

    /** Getting the target intent */ 
    Intent intent = getDefaultShareIntent(); 

    /** Setting a share intent */  
    if(intent!=null){ 
     mShareActionProvider.setShareIntent(intent); 
     mShareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener(){ 
      @Override 
      public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { 
       if ("com.facebook.katana".equals(intent.getComponent().getPackageName())){ 
        if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) { 
         Session.openActiveSession(Content.this, true, null); 
       }else{ 
         publishFeedDialog(); 
        } 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 

    return super.onCreateOptionsMenu(menu); 
} 
@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
     if (Session.getActiveSession() != null || Session.getActiveSession().isOpened()) 
      publishFeedDialog(); 
    } 
private void publishFeedDialog() { 
     Bundle params = new Bundle(); 
     params.putString("name", "ab"); 
     params.putString("caption", "cd"); 
     params.putString("description", "def"); 
     params.putString("link", "https://developers.facebook.com/android"); 
     params.putString("picture", "abc.jpg"); 

     WebDialog feedDialog = (
      new WebDialog.FeedDialogBuilder(Content.this, 
       Session.getActiveSession(), 
       params)) 
      .setOnCompleteListener(new OnCompleteListener() { 

       @Override 
       public void onComplete(Bundle values, 
        FacebookException error) { 
        if (error == null) { 
         // When the story is posted, echo the success 
         // and the post Id. 
         final String postId = values.getString("post_id"); 
         if (postId != null) { 
          Toast.makeText(Content.this, 
           "Posted story, id: "+postId, 
           Toast.LENGTH_SHORT).show(); 
         } else { 
          // User clicked the Cancel button 
          Toast.makeText(Content.this.getApplicationContext(), 
           "Publish cancelled", 
           Toast.LENGTH_SHORT).show(); 
         } 
        } else if (error instanceof FacebookOperationCanceledException) { 
         // User clicked the "x" button 
         Toast.makeText(Content.this.getApplicationContext(), 
          "Publish cancelled", 
          Toast.LENGTH_SHORT).show(); 
        } else { 
         // Generic, ex: network error 
         Toast.makeText(Content.this.getApplicationContext(), 
          "Error posting story", 
          Toast.LENGTH_SHORT).show(); 
        } 
       } 

      }) 
      .build(); 
     feedDialog.show(); 
     } 
+0

Passare attraverso Ming Li risposta e il suo commento (secondo). –

+0

lo so, ma voglio davvero un po 'più di spiegazione o codice becox non capisco ........ sono nuovo di Android dev –

+0

@CalvinChan sei stato in grado di tirare fuori questo? Sto cercando la stessa soluzione in cui condividerò le foto – Casper

risposta

11

Penso che il problema qui sia che quando si crea il menu, si verifica se la sessione attiva è nullo e, in tal caso, si chiama openActiveSession e si attende la chiamata di onActivityResult.

questo è tutto corretto, tuttavia, se l'utente ha già autorizzato la vostra applicazione, quindi i token di accesso, ecc, sono tutti salvati in una cache dei token, e chiamando openActiveSession sarà effettivamente aprire immediatamente la sessione (senza chiamare onActivityResult).

Il modo corretto è quello di passare una StatusCallback alla chiamata aperta (anziché null), e in tale chiamata, controllare se la sessione è aperta e chiamare il metodo publishFeedDialog.

0

LoginButton in facebook-sdk-3.0 è solo uno strumento per ottenere una sessione da FB.

Se si ottiene già una sessione da FB, è necessario verificare l'autorizzazione per la pubblicazione.

+0

lo so, l'ho implementato con un loginButton. Ma quello che voglio è farlo SENZA un loginButton –

15

Grazie Ming Li molto per la soluzione

ho finalmente avuto la risposta !!!! Di seguito si riporta il codice, spero che possa aiutare altri sviluppatori

private Session.StatusCallback callback = new Session.StatusCallback() { 
      @Override 
      public void call(Session session, SessionState state, 
      Exception exception) { 
      onSessionStateChange(session, state, exception); 
      } 
    }; 
    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     if (state.isOpened()) { 
      publishFeedDialog(); 
     } 
    } 
    //........................ 
        if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) { 
          Session.openActiveSession(Content.this, true, callback); 
        }else{ 
          publishFeedDialog(); 
         } 
    //....................... 
    @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
     } 
    private void publishFeedDialog() { 
      //........................ 
     } 
+0

Grazie mille, funziona come un incantesimo – Casper

4

Questo è trattato proprio nel Getting Started tutorial:

package com.firstandroidapp; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.widget.TextView; 
import com.facebook.*; 
import com.facebook.model.*; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

// start Facebook Login 
Session.openActiveSession(this, true, new Session.StatusCallback() { 

    // callback when session changes state 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
    if (session.isOpened()) { 

     // make request to the /me API 
     Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

     // callback after Graph API response with user object 
     @Override 
     public void onCompleted(GraphUser user, Response response) { 
      if (user != null) { 
      TextView welcome = (TextView) findViewById(R.id.welcome); 
      welcome.setText("Hello " + user.getName() + "!"); 
      } 
     } 
     }); 
    } 


    } 
    }); 
    } 

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

}