IntroducciónArtículo anterior:
C# desarrollo móvil serie (1. Configuración del entorno)
C# desarrollo móvil serie (2. Construyendo WebApp con WebView)
C# desarrollo móvil serie (3. Escaneo de códigos QR con cámara + conceptos básicos)
Tras completar este artículo, la serie prácticamente concluye.
Con estos conocimientos, desarrollar una WebApp serápan totally doable. Debo reconocer que Xamarin es realmente una herramienta excelente.
Lamentablemente, el momento no fue el adecuado. Cuando se完善ó, se volvió de código abierto y contó con apoyo comunitario, las aplicaciones安装包-cliente) ya estaban en declive...
Sin más preámbulos, veamos el contenido.
Establezcamos los objetivos de aprendizaje:
1. Aprender a invocar aplicaciones del sistema
2. Aprender a abrir la galería y obtener la foto seleccionada
3. Aprender a ser invocado (permitir que otras aplicaciones nos llamen)
Resultado visual:
Contenido1.Invocando aplicaciones del sistema
Android ofrece múltiples aplicaciones nativas: llamadas, SMS, galería, mapas, correo electrónico, etc.
Hoy las invocaremos una por una con parámetros.
Agreguemos un botón de prueba para invocar aplicaciones de terceros.
Como se muestra:
Ahora programemos el evento clic del botón:
protected override void OnCreate(Bundle bundle)
{
var btnProbar = FindViewById<Button>(Resource.Id.btnInvocar);
btnProbar.Click += delegate
{
//acciones...
}
}
Con la preparación lista, veamos el código para envocar aplicaciones del sistema.
1.1 Realizar llamada telefónica
Android.Net.Uri numero = Android.Net.Uri.Parse("tel:18678445447");
Intent marcar = new Intent(Intent.ActionDial, numero);
StartActivity(marcar);
Código directo: tres líneas. After tel: specify el número a llamar.
1.2 Enviar SMS
// Enviar mensaje de texto
Android.Net.Uri destinoSMS = Android.Net.Uri.Parse("smsto:10010");
Intent smsIntent = new Intent(Intent.ActionSendto, destinoSMS);
smsIntent.PutExtra("sms_body", "Mensaje de prueba desde Xamarin");
StartActivity(smsIntent);
El texto after smsto: indica el destinatario. El contenido del mensaje se pasa mediante sms_body.
1.3 Abrir mapas
Android.Net.Uri coordenadas = Android.Net.Uri.Parse("geo:38.899533,-77.036476");
Intent verMapa = new Intent(Intent.ActionView, coordenadas);
StartActivity(verMapa);
Após geo: van las coordenadas de latitud y longitud.
1.4 Enviar correo electrónico
Android.Net.Uri correo = Android.Net.Uri.Parse("mailto:correo@ejemplo.com?subject=Asunto&body=Cuerpo del mensaje");
var intentCorreo = new Intent(Intent.ActionView, correo);
StartActivity(intentCorreo);
1.5 Abrir contactos
//Primera opción (recomendada)
Android.Net.Uri uriContactos = Android.Net.Uri.Parse("content://contacts/people");
Intent picker = new Intent(Intent.ActionPick, uriContactos);
StartActivityForResult(picker, 11);
//Segunda opción
Intent explorer = new Intent();
explorer.SetAction(Intent.ActionGetContent);
explorer.SetType("vnd.android.cursor.item/phone");
StartActivityForResult(explorer, 11);
1.6.(Algunos ejemplos adicionales)
Continuemos con el siguiente tema...
2.Abrir galería y obtener la foto seleccionada
Del mismo modo, modificamos el código en el evento clic:
Intent selectorImagen = new Intent();
selectorImagen.SetType("image/*");
selectorImagen.SetAction(Intent.ActionPick);
StartActivityForResult(selectorImagen, 11);
Los lectores atentos notarán que anteriormente usamos StartActivity para abrir aplicaciones, mientras que en 1.5 empleamos StartActivityForResult.
El nombre del método lo indica claramente: esta es una apertura que retorna datos.
¿Cómo capturar ese retorno? Como se mencionó en artículos anteriores, el método OnActivityResult gestiona los datos devueltos.
Programamos así:
protected override void OnActivityResult(int codigoSolicitud, Result resultado, Intent datos)
{
//base.OnActivityResult(codigoSolicitud, resultado, datos);
//Si el requestCode enviado fue 1
if (codigoSolicitud == 1 && resultado == Result.Ok)
{
webView.LoadUrl(datos.GetStringExtra("codigo"));
Toast.MakeText(this, "Resultado del escaneo:" + datos.GetStringExtra("codigo"), ToastLength.Short).Show();
}
if(codigoSolicitud == 11 && resultado == Result.Ok)
{
//Obtener la URI devuelta
Android.Net.Uri uriImagen = datos.Data;
//Convertir a ruta de archivo válida
var rutaSD = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
var rutaCompleta = System.IO.Path.Combine(rutaSD, datos.DataString);
ContentResolver contenido = this.ContentResolver;
string[] projection = { MediaStore.Images.Media.InterfaceConsts.Data };
var cursor = this.ContentResolver.Query(uriImagen, projection, null, null, null);
int indiceColumna = cursor.GetColumnIndex(MediaStore.Images.Media.InterfaceConsts.Data);
cursor.MoveToFirst();
var path = cursor.GetString(indiceColumna);
//Leer archivo mediante stream
FileStream flujo = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);
BinaryReader lector = new BinaryReader(flujo);
lector.BaseStream.Seek(0, SeekOrigin.Begin);
byte[] bytesArchivo = lector.ReadBytes((int)lector.BaseStream.Length);
MostrarMensaje("Archivo leído, tamaño:" + bytesArchivo.Length);
}
}
El proceso de obtener una foto tiene 3 pasos:
1.Obtener el valor retornado (ruta, pero no utilizable directamente)
2.Convertir el retorno a la ruta de archivo deseada (clave~ copiar el código)
3.Leer el archivo mediante stream y obtener los bytes (idéntico a operaciones IO en .NET)
Con esto completamos la lectura de fotos.
3.Ser invocado (permitir que otros nos llamen)
Aquí puede surgir confusión..
Pongamos un ejemplo: en Windows, los archivos comprimidos pueden abrirse con múltiples programas (rar, zip, 7z). Cuando hay varios instalados, el sistema pregunta cuál usar por defecto.
En Android ocurre igual: al abrir un archivo txt que tu app no soporta, aparece la opción de elegir una app de terceros. Si tu app puede abrir txt, debes anunciarlo: ¡aquí!, ¡úsame!
No sé si quedó claro...
Veamos el código..
Creamos un nuevo proyecto de app:
En MainActivity agregamos el filtro de intención:
Los dos atributos significan: cuando la intención del usuario sea enviar (ActionSend) y la categoría sea default.
Así filtramos levemente la intención.
Desplegamos esta app en el emulador:
Ahora programaramos en la app original para invocar esta nueva:
// Abrir app con acción de enviar
var intentEnvio = new Intent(Intent.ActionSend);
intentEnvio.PutExtra(Intent.ExtraText, "Datos enviados: XXXXX");
StartActivity(Intent.CreateChooser(intentEnvio, "Seleccionar aplicación"));
Al presionar el botón, se invoca la app3, como muestra la imagen:
La app3 recibió los datos enviados desde WebApp. Ahora**, aprendamos a recibir datos de otras apps**:
El código en App3:
if (Intent.ActionSend == action)
{
//Recuperar datos enviados
var textoRecibido = this.Intent.Extras.GetString(Intent.ExtraText);
//Mostrar en toast
Toast.MakeText(this, textoRecibido, ToastLength.Long).Show();
//Mostrar en control de texto
var vistaTexto = FindViewById<TextView>(Resource.Id.textView1);
vistaTexto.Text = textoRecibido;
}
Con esto, la serie de desarrollo de aplicaciones móviles con C# conclude.
Una reflexión finalA lo largo de estos artículos, podemos confirmar que Xamarin está bastante maduro. El código no presenta dificultades, solo requiere comprender los nuevos conceptos de navegación, apertura de aplicaciones e intenciones.
Esta serie到此为止. Ahora procederé a investigar Asp.net core..