Componente Xamarin.Social(Facebook & Twitter) con Xamarin.Android
XAMARIN.SOCIAL
Hola que tal hoy les presento un proyecto mediante el cual podemos practicar el uso de las redes sociales en nuestros proyectos como publicaciones de estados, links y fotografias.
Para iniciar agregaremos el componente Xamarin.Social que se encuentra dentro del store de componentes de Xamarin si aun no tienes experiencia con ellos puedes encontrar la documentación para inicial desde este enlace http://docs.xamarin.com/guides/cross-platform/application_fundamentals/components_walkthrough/
Antes que nada agregaremos permisos a nuestra app en el archivo AndroidManifest.xml para poder guardar las fotografias en la memoria del telefono:
Acceso a camara:
<uses-permission android:name="android.permission.CAMERA" />Permiso para escribir en la SD del telefono:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />Iniciaremos con una pantalla con dos botones en la cual elegiremos si queremos usar facebook o twitter
El codigo XML de esta pantalla es el siguiente:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout1"
android:gravity="center">
<Button
android:text="Facebook"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnFacebook" />
<Button
android:text="Twitter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnTwitter" />
</LinearLayout>
El codigo de la actividad de la venta principal sera el siguiente: protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
Button buttonFB = FindViewById<Button> (Resource.Id.btnFacebook);
Button buttonTW = FindViewById<Button> (Resource.Id.btnTwitter);
//Asignamos el evento del boton de Facebook
buttonFB.Click += buttonFB_HandleClick;
//Asignamos el evento del boton de Twitter
buttonTW.Click += buttonTW_HandleClick;
}
void buttonTW_HandleClick (object sender, EventArgs e)
{
//Iniciamos la siguiente Actividad enviando de parametro un numero
//indicando que usaremos el framework de Twitter
var activity2 = new Intent (this, typeof(ShareActivity));
activity2.PutExtra ("Tipo", 1);
StartActivity (activity2);
}
void buttonFB_HandleClick (object sender, EventArgs e)
{
//Iniciamos la siguiente Actividad Normalmente
StartActivity (typeof(ShareActivity));
}
Enseguida haremos una ventana en la cual cargaremos los campos y botones para interactuar con el framework social de xamarin la ventana quedara de la siguiente manera con el nombre de shareXML.axml:El codigo XML de esta pantalla es el siguiente:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"&ft;
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtEstado1" />
<Button
android:text="Publicar Estado"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnEstado" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtEstado2" />
<Button
android:text="Publicar Estado + Link"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnEstadoLink" />
<ImageView
android:src="@android:drawable/ic_menu_gallery"
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/imageViewFoto" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtEstado3" />
<LinearLayout
android:orientation="horizontal"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1"
android:gravity="center">
<Button
android:text="Capturar Foto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/btnCaptura"
android:gravity="center" />
<Button
android:text="Publicar Foto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/btnPublicar"
android:gravity="center" />
</LinearLayout>
</LinearLayout>
Creamos una actividad nueva con el siguiente nombre ShareActivity.cs y el siguiente codigo:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Content.PM;
using Android.Provider;
using Java.IO;
using Android.Graphics;
using Xamarin.Social.Services;
using Xamarin.Social;
namespace Facebook
{
[Activity (Label = "ShareActivity")]
public class ShareActivity : Activity
{
//Creamos una variables con la informacion proporcionado por facebook
private static readonly FacebookService Facebook = new FacebookService {
ClientId = "Id Cliente",
RedirectUrl = new Uri ("URL de Redireccionamiento")
};
//Creamos una variables con la informacion proporcionado por Twitter
private static readonly TwitterService Twitter = new TwitterService {
ConsumerKey = "Id ConsumerKey",
ConsumerSecret = "Id ConsumerSecret",
CallbackUrl = new Uri ("URL CallbackUrl")
};
//Generamos algunas variables globales
//Variables en donde almacenaremos la direccion de la imagen que tomaremos
Java.IO.File _Archivo;
//Variables en donde almacenaremos la direccion donde guardaremos las imagenes
Java.IO.File _Directorio;
//Variables de nuestra UI
//Imageview donde cargaremos nuestra fotografia tomada
ImageView _imageViewFoto;
//Campos donde el usuario podra escribir lo que quiere compartir
EditText _txtEstado1, _txtEstado2, _txtEstado3;
//Botones en donde haremos las acciones de publicacion
Button _btnEstado, _btnEstadoLink, _btnCaptura, _btnPublicar;
//Varibale en donde cargaremos el tipo de servicio que usaremos 0=Facebook, 1=Twitter
int Tipo=0;
//Generamos un Metodo en donde cargaremos nuestras variables de UI
void AsignarUI()
{
_imageViewFoto = FindViewById<ImageView> (Resource.Id.imageViewFoto);
_txtEstado1 = FindViewById<EditText> (Resource.Id.txtEstado1);
_txtEstado2 = FindViewById<EditText> (Resource.Id.txtEstado2);
_txtEstado3 = FindViewById<EditText> (Resource.Id.txtEstado3);
_btnEstado = FindViewById<Button> (Resource.Id.btnEstado);
_btnEstadoLink = FindViewById<Button> (Resource.Id.btnEstadoLink);
_btnCaptura = FindViewById<Button> (Resource.Id.btnCaptura);
_btnPublicar = FindViewById<Button> (Resource.Id.btnPublicar);
}
//Metodo en donde asignaremos las acciones a los botones
void AsignarEventos()
{
_btnEstado.Click += _btnEstado_HandleClick;
_btnEstadoLink.Click += _btnEstadoLink_HandleClick;
_btnCaptura.Click += _btnCaptura_HandleClick;
_btnPublicar.Click += _btnPublicar_HandleClick;
}
//Evento del boton de publicacion de fotografia
void _btnPublicar_HandleClick (object sender, EventArgs e)
{
if(Tipo==0)
ShareImage (Facebook, _txtEstado3.Text);
else if(Tipo==1)
ShareImage (Twitter, _txtEstado3.Text);
}
//Evento del boton de captura de fotografia
void _btnCaptura_HandleClick (object sender, EventArgs e)
{
if (IsThereAnAppToTakePictures())
{
//Creamos el directorio en donde guardaremos las fotografias capturadas
CreateDirectoryForPictures();
//generamos una variable tipo intent en donde mandaremos llamar la camara
Intent intent = new Intent(MediaStore.ActionImageCapture);
//Asignamos la direccion del archivo a la varible
_Archivo = new File(_Directorio, String.Format("Fotografia_{0}.jpg", Guid.NewGuid()));
//Agregamos un extra con la direccion en donde guardaremos la foto capturada
intent.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(_Archivo));
//Mandamos a llamar nuestro intent y asigamos el requestcode para identificar el tipo de llamada en este caso usaremos el 0
StartActivityForResult(intent, 0);
}
}
//Evento del boton de Estado+Link
void _btnEstadoLink_HandleClick (object sender, EventArgs e)
{
if(Tipo==0)
ShareLink (Facebook, _txtEstado2.Text);
else if(Tipo==1)
ShareLink (Twitter, _txtEstado2.Text);
}
//Evento del boton de Estado
void _btnEstado_HandleClick (object sender, EventArgs e)
{
if(Tipo==0)
Share (Facebook, _txtEstado1.Text);
else if(Tipo==1)
Share (Twitter, _txtEstado1.Text);
}
//Evento de publicacion Estado+Link
void ShareLink (Xamarin.Social.Service service, string textshare)
{
Item item = new Item {
Text = textshare,
Links = new List<Uri> {
new Uri ("http://alejandroruizvarela.blogspot.mx/"),
},
};
Intent intent = service.GetShareUI (this, item, shareResult => {
RunOnUiThread(()=>{
Toast.MakeText(this, shareResult.ToString(), ToastLength.Short).Show();
});
});
StartActivity (intent);
}
//Evento de publicacion Estado
void Share (Xamarin.Social.Service service, string textshare)
{
Item item = new Item {
Text = textshare,
};
Intent intent = service.GetShareUI (this, item, shareResult => {
RunOnUiThread(()=>{
Toast.MakeText(this, shareResult.ToString(), ToastLength.Short).Show();
});
});
StartActivity (intent);
}
//Evento de publicacion Fotografia
void ShareImage (Xamarin.Social.Service service, string textshare)
{
Item item = new Item {
Text = textshare,
};
item.Images.Add(new ImageData(BitmapFactory.DecodeFile(_Archivo.AbsoluteFile.ToString())));
Intent intent = service.GetShareUI (this, item, shareResult => {
RunOnUiThread(()=>{
Toast.MakeText(this, shareResult.ToString(), ToastLength.Short).Show();
});
});
StartActivity (intent);
}
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Create your application here
SetContentView (Resource.Layout.shareXML);
AsignarUI ();
AsignarEventos ();
if (Intent.GetIntExtra ("Tipo", 0) != 0)
Tipo = 1;
}
//Creamos el evento override OnActivityResult en donde capturaremos los resultados cuando mandamos a llamar
//la actividad de la camara
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
//verificamos que nuestro requestCode sea el 0 con el que anteriormente mandamos a llamar la actividad de la camara
if (requestCode == 0) {
//Guardamos la foto para hacerla visible en la galeria
Intent mediaScanIntent = new Intent (Intent.ActionMediaScannerScanFile);
Android.Net.Uri contentUri = Android.Net.Uri.FromFile (_Archivo);
mediaScanIntent.SetData (contentUri);
SendBroadcast (mediaScanIntent);
//Utilizamos un metodo para ajustar la imagen tomada a nuestro imageview
int height = _imageViewFoto.Height;
int width = _imageViewFoto.Width;
using (Bitmap bitmap = _Archivo.Path.LoadAndResizeBitmap (width, height)) {
_imageViewFoto.SetImageBitmap (bitmap);
}
}
}
//Mediante este metodo verificamos que nuestra app tenga permisos para tomar fotografias
private bool IsThereAnAppToTakePictures()
{
Intent intent = new Intent(MediaStore.ActionImageCapture);
IList<ResolveInfo> availableActivities = PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
return availableActivities != null && availableActivities.Count > 0;
}
//Mediante este metodo verificamos si existe en directorio para guardar las fotografias en caso de no existir lo creamos
private void CreateDirectoryForPictures()
{
_Directorio = new File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures), "FacebookDemo");
if (!_Directorio.Exists())
{
_Directorio.Mkdirs();
}
}
}
//Clase auxiliar con la cual redimensionamos nuestra imagen
public static class BitmapHelpers
{
public static Bitmap LoadAndResizeBitmap(this string fileName, int width, int height)
{
// First we get the the dimensions of the file on disk
BitmapFactory.Options options = new BitmapFactory.Options { InJustDecodeBounds = true };
BitmapFactory.DecodeFile(fileName, options);
// Next we calculate the ratio that we need to resize the image by
// in order to fit the requested dimensions.
int outHeight = options.OutHeight;
int outWidth = options.OutWidth;
int inSampleSize = 1;
if (outHeight > height || outWidth > width)
{
inSampleSize = outWidth > outHeight
? outHeight / height
: outWidth / width;
}
// Now we will load the image and have BitmapFactory resize it for us.
options.InSampleSize = inSampleSize;
options.InJustDecodeBounds = false;
Bitmap resizedBitmap = BitmapFactory.DecodeFile(fileName, options);
return resizedBitmap;
}
}
}
Y ahora si podemos ver los resultados de nuestra app:Pueden acceder al ejemplo completo desde este link:
https://github.com/AlejandroRuiz/Mono/tree/master/Facebook
+Info
Facebook Developers
https://developers.facebook.com/
Twitter Developers
https://dev.twitter.com/
Xamarin.Social Component
http://components.xamarin.com/view/xamarin.social/
PassData Between Activities
http://docs.xamarin.com/recipes/android/fundamentals/activity/pass_data_between_activity/
Take Pictures Xamarin.Android
http://docs.xamarin.com/recipes/android/other_ux/camera_intent/take_a_picture_and_save_using_camera_app/
Les dejo una buena rola para que se motiven mientras programan:














Muy buena explicación, estuve buscando ejemplos de esto pero no tuve mucha suerte, excelente trabajo sigue asi.
ResponderEliminarMuchas gracias Cecilio
Eliminar