Copiar un texto al portapaples en Windows Phone 8 con C#

En esta ocasión muestro cómo podemos copiar un texto al portapapeles en una app en Windows Phone 8, usano como lenguaje de programación C#.

La forma para hacer esto es muy sencillo, sólo falta incluir la siguiente:

Clipboard.SetText("Texto copiado al portapapeles");

La línea anterior copiará la cadena Texto copiado al portapapeles al portapapeles del dispositivo.

Cambiar la MainPage.xaml predeterminada por otra en una App Windows Phone 8

Con las primeras cosas que me he encontrado al iniciar el desarrolo de Apps en Windows Phone 8, es que se crea una page predeterminada llamada MainPage.xaml. Esta pantalla está bien, pero a mi me gusta definir el nombre de la pantalla que deseo usar de inicio así como todas las demás.

Por tal motivo, me di a la tarea de buscar la forma de hacerlo y la manera para realizarlo es muy simple.

En la siguiente pantalla se muestra un proyecto recién creado llamado EjemploBlog.

jx_post_285_01

Crearemos una nueva page llamada PruebaPage.xaml

jx_post_285_02

jx_post_285_03

Una vez creada la page que mandaremos a llamar, iremos a Solution Explorer -> Solution ‘Nombre del proyecto’ -> Nombre del proyecto -> Properties y abrir el archivo WMAppManifest.xml.

jx_post_285_04

Esto abrirá la siguiente pantalla:

jx_post_285_05

Ahora se deberá cambiar en Navigation Page el texto MainPage.xaml a PruebaPage.xaml:

jx_post_285_06

Con ésto al ejecutar nuevamente la aplicación, se podrá notar que se abrirá la nueva page.

jx_post_285_07

Acceso directo para ejecutar una App en Windows Phone 8

Últimamente tengo la costumbre de usar accesos directos (shortcuts) en los IDE’s que uso para ejecutar una App en un simulador o dispositivo para no estar yendo a la interfaz gráfica y ejecutar. En el caso de las apps de Windows Phone 8 con Visual Studio la forma que he encontrado para realizar está acción es la siguiente.

Arrancar con debugging (Start Debugging):

Presionar la tecla: F5

Arrancar sin debugging (Start Without Debugging):

Presionar las teclas: Ctrl + F5

 

Mac OS X Wifi Connection timeout

Este post está dedicado a un problema que me ha ocurrido dos veces al actualizar a Mountain Lion y Mavericks de una Mac.

El problema es que una vez hecha la actualización desde mi red Wifi, al reiniciar el equipo e intentar conectarse a mi red, me envía el mensaje de “Connection timeout” y de ahí no sale.

La realidad es que la primera vez que me ocurrió, trate muchas cosas, desde borrar archivos plist, crear una nueva Location para la red, hasta cambiar los parámetros del router, y la verdad es que nada me funcionó o no supe como se solucionó ya que lo último que intenté fue apagar el router y me fui a hacer el super y cuando regresé ya habían prendido el router y sorpresa, ya funcionaba.

Esta vez intenté lo mismo pero no funcionó, también creé otra cuenta de administrador y tampoco, cambié parámetros del router, borré en el keychain y por último volví a cambiar parámetros del router, pero ahora me percaté de ciertas cosas que hice, y aquí describo los pasos que seguí:

  • Conecté mi computadora por cable al router
  • Abrí el administrador por web del router
  • Desactivé el dispositivo Wifi de la computadora (Turn Wi-Fi Off)
  • Me fui a la configuración de la Wifi y le indiqué que volviera a los parámetros por defecto del router
  • Active el dispositivo Wifi de la computadora (Turn Wi-Fi On)
  • Seleccioné mi Wifi
  • Me pidió la contraseña (ya que había borrado los datos de la contraseña)
  • Listo, me dejó conectar

Comencé a jugar nuevamente con los parámetros de la red hasta dejarlo como lo tenía

NOTA: Cabe mencionar que cada vez que modificaba los parámetros del router, primero desactivaba el dispositivo Wifi, realizaba los cambios y volvía a conectarme y sin guardar la contraseña en el llavero hasta haber dejado el router como lo tenía.

Espero que esto le sirva a alguien más.

Error de AdMob en Android: Error parsing XML: unbound prefix

Otro problema con el cuál me encontré, fue al ingresar la siguiente línea en el layout donde deseaba colocar la publicidad:

<com.google.ads.AdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         ads:adUnitId="MY_AD_UNIT_ID"
                         ads:adSize="BANNER"
                         ads:testDevices="TEST_EMULATOR, TEST_DEVICE_ID"
                         ads:loadAdOnCreate="true"/>

El error que me apareció fue:

Error parsing XML: unbound prefix

Realmente este error fue por un poco de falta de atención, ya que omití una línea que es necesaria y la cual deberemos colocar en el RelativeLayout principal de nuestro layout:

xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"

Quedando de la siguiente manera:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

Esto permitirá que desaparezca ese error.

Error de AdMob en Android: String types not allowed

Al iniciar la integregración de AdMob en una aplicación en Android, me encontré que al agregar la siguiente línea:

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

Me surgía el siguiente error:

Error: String types not allowed (at 'keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize')

Esto parte es por no seguir las indicaciones a los requerimientos jajaja, pero para poder corregirlo, habrá que abrir el archivo project.properties y cambiar el valor del target a android-13 o superior:

target=android-13

Si al guardar los cambios sigue mostrando el error, es posible que tenga que aplicar clean al proyecto. Esto es seleccionando la opción:

Project -> Clean…

Con eso se corregirá ese problema.

Ocultar el teclado virtual en Android cuando hacemos un onClick en un botón

Cuando estamos implementando una búsqueda en nuestra app en Android, muchas veces si no es que en su mayoría, colocamos un elemento EditView para introducir la palabra a buscar y un Button o ImageButton para presionar y comenzar la búsqueda ya sea a través de un Web Service o en una base de datos local de la palabra ingresada.

Por ende cuando ingresamos la palabra es porque se muestra el teclado virtual de nuestro dispositivo, pero cuando presionamos el botón de búsqueda no se oculta el teclado. Pues para hacer eso, vamos a simular lo siguiente.

Vamos a suponer que tenemos dos atributos:

protected EditText editTextBuscar;

protected ImageButton imageButtonBuscar;

Ahora en el listener del botón vamos a colocar las instrucciones para ocultar el teclado virtual.

imageButtonBuscar.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

        inputMethodManager.hideSoftInputFromWindow(editTextBuscar.getWindowToken(), 0);
    }
});

Con esto al presionar el botón el teclado se ocultará.

Error de Android en Eclipse: Failed to install apk on device timeout

Desarrollando una aplicación (app) en Android, me surgió el siguiente error:

Failed to install MiApp.apk on device ‘30344C3XXXXX’: timeout

Este error me ha surgido al conectar mi dispositivo a la computadora y correr la app en dicho dispositivo. Por tal motivo, me puse a investigar la forma de resolverlo y encontré la siguiente solución.

Lo que deberemos hacer es cambiar el valor de Timeout de 5000 a 10000:

En Linux y Windows

Window -> Preferences -> Android -> DDMS -> ADB connection timeout (ms)

En Mac OS X

Eclipse -> Preferences -> Android -> DDMS -> ADB connection timeout (ms)

Con esto pude ejecutar la app en mi dispositivo conectado a la computadora.

Iniciar un temporizador con NSTimer en iOS

Este es un ejemplo muy sencillo de cómo podemos hacer un contador usando NSTimer.

Lo que haremos es imprimir cada segundo un número consecutivo y lo primero a realizar es crear 2 propiedades de la siguiente manera:

@property (strong, nonatomic) NSTimer *temporizador;

@property (nonatomic) NSInteger contador;

Ahora en donde quiera lanzarse el comienzo del contador se deberá poner la siguiente instrucción:

self.temporizador = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(contar) userInfo:nil repeats:YES];

Por último se colocará un método llamado contar el cual irá imprimiendo el número consecutivo:

– (void)contar {

NSLog(@”Contando: %i”,self.contador);

self.contador++;

}

Eso es todo para empezar un temporizador.

 

Reproduciendo sonidos en nuestra app usando AudioToolbox

En esta ocasión voy a ver cómo se puede reproducir un archivo de sonido usando el framework AudioToolbox, esto es muy útil cuando queremos reproducir archivos con algunos efectos de audio al presionar un botón o realizar cierta acción.

Para iniciar deberemos agregar el framework AudioToolbox.framework, como se indica en la image y presionamos el signo “+”.

jx_post_198_01

Presionamos el botón “Add” y se agregará el framework.

jx_post_198_02

Hecho lo anterior, podemos agregar a nuestro proyecto, un archivo de sonido, para ejemplificar, aquí se usará un archivo en formato .mp3.

Presionamos con el botón derecho del ratón sobre una de las carpetas del proyecto como en este caso Supporting Files y elegimos la opción Add Files To “NombreProyecto”… como se puede ver en la imagen.

jx_post_198_03

Buscamos y seleccionamos el archivo que deseamos, en mi caso coloqué el archivo dentro del proyecto, por lo que sólo seleccionaré las opciones marcadas en la imagen.

jx_post_198_04

Agregado el archivo lo siguiente que haremos será agregar el código necesario. Empezaremos incluyendo en el archivo .h o .m la biblioteca necesaria:

#import <AudioToolbox/AudioToolbox.h>

Ahora donde deseemos usar la reproducción del sonido, incluiremos las siguientes líneas:

SystemSoundID SoundID;

NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"sableon" ofType:@"mp3"];

AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile], &SoundID);

AudioServicesPlaySystemSound(SoundID);

Se deberá cambiar el nombre del archivo en mi caso llamado sableon (sin la extensión) por el nombre de su archivo y si fuera de otra extensión deberemos cambiar donde dice mp3.

Algo importante a considerar es que deben ser sonidos pequeños, de efectos o tonos de duración corta para que sea reproducido rápidamente, de lo contrario se pueden usar otros métodos para la reproducción del audio deseado.

Con esto agregado únicamente falta probar la reproducción del sonido de acuerdo a como lo hayan implementado, ya sea en la acción como respuesta a presionar un botón, a un gesto o lo que hubiesen implementado.

Obtener medidas de la pantalla en iOS

En algunas aplicaciones que deseamos crear, es necesario obtener las dimensiones de la pantalla del dispositivo, sobre todo ahora con el iPhone 5, por lo que a veces tendremos que hacer una diferencia con las medidas de los iPhone’s anteriores y este.

Para podere obtener dichas medidas se puede agregar el siguiente código:

CGRect pantalla = [[UIScreen mainScreen] bounds];

Esta asignación nos crea un objeto con la información de la pantalla, para obtener el width o height de la pantalla sólo tenemos que hacer referencia a los atributos de pantalla:

pantalla.size.height

o

pantalla.size.width

Con esto obtendremos las dimensiones de nuestros dispositivos con iOS.

Fijar la orientación de nuestro iPhone, iPod Touch o iPad

Una de las cosas que siempre me ha gustado en Android, es que puedo bloquear la orientación de mi dispositivo y así al momento de girarlo la pantalla no cambia de orientación y cuando empecé a usar iOS no contaba con esta característica, hasta que se agregó dicha opción.

Para activar o desactivar el bloque de orientación, basta con presionar 2 veces el botón Home de dispositivo.

jx_post_159_01

Hecho esto, se mostrarán las apps abiertas.

jx_post_159_02

Ahora sólo deberemos deslizar hacia la derecha para que aparezca la opción la opción de bloqueo de orientación.

jx_post_159_03

Al presionarlo veremos como cambia tanto el botón colocandole un candado además de agregar un ícono al lado del porcentaje de la batería.

jx_post_159_04

jx_post_159_05

Obviamente para desbloquear la orientación de la pantalla, deberemos hacer lo mismo y presionar sobre el mismo botón para que desactive el bloqueo.

Cambiar el modo de hibernación de nuestra MacBook Pro

Por defecto cuando nosotros cerramos la MacBook Pro y tenemos nuestra sesión abierta con varios programas, lo que sucede es que se pone en modo de hibernación pero esto lo hace en memoria RAM y el consumo de energía es muy bajo, así como el foco indicador queda parpadeando de nuestra máquina.

jx_post_133_01

Hay otra manera de ponerlo en modo hibernación la cual nos permite que la información de la sesión se guarde en el disco duro y no consuma nada de energía ya que es como si se apagara la computadora pero con la diferencia que cuando la volvamos a prender, iniciará todo lo que teníamos abierto.

Para configurar esta opción, tendrémos que abrir una Terminal, la cuál pueden encontrar con el finder en /Aplicaciones/Utilidades/Terminal

jx_post_133_02

Esto nos abrirá una pantalla como la siguiente:

jx_post_133_03

Ahora ejecutaremos el siguiente comando:

sudo pmset -a hibernatemode 1

Dicho comando nos pedirá la contraseña de administración de nuestra máquina, la ingresamos y listo, una vez que cierren la pantalla de la computadora tardará un poco más en guardar toda la información pero al finalizar, se apagará la computadora y una vez al volverla a enceder, abrirá todo lo que teníamos abierto antes de cerrar la computadora.

Si en algún momento se desea regresar a la configuración anterior, bastará con realizar el siguiente comando:

sudo pmset -a hibernatemode 3

Con eso finalizo este artículo.

Cerrar una pantalla abierta con el método presentModalViewController

En el post Abrir una nueva pantalla usando presentModalViewController mostré como abrir una pantalla haciendo uso del método presentModalViewController, ahora mostraré como cerrar esa ventana que abrimos.

Dentro del método que desean que cierre la ventana se deberá incluir la siguiente línea:

[self dismissModalViewControllerAnimated:YES];

Con esto se cerrará la ventana abierta.