In un articolo precedente, abbiamo parlato di come si possono integrare le funzionalità di Facebook in un’app Android: ne abbiamo spiegato i concetti di base mentre, dal punto di vista pratico, ci siamo limitati ad effettuare un login.
In questo articolo, andremo avanti nel discorso occupandoci della pubblicazione di contenuti direttamente dall’interno delle nostre app.
Preparazione dell’esempio
La preparazione del progetto passa per alcuni punti cardine che abbiamo già illustrato nel tutorial precedente, li riepiloghiamo qui velocemente:
- dobbiamo registrarci innanzitutto alla piattaforma degli sviluppatori Facebook utilizzando un comune account utente al Social Network. Registriamo quindi la nostra app all’interno della console tenendo presente che l’appID che otterremo dovremo usarlo nel progetto Android Studio, magari conservato in una console:
<resources> ... ... <string name="facebook_app_id">189203758462739</string> </resources> - integriamo l’SDK nel progetto Android Studio sfruttando la duttilità di Gradle:
dependencies { ... ... compile 'com.facebook.android:facebook-android-sdk:4.+' } - inseriamo la permission INTERNET nel file AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Quello che aggiungiamo questa volta è la dichiarazione di un ContentProvider all’interno del file AndroidManifest.xml, all’interno del nodo <application>:
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.app.FacebookContentProvider1234567890"
android:exported="true" />
Notiamo che alla fine del valore impostato per l’attributo authorities è presente una sequenza di numeri (1234567890): lì dovremo sostituire con il nostro appID per sviluppatori Facebook.
L’esempio che abbiamo in mente
Seguiti questi passi possiamo iniziare a lavorare al nostro esempio. Realizziamo un’app di prova che si pone lo scopo di pubblicare link e immagini su Facebook. Nella prima Activity, condivideremo contenuti: nell’immagine seguente stiamo compilando il form succederendo l’URL del nostro sito
Il FacebookButton permette di eseguire accesso e disconnessione con le proprie credenziali utente. Al click del pulsante “INVIA” verrà aperta una finestra di dialogo offerta dal Facebook SDK per un’ulteriore personalizzazione della condivisione:
Il Button “Invia un’immagine”, posto sul fondo della prima Activity, apre una seconda interfaccia all’interno della quale potremo scorrere delle immagini casuali (cliccando sul tasto “Ricarica”) e pubblicare sul Social Network la nostra preferita, una volta individuata.
Layout e risorse
La MainActivity ha il seguente layout (file: /res/layout/activity_main.xml):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="16dp"
>
<com.facebook.login.widget.LoginButton
android:id="@+id/fb_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/gestionePost"
android:visibility="invisible"
android:layout_below="@id/fb_login"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="(url da pubblicare)"
android:background="@drawable/form_bg"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:padding="5dp"
android:id="@+id/url"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="(titolo)"
android:background="@drawable/form_bg"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:padding="5dp"
android:id="@+id/titolo"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="5"
android:hint="(descrizione)"
android:padding="5dp"
android:background="@drawable/form_bg"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:id="@+id/descrizione"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="inviaPost"
android:text="Invia"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:layout_gravity="center_horizontal"
android:text="(oppure invia un'immagine)"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Invia un'immagine"
android:onClick="invioImmagini"/>
</LinearLayout>
</RelativeLayout>
Si tratta di un RelativeLayout con un FacebookButton, posto in alto in posizione centrale. Sotto di esso, c’è il form, inizialmente invisibile ma pronto a manifestarsi al momento dell’autenticazione eseguita con successo. Le EditText presenti nel form hanno sfondo bianco e bordo blu grazie all’immagine definita in XML nel file /res/drawable/form_bg.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:color="@color/colorPrimary"
android:width="2dp"
/>
<corners android:radius="5dp"/>
<solid android:color="@android:color/white"/>
</shape>
Anche la seconda Activity ha un layout piuttosto semplice: due pulsanti per gestire caricamento e pubblicazione sul Social Network delle immagini disponibili (file: /res/layout/activity_invio_immagine.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
android:id="@+id/immagine"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Pubblica"
android:onClick="pubblica"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Ricarica"
android:onClick="ricaricaImmagine"/>
</LinearLayout>
</LinearLayout>
Le immagini di prova sono state collocate tra i drawable e hanno nome img1.jpg, img2.jpg, img3.jpg e img4.jpg.
Condivisione di un link
Nella MainActivity abbiamo un onCreate che gestisce per lo più le attività di login e logout tramite il pulsante Facebook: tutti elementi che abbiamo già visto:
public class MainActivity extends AppCompatActivity {
private LoginButton fb_Button;
private CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
callbackManager = CallbackManager.Factory.create();
fb_Button = (LoginButton)findViewById(R.id.fb_login);
fb_Button.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Toast.makeText(MainActivity.this, "Login effettuato con successo!", Toast.LENGTH_SHORT).show();
findViewById(R.id.gestionePost).setVisibility(View.VISIBLE);
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException e) {
Toast.makeText(MainActivity.this, "Errore di accesso!", Toast.LENGTH_SHORT).show();
}
});
Profile profile=Profile.getCurrentProfile();
ProfileTracker profileTracker=new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
if (oldProfile!=null && currentProfile==null)
findViewById(R.id.gestionePost).setVisibility(View.GONE);
}
};
profileTracker.startTracking();
if (Profile.getCurrentProfile()!=null)
findViewById(R.id.gestionePost).setVisibility(View.VISIBLE);
}
@Override
protected void onActivityResult(int requestCode, int responseCode, Intent data)
{
super.onActivityResult(requestCode, responseCode, data);
callbackManager.onActivityResult(requestCode, responseCode, data);
}
public void invioImmagini(View v)
{
Intent i=new Intent(this, InvioImmagineActivity.class);
startActivity(i);
}
public void inviaPost(View v)
{
EditText url= (EditText) findViewById(R.id.url);
EditText txt= (EditText) findViewById(R.id.titolo);
EditText descr= (EditText) findViewById(R.id.descrizione);
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse(url.getText().toString()))
.setContentTitle(txt.getText().toString())
.setContentDescription(descr.getText().toString())
.build();
ShareDialog dialog=new ShareDialog(this);
dialog.show(content);
}
}
Il metodo invioImmagini è legato al pulsante “Invia un’immagine” con cui passeremo alla seconda Activity per sperimentare la pubblicazione di immagini mentre il codice più interessante si trova nell’ultimo metodo, inviaPost. Al suo interno, troviamo una classe per la condivisione di contenuti, ShareLinkContent. La classe offre metodi per impostare i valori della condivisione, primo tra tutti l’URL del link. Costruiamo prima l’oggetto ShareLinkcontent e poi, per condividerlo, lo affidiamo ad una finestra di dialogo di classe ShareDialog con cui l’utente potrà modificare altri parametri come è abituato a fare con Facebook.
Condivisione di immagini
Nella seconda Activity troviamo questo codice Java:
public class InvioImmagineActivity extends AppCompatActivity {
private ImageView immagineSelezionata;
private int[] immagini=new int[]{R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4};
private int posizioneImmagineSelezionata=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_invio_immagine);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
immagineSelezionata= (ImageView) findViewById(R.id.immagine);
immagineSelezionata.setImageResource(immagini[posizioneImmagineSelezionata]);
}
public void ricaricaImmagine(View v)
{
cambiaImmagine();
}
private void cambiaImmagine()
{
if (posizioneImmagineSelezionata==immagini.length-1)
posizioneImmagineSelezionata=0;
else
posizioneImmagineSelezionata++;
immagineSelezionata.setImageResource(immagini[posizioneImmagineSelezionata]);
}
public void pubblica(View v)
{
Bitmap bmp= BitmapFactory.decodeResource(getResources(), immagini[posizioneImmagineSelezionata]);
SharePhoto photo = new SharePhoto.Builder()
.setBitmap(bmp)
.setCaption("Sport")
.build();
SharePhotoContent content = new SharePhotoContent.Builder()
.addPhoto(photo)
.build();
ShareApi.share(content, new FacebookCallback<Sharer.Result>() {
@Override
public void onSuccess(Sharer.Result result) {
Toast.makeText(InvioImmagineActivity.this, "Condivisione riuscita!", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException error) {
Toast.makeText(InvioImmagineActivity.this, "Errore di accesso!", Toast.LENGTH_SHORT).show();
}
});
}
}
In questa classe, gestiamo per prima cosa le immagini riposte tra i Drawable. Creiamo un array denominato immagini. Il metodo cambiaImmagine servirà a far ruotare l’immagine selezionata corrente ed il tutto verrà fatto tenendo nota della posizione nell’array ed incrementandolo per l’occasione. Al click sul pulsante “Ricarica” non farà altro che innescare l’inserimento dell’immagine corrente nell’ImageView presente nel layout.
Il metodo pubblica si occuperà di svolgere il lavoro con Facebook pubblicando l’immagine corrente. Anche in questo caso esistono delle classi apposite:
- SharePhoto che identificherà la risorsa da condividere ed un’eventuale etichetta;
- la classe SharePhotoContent prenderà in carico la risorsa foto creata al punto precedente e la renderà un elemento di condivisione attraverso il Social Network;
- piuttosto che usare una ShareDialog, scegliamo la strada della condivisione diretta usando la classe ShareApi. Dovremo passare solo l’oggetto SharePhotoContent, creato poco fa, ed un listener che possiederà i metodi per controllare l’esito della condivisione. In caso di successo verrà chiamato onSuccess, in questo esempio non svolgiamo gestioni particolari ma facciamo solo apparire un Toast.
Conclusioni
Esistono molti altri modi per interagire con Facebook dalle nostre app Android. Pensiamo ad esempio ai video, altro prodotto multimediale molto sfruttato dai Social Network: anche in questo caso non ci stupirà trovare le classi ShareVideo e ShareVideoContent che potremo usare in una maniera analoga a quanto detto per le foto.
Altra opzione interessante è la possibilità di pubblicare in maniera promiscua prodotti multimediali eterogenei: ad esempio, foto e video insieme. In questo caso, si potrà gestire un insieme di oggetti SharePhoto e ShareVideo tramite uno ShareMediaContent.
Questi ed altri elementi potranno essere sfruttati nel dialogo tra Facebook e le nostre app, per approfondimenti la guida ufficiale per sviluppatori offre molti spunti interessanti.














No Responses to “Pubblicare contenuti su facebook dalle applicazioni Android”