Archivo de la etiqueta: google

Tutorial Google APIs – Código para acceder a los contactos con People API

Ya estás en la segunda entrega de este Tutorial sobre el uso de las APIs de Google.
Aquí te mostraré el código de Visual Basic y C# para acceder a los contactos de Google usando People API. Como te comenté en la priumera entrega sobre cómo crear un proyecto en Google Cloud, el API que usaremos es People API, no te confundas con Contacts API (como a mí me ocurrió) ya que parece que será la más adecuada, pero además de que Google no recomienda que se use Contacts API, la he probado y no he conseguido sacar prácticamente nada de información, y al que he sacado es de unos pocos contactos (que ni recordaba que los tenía creados).

Nota:
Está uno acostumbrado a que te marquen los errores horrográficos que esto de que no te los marque es un Orror! 😛

Bueno vamos empezar con el código de C# que es lo que la gente suele ver en internet (de VB no he visto ni un ejemplo, así que… ya mismo lo verás en primicia).

Después de escribir el párrafo anterior he cambiado de opinión y te voy a enseñar conjuntamente el código de los dos lenguajes, para que vayas comparando.

Código de C# y VB para mostrar los contactos de una cuenta de Google usando People API

Nota:
Debo decir que parte de este código lo he visto en algunos ejemplosencontrados tanto en la documentación de Google como en foros de C#. Pero principalmente de la documentación (escasa) de Google y en agunos casos, los ejemplos eran de java, ni siquiera de C#.

Como te comenté en el preámbulo del tutorial, debes añadir las referencias a los paquetes de NuGet que instalarán las APIs en tu proyecto. Yo he añadido todas las que te indiqué en esa primera página del tutorial. Por supuesto si quieres acceder, por ejemplo al calendario o a GMail, tendrás que añadir referencias a esas APIs, además de añadirlas al proyecto creado en Google Cloud Platform.

Veamos el código inicial (con las importaciones de los espacios de nombres) que será básicamente el mismo en todas las apliocaciones que hagas para acceder a las APIs de Google.

// Genéricas
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Util.Store;
// People API
using Google.Apis.People.v1;
using Google.Apis.People.v1.Data;
// Docs API
using Google.Apis.Docs.v1;
using Google.Apis.Docs.v1.Data;
// Drive API
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data; // Para el tipo File

using System;
using System.Collections.Generic;
//using System.IO;
using System.Threading;
using System.Text;
using System.Linq;
'// Genéricas
Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Services
Imports Google.Apis.Util.Store
'// People API
Imports Google.Apis.People.v1
Imports Google.Apis.People.v1.Data
'// Docs API
Imports Google.Apis.Docs.v1
Imports Google.Apis.Docs.v1.Data
'// Drive API
Imports Google.Apis.Drive.v3
Imports Google.Apis.Drive.v3.Data '// Para el tipo File

Imports System
Imports System.Collections.Generic
Imports System.Threading
Imports System.Text
Imports System.Linq

Ahora vamos a crear una serie de campos estáticos/compartidos (static en C#, shared en VB) que usaremos también de forma genérica en todos los proyectos de acceso a Google APIs.

class Program
{
    // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/docs.googleapis.com-dotnet-quickstart.json
    static string[] Scopes = { DocsService.Scope.Documents, 
                               DocsService.Scope.DriveFile, 
                               PeopleService.Scope.ContactsReadonly };

    static string ApplicationName = "Tutorial Google APIs VB";

    // Los datos del proyecto creado para VB
    static ClientSecrets secrets = new ClientSecrets()
    {
        ClientId = "430211665266-t68vl99t2q40v3lbctgbph23j2644bpj.apps.googleusercontent.com",
        ClientSecret = "Xqexl0FMPedNc1KYs0iJt22A"
    };

    static DocsService docService;
    static DriveService driveService;
    static PeopleService peopleService;

    static UserCredential Credential;
Class Program

    Shared Scopes As String() =
        {
            DocsService.Scope.Documents,
            DocsService.Scope.DriveFile,
            PeopleService.Scope.ContactsReadonly
        }

    Shared ApplicationName As String = "Tutorial Google APIs VB"

    Shared secrets As ClientSecrets = New ClientSecrets() With
        {
            .ClientId = "430211665266-t68vl99t2q40v3lbctgbph23j2644bpj.apps.googleusercontent.com",
            .ClientSecret = "Xqexl0FMPedNc1KYs0iJt22A"
        }

    Shared docService As DocsService
    Shared driveService As DriveService
    Shared peopleService As PeopleService

    Shared Credential As UserCredential

Lo que ese primer comentario indica (es de un quickstart de Google) es que si cambias los valores del array Scopes debes eliminar el directorio creado en Documentos\.credentials (ahora verás porqué).

El array Scopes contiene los ámbitos de la aplicación, es a qué estamos pidiendo permiso para acceder. Ahí he añadido los tres ámbitos que usaré en este tutorial, pero si solo quieres acceder a los contactos con People API, añadiendo PeopleService.Scope.ContactsReadonly sería suficiente. Si te fijas, estás pidiendo autorización (a OAuth) para acceder de forma de solo lectura a los contactos.
En realidad estás pidiendo permisos para acceder a los Documentos y al Drive sin restricciones, pero a los contactos solo para leerlos. Estos dos últimos necesitan más permisos porque queremos crear ficheros, eliminarlos, lo mismo con los documentos.

Lo importante (también) es la asignación de ClientSecrets, ahí tendás que poner los datos que te haya generado al configurar el OAuth de la aplicación. Eso que te muestro son los valores que en mi proyecto para este tutorial he pedido, el que se indique que la aplicación se llama Tutorial Google APis VB no significa que no se pueda usar para C#, ese título o nombre de aplicación no es restrictivo para nada.

Nota:
Normalmente esos valores se recomienda que no se hagan públicos… ¡vaya el caso que hago! jejejeje… pero para este caso, me fio de ti, y sé que no se lo dirás a nadie y así lo mantenemos en secreto… 😉

Las tres declaraciones después de asignar el valor a secrets son para acceder a los servicios de las tres APIs que usaré en estos tutoriales, las defino a nivel de clase para que se puedan usar en todos los métodos que sean necesarios y no tener que pasarlas como argumento de llamada al método que lo necesite.

La última declaración (Credential) es para crear las credenciales del usuario. La asignación la haré en el método Main, y como es un valor compartido, también se podrá usar en cualquier parte de la clase.

El siguiente código es el método Main, en el que llamaremos al método que accede a los contactos y los muestra.

Y como verás en las capturas el correo que he usado no tenía ningún contacto y he tenido que crear uno para comprobar que funciona… las cosas del Guille…

static void Main(string[] args)
{
    Console.WriteLine("Tutorial Google APIs con C#");

    string credPath = System.Environment.GetFolderPath(
        Environment.SpecialFolder.Personal);
    
    // Directorio donde se guardarán las credenciales
    credPath = System.IO.Path.Combine(credPath, ".credentials/Tutorial-Google-APIs-VB");

    Credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        secrets,
        Scopes,
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
    //Console.WriteLine("Credential file saved to: " + credPath);

    // Mostrar los contactos
    MostrarContactos();

    Console.WriteLine();
    Console.WriteLine("Pulsa una tecla.");
    Console.Read();
}
Public Shared Sub Main(ByVal args As String())

    Console.WriteLine("Tutorial Google APIs con Visual Basic")

    Dim credPath As String = System.Environment.GetFolderPath(
        Environment.SpecialFolder.Personal)

    '// Directorio donde se guardarán las credenciales
    credPath = System.IO.Path.Combine(credPath, ".credentials/Tutorial-Google-APIs-VB")

    Credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        secrets,
        Scopes,
        "user",
        CancellationToken.None,
        New FileDataStore(credPath, True)).Result

    '// Mostrar los contactos
    MostrarContactos()

    Console.WriteLine()
    Console.WriteLine("Pulsa una tecla.")
    Console.Read()
End Sub

El valor de credPath es el direcorio donde se crearán las credenciales que vamos a usar en este programa. Se guardará en los documentos del usuario en una carpeta llamada Tutorial-Google-APIs-VB que estará incluida en .credentials.

Si haces cambios en los permisos o te han faltado permisos en la configuración de OAuth y los modificas, debes eliminar la carpeta del tutorial, a de .credentials la puedes dejar, por si la usas para almacenar las credenciales de otros programas que use el usuario.
También tendrás que borrarla si decides usar otra cuenta de Google (GMail) para acceder a esos contactos. Si solo tienes una cuenta de GMail, no hará falta que la borres salvo para los dos primeros casos.

Cuando ejecutemos la aplicación verás qué es lo que se guarda en esa carpeta.

A Credentials le asignamos las credenciales que queremos usar.

Aquí tengo que hacer una puntuialización.
El valor de secrets se asigna con los valores que hemos indicado (de foirma llana y clara) antes, pero también se puede hacer accediendo a un fichero que contiene esos valores, al menos así no se mostrarán directamente en el código los valores secretos. Aunque seguirán estando al alcance del usuario de la aplicación.

La forma de hacerlo lo pondré en otro ejemplo de este tutorial.

Ahora solo nos falta ver qué código contiene elmétodo MostrarContactos.

¡Vamos a ello!

private static void MostrarContactos()
{
    // Create Drive API service.
    peopleService = new PeopleService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = Credential,
        ApplicationName = ApplicationName,
    });

    // Lista de los contactos (People)
    Console.WriteLine("Contactos:");

    // Este muestra todos los contactos
    GetPeople(peopleService, null);

    Console.WriteLine();
    Console.WriteLine($"Hay {total} contactos / People");
    Console.WriteLine();
}
Private Shared Sub MostrarContactos()
    peopleService = New PeopleService(New BaseClientService.Initializer() With
    {
        .HttpClientInitializer = Credential,
        .ApplicationName = ApplicationName
    })

    Console.WriteLine("Contactos:")

    GetPeople(peopleService, Nothing)

    Console.WriteLine()
    Console.WriteLine($"Hay {total} contactos / People")
    Console.WriteLine()
End Sub

Le asignamos el valor a peopleService para que pida esos permisos a Google, como ves se usa el protocolo HTTP.
Eso lo que hará es abrir una página en el navegador pidiendo permiso para acceder a los datos de una cuenta de GMail (ver la figura 1)

Figura 1. Seleccionar la cunta que queremos usar para acceder a sus contactos.

Esa primera pantalla nos pide que indiquemos a qué contactos queremos acceder, es decir, solo accederá a los contactos de la cuenta que indiques, y para indicar esa cuenta debes tener el password, si no… no hay nada que hacer.
Por tanto, esto que vamos a hacer es seguro, en el sentido de que yo no voy a acceder (ni puedo) a tus contactos… otra cosa es que mi aplicación se comunicara conmigo o guardara esa información en algún sitio… pero no te preocupes, no lo hace, además lo puedes comprobar por ti mismo viendo el código.

Una vez elegida la cuenta, te mostrará un aviso de que la aplicación no es segura o, en realidad, que no se ha verificado (ver la figura 2).
Tendrás que autorizarla para que pueda seguir.

Figura 2. DEbes mostrar la información oculta para permitir ir a la aplicación

Una vez hechoi esto, Google te pedirá confirmación para dejar que la aplicación haga lo que se ha indicado en Scopes. Así que… otras tres pantallitas más de autorización (ver figuras 3 a 5).

Figura 3. Permiso para ver los contactos.
Figura 4. Acceder al Drive.
Figura 5. Acceder a los documentos.

Y una vez permitido estas cosas, debes terminar de aceptarlo (ver la figura 6 en la está el resumen de los permisos que le darás a la aplicación).

Figura 6. Confirmación final de los permisos.

Después de pulsar en Permitir, el navegador te mostrará un mensaje de que puedes cerrar la página.

Estos permisos no te los volverá a pedir para usar esta aplicación. Y por tanto, siempre accederá a la cuenta de GMail que has indicado.

Si quieres usar otra cuenta diferente, borra la carpeta esa que te comenté antes (o el fichero que contiene) y eso hará que te vuelva a mostrar todas estas pantallas.

Antes de seguir, espera un poco que me estoy meando de la risa… ¡ay!

Es que te dije que definí la variable peopleService (y las otras dos) a nivel de clase para no tener que usarla como argumento a un método y voy y pongo como argumento el valor de esa variable compartida… en fin… la cabeza del Guille…

Bueno, ya.

Sigamos con el código que accede a los contactos.

private static int total = 0;

static void GetPeople(PeopleService service, string pageToken)
{
    // Define parameters of request.
    PeopleResource.ConnectionsResource.ListRequest peopleRequest =
            service.People.Connections.List("people/me");

    //
    // Lista de campos a usar en RequestMaskIncludeField:
    // https://developers.google.com/people/api/rest/v1/people/get
    //

    peopleRequest.RequestMaskIncludeField = new List<string>()
            {"person.names", "person.phoneNumbers", "person.emailAddresses",
              "person.birthdays", "person.Addresses"
            };


    if (pageToken != null)
    {
        peopleRequest.PageToken = pageToken;
    }

    ListConnectionsResponse people = peopleRequest.Execute();

    if (people != null && people.Connections != null && people.Connections.Count > 0)
    {
        total += people.Connections.Count;
        foreach (var person in people.Connections)
        {
            Console.Write(person.Names != null ? ($"{person.Names.FirstOrDefault().DisplayName} - ") : "");
            Console.Write(person.PhoneNumbers != null ? ($"{person.PhoneNumbers.FirstOrDefault().Value} - ") : "");
            Console.Write(person.EmailAddresses != null ? ($"{person.EmailAddresses.FirstOrDefault().Value} - ") : "");
            Console.Write(person.Addresses != null ? ($"{person.Addresses.FirstOrDefault()?.City} - ") : "");
            if (person.Birthdays != null)
            {
                var fecha = "";
                var b = person.Birthdays.FirstOrDefault()?.Date;
                if (b != null)
                    fecha = $"{b.Day}/{b.Month}/{b.Year}";
                Console.Write($"{fecha}");
            }
            Console.WriteLine();
        }

        if (people.NextPageToken != null)
        {
            Console.WriteLine();
            Console.WriteLine($"{total} contactos mostrados hasta ahora. Pulsa una tecla para seguir mostrando contactos.");
            Console.WriteLine();
            Console.ReadKey();

            GetPeople(service, people.NextPageToken);
        }
    }
    else
    {
        Console.WriteLine("No se han encontrado contactos.");
        return;
    }
}
Private Shared total As Integer = 0

Private Shared Sub GetPeople(service As PeopleService, pageToken As String)

    Dim peopleRequest As PeopleResource.ConnectionsResource.ListRequest =
        service.People.Connections.List("people/me")

    peopleRequest.RequestMaskIncludeField = New List(Of String)() From {
            "person.names",
            "person.phoneNumbers",
            "person.emailAddresses",
            "person.birthdays",
            "person.Addresses"
        }

    If pageToken IsNot Nothing Then
        peopleRequest.PageToken = pageToken
    End If

    Dim people As ListConnectionsResponse = peopleRequest.Execute()

    If people IsNot Nothing AndAlso
            people.Connections IsNot Nothing AndAlso
            people.Connections.Count > 0 Then
        total += people.Connections.Count

        For Each person In people.Connections
            Console.Write(If(person.Names IsNot Nothing,
                          ($"{person.Names.FirstOrDefault().DisplayName} - "), ""))
            Console.Write(If(person.PhoneNumbers IsNot Nothing,
                          ($"{person.PhoneNumbers.FirstOrDefault().Value} - "), ""))
            Console.Write(If(person.EmailAddresses IsNot Nothing,
                          ($"{person.EmailAddresses.FirstOrDefault().Value} - "), ""))
            Console.Write(If(person.Addresses IsNot Nothing,
                          ($"{person.Addresses.FirstOrDefault()?.City} - "), ""))

            If person.Birthdays IsNot Nothing Then
                Dim fecha = ""
                Dim b = person.Birthdays.FirstOrDefault()?.Date
                If b IsNot Nothing Then fecha = $"{b.Day}/{b.Month}/{b.Year}"
                Console.Write($"{fecha}")
            End If

            Console.WriteLine()
        Next

        If people.NextPageToken IsNot Nothing Then
            Console.WriteLine()
            Console.WriteLine($"{total} contactos mostrados hasta ahora. " &
                              "Pulsa una tecla para seguir mostrando contactos.")
            Console.WriteLine()
            Console.ReadKey()
            GetPeople(service, people.NextPageToken)
        End If
    Else
        Console.WriteLine("No se han encontrado contactos.")
        Return
    End If
End Sub

El valor de peopleRequest debe ser siempre people/me o bien si te sabes el ID de otro usuario lo podrías indicar en lugar de «me«. Ese me significa que accedes a tus contactos.
He buscado por todas partes, y no he averiguado como saber ese famoso ID, ni siquiera de una de mis cuentas para poder saber si se puede acceder a la cuenta de alguien que no seas tú.
Cuando lo averigüe te lo cuento.

Los valores asigndos a la lista RequestMaskIncludeField serán a los datos que queremos acceder y siempre deben empezar con person. seguido del campo al que queremos acceder. En este ejemplo estamos indicando que queremos acceder a: los nombres, teléfonos, emails, cumpleaños y domicilios.

Y como esos valores pueden ser nulos (y normalmente son una colección de valores), comprobamos si es nulo y en el caso de las colecciones accedemos al primero o al predeterminado, si hay algo lo mostramos y si no, se usa una cadena vacía.

Con el valor de Birtdays debemos hacer una comprobación más elaborada e incluso te recomendaría que usaras un try/catch si quieres acceder a los valores de la fecha, porque de las pruebas que he heco, en un caso me dio error al querer acceder al año… se ve que el contacto ese no quería dar su año de nacimiento y dio error al querer convertirlo a entero… en fin…

El NextPageToken nos indica que hay más págins de datos, así que… si las hay volvemos a llamar a este método y seguimos mostrando los contactos que falten por acceder.

Y esto es todo lo que hay que hacer para mostrar los contactos usando People API. Otra cosa es que quieras crear contactos o modificarlos, en esos casos tendrás que modificar el valor del Scope de los contatos.
Si hago pruebas de crear o modificar te los pondré por aquí.

Para terminar, la captura del programa en funcionamiento. Ver la figura 7.

Figura 7. La cuenta que he usado para acceder a los contactos, ¡no tiene contactos!

Pues la sorpresa que me llevé… pensé que lo mismo fallaba algo, así que… me fui a google, creé un contacto y volvía a probar… ¡Esta vez sí que sí! (ver la figira 8).

Figura 8. Un contacto tengo en la cuenta que he usado para esta prueba.

Y esto es todo por ahora.

Ahora a esperar a la siguiente entrega.

Este código está publicado en GitHub: Tutorial-APIs-Google.

Nos vemos.
Guillermo

P.S.
Versión en inglés / English version.

Tutorial Google APIs – Crear Proyecto en Google Cloud

Aquí tienes la primera entrega del tutorial sobre el uso de las APIs de Google para acceder a Drive, Contactos y Documentos.

Si quieres crer una cuenta y un proyecto para poder acceder a esos APIs de Google, lo primero es acceder a Google Cloud Platform y crear una cuenta, o mejor dicho, activarla con Google Cloud.

Una vez que tengas la cuenta, tendrás que crear un proyecto y configurarlo para que pueda acceder a esas APIs.

En este tutorial te explico paso a paso cómo hacerlo, y con un montón de capturas para que no te líes y yo no me olvide de contarte los paso, que todo hay que decirlo. 🙂

Nota:
Por ahora te voy dejar las capturas y en otra ocasión, si hace falta, te explico lo que cada captura significa.
Es que quiero pasar a mostrarte el código para acceder al API de People (contactos) que ya lo tengo hecho tanto con C# como con Visual Basic.

Figura 1. Crear un nuevo proyecto

 

Figura 2.

 

Figura 3.

 

Figura 4.

 

Figura 5.

 

Figura 6. En la ficha G Suite están las de Docs API y drive API

 

Figura 7. Tienes que elegir y habilitar una por una.

 

Figura 8.

 

Figura 9. Añadir más librerías (bibliotecas)

 

Figura 10. Elige People API. No elijas Contacts API, que aparte de estar obsoleta, no vale para nada…

 

Figura 11. Esta es la parte más importnte, sin la autorización OAuth no podrás acceder a nada.

 

Figura 12. Siempre debe ser External

 

Figura 13.

 

Figura 14.

 

Figura 15. Añadir las características que tu aplicación usará de cada API que has añadido.

 

Figura 16.

 

Figura 17.

Nota:
Los permisos debes ir probándolos a ver qué error te da, según lo que quieras hacer.
Pero básicamente necesitas acceso de lectura, salvo que quieras modificar un contacto, un documento o algún fichero del Drive.

Figura 18. No te olvides de darle a UPDATE ya que al estar tan abajo en la pantalla emergente ni se ve, y so no le das a Update, no se guardan los cambios.

 

Figura 19.

 

Figura 20.

 

Figura 21. Aquí tienes que añadir los usuarios autorizados para que usen la aplicación. El máximo es 100 y una vez que aades uno, ya no lo puedes eliminar.

 

Figura 22.

 

Figura 23. Los tipos de credenciales que crearemos

 

Figura 24.

 

Figura 25. Estas so las APIs que usaremos con este proyecto.

 

Figura 26. El tipo de aplicación que vamos a crear.

 

Figura 27.

 

Figura 28. Estas son las dos claves que necesitarás en tu código

 

Figura 29.

 

Figura 30.

 

Figura 31. Si no hs copiado las credenciales de acceso, descarga el fichero .json y ahí las tienes.

 

 

Pues esto es todo lo que debes saber para crear un proyecto.
En la siguiente entrega voy a mostrarte el código de una aplicación de consola para acceder a los contactos (People API). Sí, en C# y en VB.

 

 

Nos vemos.
Guillermo

¿Te gustaría obtener más prestaciones de gsNotasNET?

Pues eso… estoy pensando darle al programa más opciones para indicar dónde se guardarán las notas, actualmente se guardan en un fichero de texto en la carpeta documentos del usuario activo. Con lo cual no estarían esas notas disponibles en otro equipo distinto del que se usó para crearlas. Salvo que copies ese fichero y te lo lleves contigo… pero eso, creo que está demostrado que no es muy fiable, sobre todo para gente como yo que, en mi caso, soy más despistado que… en fin… que seguro que me cargaría alguna nota por olvidarme de actualizar el fichero en alguno de los ordenadores a los que me lo llevara… y según la ley de San Murphy, seguro que la nota que perdería sería la que más me interesaría mantener… ¿A ti también te ha pasado? pues ya sabes… sigue leyendo 😉

Guardar las notas en la nube (un sitio de Internet)

Te decía que estoy barajando la posibilidad de almacenar las notas «en la nube», concretamente en el Drive de Google, pero en tu Drive, no en el mío… bueno, mis notas estarían en el Drive de mi cuenta de gmail, las tuyas en el Drive de tu cuenta de gmail y las de Pepito, en el Drive de la cuenta de gmail de Pepito, y así sucesivamente.

El problema de esta opción es que solo tengo disponibles uns 90 cuentas que asignar, es decir, 90 usuarios podrían beneficiarse de esa opción de guardar las notas en Google Drive.

Seguramente nio habrá tantas peticiones, pero… nunca se sabe…jajaja.

¿Por qué 90 usuarios?

Porque para cada aplicación (o proyecto) que se crea en la nube de Google (Google Cloud Platform) te da la opción de permitir hasta 100 usuarios, y de esos 100 yo me reservo al menos 10, por si se lo ofrezco a algunos de los currantes de la empresa de los kayak en la que trabajo actualmente (Maro – Kayak Nerja).

¿Por qué hay que configurar una cuenta?

Porque si un usuario (cuenta de gmail) no está registrado en el proyecto, no podrá usar su cuenta de correo para acceder al Drive.

El mensaje de error es el mostrado en la figura 1.

Figura 1. Error al intentar acceder con una cuenta de gmail no configurada.

Nota:
Repito lo de «cuenta de GMAIL» porque solo se pueden usar cuentas de gmail, al menos a mi no me ha dejado definir otra cuenta de otro servidor, por ejemplo Outlook.com.

Otras opciones para tener las notas en la nube

Otra opción sería crear una base de datos en el hosting donde tengo mis sitios alojados y sería menos problemático, ya que ahí no habría límite de usuarios, pero… no me mola esa opción.

¿Por qué en documentos de Google Drive?

La idea era hacerlo con las notas de Google, (Keep) pero para esa aplicación no existen APIs con las que se puedan acceder, así que… me decidí por usar los documentos, ya que, al menos para mi, es más cómo de leer, imprimir, etc.

¿Y de la privacidad qué?

Si no te animas porque yo vaya a fisgonear en tus documentos o en tu Drive, no te preocupes que aunque tenga acceso para muchas cosas (tengo que poder crear y eliminar ficheros y carpetas en Drive), no haré nada que no sea solo para gestionar las notas, además de que todo lo que se guarde o se elimine, si esa opción la marcas cuando esté listo todo esto, solo lo hará en la carpeta gsNotas que se creará en Drive, y dentro de esa carpeta habrá una carpeta por cada grupo de notas que vayas creando.

Lo de poner como opcional el que se borren las notas sustituidas es porque cada vez que se crea un documento en Drive, aunque ya exista el mismo nombre del documento, se mantienen copias independientes, de esa forma puedes tener una especie de copia de seguridad de cada nota. Así que… si no quieres que haya muchos ficheros repetidos, podrás marcarla opción de borrar la nota antes de guardar o no… pero, como siempre, eso será cosa tuya 😉

Volviendo a la petición de guardar las notas en la nube…

Así que… si quieres que te incluya en la lista, escribe por aquí (en los comentarios) que estás interesado en que ta añada a los que pueden guardar las notas en Google Drive.

En el comentario no es necesario que indiques tu cuenta de correo, ya que para poder escribir un comentario tienes que indicar tu cuenta de correo (aunque no se muestra), así que… m´s fácil imposible… eso sí, en la cuenta de correo que uses para escribir el comentario/petición debes usar una cuenta de gmail que sea tuya (que tú tengas acceso).

Si, de casualidad, hubiese más de las 90 peticiones, ya me las ingeniaré para poder tener otras 100 más… aunque creo que sin pagar (yo a Google) no se podrá hacer. 😉

Ah, y esto no te va a costar nada… ni siquiera te voy a pedir que hagas un donativo con PayPal… ¡anda! ya l,lo he dicho… jajajaja pero no es obligatoriuom, aunque no estaría mal, que hasta el mes de junio o julio no tengo trabajo con lo de los kayak/piraguas 😉

Y esto es todo… si no sabes de qué va esto de gsNotasNET, sigue estos enlaces:
La página de gsNotas en elguillemola.com, el código fuente de gsNotasNET en GitHub.

Gracias.

Nos vemos.
Guillermo

Quitar la cal del hervidor con vinagre

Pues eso, que a pesar de que uso un filtro descalificador para el agua que caliento con el hervidor de agua, pues… (no sé lo digas a nadie pero es que algunas veces apuro el filtro más de la cuenta y… para lo que pasa jeje)

La cuestión es que hace un momento he buscado en Google con el móvil «descalcificar el hervidor de agua» y solo me ha salido un resultado y es el que he usado, pero como tiene mucha publicidad, pues… si te lo explico son tanta publicidad:

Usa vinagre blanco (yo he usado vinagre de vino blanco, que es a lo que supongo que se refiere… y después de dejarlo hervir (cubriendo toda la resistencia) se ha quedado limpio… 😉

Eso sí, huele fatal y no conviene estar cerca del valle que suelta el vinagre.

Después lo enjuagas, yo he echado agua y la he puesto a hervir… y cómo sigue oliendo a vinagre, he quitado ese agua y he puesto más agua con un chorreoncito de limón…

Después de hervir el agua con el chorreoncito de limón sigue oliendo a vinagre, pero menos… así que… tendrás que enjuagarlo varias veces… 🙂

Espero que te sirva.

Nos vemos.

Guillermo

Pon un Android (o mejor no) en tu Windows

 

Pues sí, como lo lees… un señor (o señores) de China (SocketeQ) han creado una versión de android que funciona "nativamente" en Windows Vista / 7 / 8. Ese invento se llama Windroy (en otros sitios también lo nombran como WindowsAndroid, ahora te comento sobre el tema).

Según el autor (socketeQ) Windroy permite funcionar Android en Windows sin usar ningún emulador, ya que utiliza el kernel de Windows.

El autor indica que es imprescindible que el Windows en el que se quiera ejecutar Windroy tenga gráficos OpenGL 2.0 (con versiones anteriores se ve que no funciona). Además de recomendar que el directorio de instalación sea el predeterminado (C:\Windroy) o bien que no incluya espacios en el nombre.

Si quieres saber un par de cosillas, puedes consultar el PDF que está en la sección "document" del sitio de socketq.com). Desde ahí también puedes realizar la descarga del ejecutable/instalador: windroy_20130724.exe (es la versión que he probado al escribir esto). Te aviso que el Windows no dejará que lo instales o al menos te indicará que no lo hagas, idem de lo mismo el IE para descargarlo, se empeñará en que no lo descargues, así que… tendrás que lidiar con las advertencias, avisos y demás. Yo lo he instalado, descargándolo directamente del sitio del autor y no he tenido problemas (al menos visibles o notorios… ¡tocaré madera!).

 

Nota:
El ejecutable también te lo puedes descargar desde la página de g+ de SocketeQ.

 

Android iniciando
Figura 1. Android funcionando en Windows

 

WindowsAndroid vs Windroy

Como te decía arriba, existe otra versión llamada WindowsAndroid, que en la página de la que me lo he descargado se llama como la versión de Android que utiliza: WindowsAndroid 4.0.3.

Este último es igual al primero, no sé si en realidad es la misma "build" o no… (yo me fio más de la versión que hay en la página del autor, el Windroy).
La diferencia entre los dos es que el Windroy se ejecuta a pantalla completa y el WindowsAndroid se ejecuta en una ventana (las capturas las he usado de este segundo, con idea de que no sean capturas demasiado grandes).

El WindowsAndroid 4.0.3 me lo he descargado de: http://descargar.mp3.es/lv/software/download/kl670944.htm
pero debo advertirte que lo que te bajas de ahí es un instalador que TODO lo que te ofrece es basura (al menos para mí), ya que intenta instalarte barras de navegación, cambiar el buscador del navegador y otras chorradillas de esas que después te hacen la vida imposible, así que… NO ACEPTES NADA DE LO QUE TE OFREZCA EL INSTALADOR, dale a CANCELAR a todo lo que te pida que ACEPTES como si fuese algo obligatorio para descargar, NO ACEPTES NADA… salvo que quieras tener tu equipo/navegador lleno de basura y cosas inútiles.
Avisado quedas.

Ese enlace, lo encontré al ver las opciones de android para Windows, te dejo aquí el enlace, pero recuerda que las descargas esas tienen publicidad y cosas que seguramente no necesites nunca. Te vuelvo a avisar porque después vienen las quejas, y yo no quiero queja ninguna, todo lo que hagas con todo esto que te explico aquí es bajo tu responsabilidad. ¿Vale? Pues eso.
5 Herramientas para emular Android en PC.

 

Si quieres descargarte esa versión sin extras, puedes bajarte el instalador que he subido a mi "nube de copy.com", este es el enlace: 230254-670944-windowsandroid.exe y este es el MD5 del fichero: D3EA9D70B2A374D4B5D3F0123AC9F87B, el cual ocupa 64.8 MB.
Este enlace es al fichero de texto con el valor de MD5 y tamaño del ejecutable.

 

Nota:
También he subido al copy.com el ejecutable windroy_20130724.exe y el checksum MD5 es: 917CF2FA0EDBA470538363C32C7D74D0 y ocupa 81.8 MB.
Este enlace es para el fichero de texto con los datos del ejecutable y el MD5.

No sé si dejaré el ejecutable allí durante mucho tiempo o lo borraré o qué haré, ya que, como te digo en realidad el WindowsAndroid casca más que el otro, y por tanto te recomiendo que uses el Windroy.

 

Añadir aplicaciones de Google

Según comenta, Google no reconoce este "dispositivo" de Android y por tanto no puede distribuir las aplicaciones típicas de Google, pero como decían en otra de las páginas que he visitado sobre esto del Android para Windows ¿qué es Android sin las aplicaciones de Google?

Para tener las aplicaciones de Google en el Android para Windows, lo he probado en los dos y funcionan igual… o al menos ahí están las aplicaciones, ya que en el WindowsAndroid casi ni he podido probar nada.

Consiste en bajarte un fichero llamado gapps-ics-20120429-signed.zip el cual te puedes bajar de la página de Google Apps (GApps) y busca los ficheros de la versión 4.0.x, concretamente el que tiene el número (o fecha) 20120429 (el enlace de arriba te descargará el zip).

Extrae el contenido del zip y copia la carpeta system y la pegas en el directorio windroy_root (o el que sea, según lo que instales), aceptando todo, ya que en ese directorio también hay una carpeta system con subcarpetas que seguramente también existen en ambos sitios.

 

Si estás usando el Windroy, utiliza el enlace que estará en el escritorio (si así lo has indicado al instalar, si no, busca el ejecutable (android.exe) en la carpeta windroy_root. En esa misma carpeta hay otro ejecutable que el autor recomienda usar si se produce algún error (que se producirá) y se llama: android-stop.exe.

 

En la figuras 2 y 3 puedes ver las aplicaciones que tenía antes de agregar las de Google y las que tenía después, en este caso es el WindowsAndroid. En la figura 4 tienes las de Windroy después de aplicar las modificaciones.

 

Android antes
Figura 2. Las aplicaciones que incluye WindowsAndroid

 

Android después
Figura 3. WindowsAndroid con las aplicaciones de Google

 

Android después 2
Figura 4. Windroy con las aplicaciones de Google

 

Las versiones

Comentarte que el ejecutable de WindowsAndroid es una build del 18 de diciembre de 2012 (según el about) y el Windroy es del 23 de julio de este año 2013, tal como puedes ver en las capturas mostradas en las imágenes 5 y 6.

En cualquier caso, la versión de Android es la misma: 4.0.3

 

Android acerca 1
Figura 5. El acerca de WindowsAndroid

 

Android acerca 2
Figura 6. El acerca de de Windroy

 

Y esto es todo, ya que poco más puedo añadir… salvo que peta muchísimo, sobre todo el WindowsAndroid (la otra también, pero bueno), ya que debes tener en cuenta que en realidad ni son betas… así que… esto es lo que hay y que sepas, que no "recuerda" todas las configuraciones que hagas, pero… al menos te da para que trastees un poco e incluso para instalar cosas y demás…

 

Resumiendo

He probado pocas cosas, pero al menos el navegador, funciona bien, he entrado en la tienda de Google y he mirado cosillas, pero al intentar descargar el Kindle para Android (usando el navegador) y después de elegir el dispositivo en el que quiero instalarlo (ver la figura 7), me ha indicado que ya se descargara en el dispositivo.

 

android kindle 1
Figura 7. Instalar el Kindle desde la web en el dispositivo indicado

 

Y así ha sido, la descarga ha empezado… (ver figura 8) pero nunca ha terminado y mientras tanto algún que otro cuelgue…

android kindle 2
Figura 8. Instalando el Kindle en el dispositivo (la hora era UTC, es decir yo tenía las 19.30)

 

No sé si es que Internet anda regular hoy por aquí o qué… pero no he vuelto a probar y no he sido capaz de descargarlo… y mira que todo este "tinglado" ha sido para descargar el Kindle en un Android. Es que mi móvil Samsung lo tengo prestado y por tanto no podía probarlo, así que… me busqué esto en la red…

 

 

Nos vemos.
Guillermo

P.S. 02.32
Después de publicar esto (y después de una reinstalación) he probado nuevamente a descargar el Kindle, pero en esta ocasión me decía que no reconocía o que no era compatible con el otro dispositivo. Lo mostraba, pero deshabilitado, así que… se ve que han hecho algo esta gente de Google en esta tarde… eso, o que es casualidad y ya no funciona… No sé, yo ya he desinstalado todo y "paso" un poco del tema… al menos por ahora, que ya es tarde… jejeje

como Google no me deja usar su calendario en Windows 8, ahora uso el de outlook.com en el iPhone

 

Pues eso… que hace unas semanas (no recuerdo cuántas) la gente de Google dejó de usar un servicio (no recuerdo el nombre de ese servicio, pero seguro que sabes cuál es) por medio del cuál podíamos tener los contactos, calendario, etc. accesibles desde las aplicaciones del Inicio de Windows 8 (Modern UI / Windows Store).

Desde que tuve mi Samsung Galaxy S (con android) yo suelo usar en los móviles los contactos y el calendario de Google/GMail, de esa forma me despreocupo de ir sincronizando los contactos, etc. (que era lo que hacía antes con unos programas que los móviles incluían y que no siempre funcionaba bien).

En el equipo "de mesa" (aunque sea un portátil/laptop) el calendario que usaba era el de la aplicación Outlook y en los móviles usaba una copia de los contactos de esa misma aplicación de Outlook, pero desde que me pasé a android (y por comodidad, ya que el programa Keys de Samsung fallaba más que una escopeta de feria), empecé a acostumbrarme a usar los contactos de Google y como además el calendario del móvil estaba también sincronizado con el de mi cuenta de gmail.com, pues… ¡menos follón! y sobre todo para uno que es así como una mijilla despistao, es decir: yo.

Desde que instalé el Windows 8 en mi equipo habitual (en septiembre de 2012) y viendo que podía tener los contactos y el calendario de Google en las aplicaciones de Windows, empecé a usarlas de forma más habitual, sobre todo el calendario, aunque los contactos (o People que dice mi Windows 8) los usaba menos, hasta que los "ligué" con las cuentas de Facebook y Twitter, de forma que pudiera ver qué se contaban "mis contactos", aunque la verdad es que tampoco lo utilizo mucho, pero bueno… ahí están esos contactos y en algunos de ellos lo que me cuentan o favoritean.

Lo bueno de esto era que al modificar el calendario en el móvil, en el portátil o en la web podía tener esa información actualizada al momento, pero vienen los de Google y dicen que hasta aquí hemos llegado… y… pues… ¡adiós calendario de Google! adiós, pero de mi Windows 8, ya que en el móvil (actualmente un iPhone 4 que me regaló mi hijo Guille) si que seguía (y sigue) funcionando.

Así que… hoy me ha dado por ver cómo configurar el iPhone para añadir una cuenta de outlook.com (antes hotmail.com) y he configurado el móvil para que utilice el calendario de mi cuenta de outlook.com y así poder tenerlo "sintonizado" tanto en el móvil como en el Windows 8.

 

Y ya está, esto es lo que quería contarte 😉

 

Nos vemos.
Guillermo

P.S.
Aunque el título suena a "rabieta" en realidad no lo es… es sólo intentar ser práctico…

 

P.S. 2

Google Sync se llama el servicio de Google, que en realidad trabaja usando Exchange ActiveSync de Microsoft y aquí puedes leer más: ¿Qué es Google Sync? (gracias Palel por decirme más o menos cómo se llama el servicio ese y la aclaración de que no es que ya no lo soporte, si no que sólo lo soporta a clientes de pago)