• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

Pubblicare contenuti su facebook dalle applicazioni Android

By Giuseppe Maggi | on 14 Novembre 2016 | 0 Comment
Android

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

android-facebook-integrazione_img_01

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:

android-facebook-integrazione_img_02

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.

android-facebook-integrazione_img_03

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.

Share this story:
  • tweet

Tags: androidfacebookTutorial Pratici

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • IntelliJ IDEA: IDE per programmare in Java e Kotlin

    25 Luglio 2018 - 0 Comment
  • Android: usare Connect Pattern

    10 Luglio 2018 - 0 Comment
  • Android: il metodo findViewById() non richiede più il cast

    21 Giugno 2018 - 0 Comment

Author Description

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

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO