lunedì 30 giugno 2014

Como obtener las Aplicaciones instaladas en nuestro dispositivo Android

PackageManager y PackageInfo


A veces necesitamos recoger informaciones sobre las aplicaciones instaladas en nuestros dispositivos Android, y podemos conseguir esto a través de dos clases de Android llamadas PackageManager y PackageInfo.

PackageManager
La clase PackageManager nos permite de obtener informaciones sobre las aplicaciones que tenemos instaladas en nuestro dispositivo.
Es una clase que obtenemos desde el método getPackageManager(), como veremos luego en su utilizo.

PackageInfo
La clase PackageInfo nos permite de obtener informaciones detalladas sobre el contenido de un package de una Aplicación.

Simplemente, con la clase PackageManager  recogemos las informaciones sobre las aplicaciones instaladas en nuestro dispositivo, y por cada aplicación a través de la clase PackageInfo podemos recoger informaciones detalladas.




Código Explicado



Vamos a ver como utilizar estas dos clases para obtener informaciones sobre las aplicaciones instaladas.

Primero, tendremos que crear y obtener el PackageManager

PackageManager pm = getPackageManager();

Una vez obtenido, podemos obtener entre todas las informaciones las aplicaciones instaladas en nuestro dispositivo, a través del método getInstalledApplications(flags).
Este método pide en ingreso un set de flags para saber que informaciones recopilar al momento de ejecución,
Podemos utilizar como flag cualquiera combinación de  GET_META_DATA, GET_SHARED_LIBRARY_FILES, GET_UNINSTALLED_PACKAGES para modificar los resultados.

int flags = PackageManager.GET_META_DATA |
                PackageManager.GET_SHARED_LIBRARY_FILES |
                PackageManager.GET_UNINSTALLED_PACKAGES;
final List<ApplicationInfo> installed_packages = pm.getInstalledApplications(flags);

Una vez obtenidos en installed_packages todas las aplicaciones instaladas, podemos analizar cada aplicación utilizando la clase PackageInfo.

PackageInfo appInfo = installed_packages[0];
PackageInfo pkgInfo = pm.getPackageInfo(
                                                appInfo.packageName,
                                                PackageManager.GET_PERMISSIONS);

Ahora, por cada elemento del array installed_packages podemos llamar el método getPackageInfo(packageName, flags) y obtener, a según del flag que ponemos, informaciones sobre el package de una aplicación.
Obtenemos aqui en el ejemplo los permisos que esta aplicación utiliza

PackageInfo pkgInfo = pm.getPackageInfo(
                                                appInfo.packageName,
                                                PackageManager.GET_PERMISSIONS);
String[] requested_permission = pkgInfo.requestedPermissions; 

Ahora, en requested_permission tenemos todos los permisos que nuestra aplicación appInfo utiliza.






Ejemplo de utilizo


Ponemos aqui el código que necesitamos para obtener en dos arrays, dangerousApp para informaciones sobre todas las aplicaciones instaladas y appNameList, que es un array de String con todos los nombres de las Aplicaciones instaladas.

Ademas, incluyéremos un filtro para incluir solo las aplicaciones instalada desde el usuario, y no las aplicaciones de sistema.


// Definitions
PackageManager pm = getPackageManager();
// Retrieve all the application installed
int flags = PackageManager.GET_META_DATA |
                PackageManager.GET_SHARED_LIBRARY_FILES |
                PackageManager.GET_UNINSTALLED_PACKAGES;
final List<ApplicationInfo> installed_packages = pm.getInstalledApplications(flags);
// Filter all application selecting only application installed by user
for (ApplicationInfo appInfo : installed_packages) {
    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
           // Check if possess a dangerous permission
           try {
                  PackageInfo pkgInfo = pm.getPackageInfo(appInfo.packageName,    
                                                                PackageManager.GET_PERMISSIONS);
                  String[] requested_permission = pkgInfo.requestedPermissions;
                  if (dangerous_permission(requested_permission)) {
                      // Found an application with dangerous permission
                      dangerousApps.add(appInfo);
                      appNameList.add(appInfo.loadLabel(pm).toString());    
                  }
             } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
       }
}


Bibliografia


http://developer.android.com/reference/android/content/pm/PackageManager.html
http://developer.android.com/reference/android/content/pm/PackageInfo.html







lunedì 23 giugno 2014

Permisos de Android

En este documento propongo un resumen de los permisos que pueden crear problemas de seguridad en aplicaciones.

Como utilizar este listado


Una aplicación que utiliza uno o mas de los permisos aquí listados no significa que es una aplicación peligrosa, la utilidad de esta lista es de explicar en términos simples lo que un cierto permiso de Android hace.
Una vez entendido lo que un permiso hace, el usuario por su cuenta deberá averiguar si esto permiso es normal en la aplicación que lo utiliza.


Ejemplo
Una calculadora que necesita el permiso de leer nuestros contactos y de enviar SMS no es una aplicación muy fiable, porque una calculadora para dedicarse a lo que quiere hacer (calcular) no necesita el permiso de mirar a los contactos de un movil, ni de enviar SMS.

Este listado ha sido creado para ser utilizado en conjunto con una aplicación que estoy desarrollando, llamada Permission Analyzer.
Esta aplicación nos permite de analizar las aplicaciones que hemos instalado en nuestro dispositivo, y listará todas las aplicaciones que utilizan permisos que encontramos en este listado, para que sea mas fácil por nuestra parte de averiguar si una aplicación es fiable o menos.

Download
https://github.com/IvanoAlvino/PermissionAnalyzer



Permisos

INTERNET

Permite a las aplicaciones que lo utilizan de acceder a Internet.
Un permiso como esto es normal encontrarlo en aplicaciones que necesitan descargar datos, enseñar informaciones que recogen en internet o actualizar un social network como Facebook o Twitter.

   Aplicaciones famosas       
Google Search
Google Maps     
Facebook                           
Whatsapp    
Gmail                                  
Chrome 
Dolphin    



AUTHENTICATE_ACCOUNTS

El permiso de AUTHENTICATE_ACCOUNTS es uno de los permisos mas poderosos que una aplicación puede utilizar. Este permiso permite a una aplicación de acceder o modificar la contraseña de un account, crear nuevos accounts y en general modificar cualquiera información de nuestros accounts.
Este permiso es normal en aplicaciones de social networks como por ejemplo Facebook o Twitter o Google Plus.

   Aplicaciones famosas       
Whatsapp
Facebook    
Dropbox                          
Google Play Service

READ_CALL_LOG

Permite a una aplicación de acceder a las informaciones de la llamadas en entrada y en salida de nuestro móvil. 
Aplicaciones que normalmente utilizan este permiso son aplicaciones de llamadas, como la aplicaciones que sale por defecto ya instalada en cada móvil para efectuar llamadas.

   Aplicaciones famosas       
Facebook                           
Google Play Service

READ_LOGS

Permite a una aplicación de acceder a los ficheros de logs de bajo nivel del dispositivo.
Es un permiso que normalmente no es utilizado por aplicaciones de tercer parte, ya que los ficheros de logs de bajo nivel incluyen importantes informaciones sobre el usuario.

   Aplicaciones famosas       
Google Play Service
Dolphin Browser

READ_CONTACTS

Permite a una aplicación de acceder a los contactos de un usuario.
Es un permiso tipico de aplicaciones de mensajes como por ejemplo el Whatsapp, Handycent y la aplicación de mensajes que sale por defecto en un móvil Android.

   Aplicaciones famosas       
Google Search
Google Maps     
Facebook                           
Whatsapp    
Gmail                                  
Google Play Service 
Dropbox

WRITE_SECURE_SETTINGS

Permite a una aplicacion de escribir o leer los ajustes de seguridad de sistema.
Es un permiso que normalmente no utilizan las aplicaciones de tercer parte.



PROCESS_OUTGOING_CALLS

Permite a una aplicación de leer el numero que estamos llamando en salida y de redireccionar una llamada en salida a otro numero.
También permite de abortar una llamada en salida.


SEND_SMS

Permite a una aplicación de enviar mensajes de texto.
Es un permiso normalmente utilizado en aplicaciones de mensajes como por ejemplo Handycent o la aplicación que sale instalada por defecto en los móviles para enviar mensajes.

   Aplicaciones famosas       
Google Search              
Whatsapp    

READ_SOCIAL_STREAM

Permite a una aplicación de leer y acceder a las informaciones social.
Normalmente utilizada por aplicaciones de social como Facebook o Twitter.

   Aplicaciones famosas       
Google Play Service












Android Localizer: cómo conseguir traducir tu aplicación Android

Suportar diferentes idiomas



La mejor forma para tratar el texto en nuestras aplicaciones es de destacar el mismo texto y el código JAVA, utilizando la carpeta 'resource' de nuestro proyecto Android.

Entrando mas en los detalles, tendremos una carpeta res/ an la root de nuestro proyecto, y adentro de esta carpeta tenemos varias subcarpetas, cada una para un particular set de recursos que nuestra aplicación utiliza.
Por ejemplo, tendremos nuestro fichero res/values/strings.xml que contiene todo el texto de nuestra aplicación.
Utilizar esta forma modular de tratar el texto nos permite disfrutar de algunos mecanismos de Android para traducir nuestras aplicaciones en varios idiomas.


Creación de carpetas locales y de ficheros de Cadena de Caracteres


La idea a la base de la traducción de nuestras aplicaciones es de crear otras carpetas values adicionales adentro de la carpeta res/ que incluyen en el nombre el código ISO del idioma que queremos implementar. Por ejemplo, values-es/ es el nombre de la carpeta que tendremos que crear para traducir nuestra aplicación en español (código ISO de idioma "es" ).
Android cargará los recursos apropiados basandose sobre los ajustes del dispositivo en el cual nuestra aplicación vendrá ejecutada, es decir, en un dispositivo con idioma Español Android buscará una carpeta con el código ISO "es" y, si la encuentra, utilizará lo que esta adentro de esta carpeta como fichero de recurso.

Una vez que hemos decidido que idioma queremos soportar, creamos las carpetas donde pondremos las cadenas de caracteres












Una vez creadas las carpetas, tendremos que modificar cada fichero strings.xml de forma apropiada, traduciendo cada cadena de caracteres en el idioma elegido.
Por ejemplo, aqui tenemos

English, default values /values/strings.xml







Español,  /values/strings.xml








Una vez que la aplicación viene instalada y ejecutada en un dispositivo,  android basandose sobre los ajustes globales utilizará el fichero de cadenas de caracteres apropiadas, eligiendo entre los disponibles.
Si un idioma no esta implementado en la aplicación, Android elegirá los valores de default (típicamente esto es el ingles).



Utilizar las cadenas de caracteres 


Podemos referenciar nuestras cadenas de caracteres en nuestro código a traves de dos formas, utilizando el código JAVA o el código XML.

En el código JAVA
Podemos referenciar una cadena de carácter con la orden R.string.<nombre_cadena>.
Hay algunos métodos que aceptan una cadena de caracteres en esta forma:










En el codigo XML
Podemos referenciar una stringa en el código XML a través de la orden @string/<nombre_cadena>.








martedì 27 maggio 2014

ANDROID - Utilizar API de Google Maps con Android Studio

Como utilizar Google Maps API in Android Applications

Presentación

Para crear una aplicación que utiliza Google Maps Android API v2 tenemos que:

  1. Descargar y configurar Google Play Services SDK, lo cual incluye Google Maps Android API. 
  2. Obtener una clave de API. Para hacer esto, tendremos que registrar un proyecto en Google APIs Console.
  3. Configurar el application manifest
  4. Añadir una mapa en nuestra aplicación 


1 - Instalar y configurar the Google Play services SDK

Para instalar Google Play services SDK tenemos que:


  1. Ejecutar el SDK Manager
    1. En Android Studio le damos al boton SDK Manager en el toolbar
  2. Instalar el Google Play services SDK.
    1. Desplazamos la pantalla hasta el final de la lista de los paquetes, le damos a Extra, selecionamos Google Play services, y lo instalamos.
      Si estamos utilizando Android Studio, tambien tenemos que instalar Google Repository.
  3.  Instalar una version compatible de Google APIs platform.
    1. Si queremos testar nuestra aplicación utilizando el emulator de Android Studio, tendremos que instalar, a travez del SDK manager, Google APIs desde Android 4.2.2 (API 17) o una versión mas reciente.
      En segundo lugar, tendremos que crear un nuevo AVD ponendo Google APIs como platform target.

Configurar un proyecto que utilize Google Play Services en Android Studio:

1. Abrimos el fichero build.gradle que esta dentro de nuestra aplicación.

2. Añadimos esta linea abajo de dependencies en el build.gradle
compile ‘com.google.android.gms:play-services:4.3.23'
Si estamos utilizando una versión actualizada de Google Play services tenemos que cambiar también el numero de versión 
  en esta linea.
3. Guardamos los cambios que acabamos de hacer y le damos a “Sync Project with Grade files”

4. Abrimos el app manifest y añadimos este tag abajo del elemento <application>
<meta-data  android:name="com.google.android.gms.version" 
;
 android:value="@integer/google_play_services_version" />


2 - Obtener un certificado Android y la clave Google Maps API

Para acceder a los servidores de Google Maps tenemos que añadir una clave de Google Maps API a nuestra aplicación.
Para obtener una clave por nuestra aplicación tenemos que:

1. Obtener la SHA-1 fingerprint de nuestra aplicación 
Para Linux o OS X, abrimos un terminal y damos el comando 

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey  -storepass android -keypass android

Copiamos la SHA-1 (20 numeros hexadecimales)

2. Registramos un proyecto en el Google APIs Console
- Navigamos en un browser a la pagina de Google APIs Console.
- Elegimos “Services” en el menu de izquierda y en la lista que aparece buscamos 
  Google Maps Android API v2.
- Una vez encontrado, cambiamos el indicador en ON

3. Pedimos una clave
- En el menu de izquierda damos a API access
- Despues, tenemos que darle a Create New Android Key
- Ahora introducimos la clave SHA-1 que hemos guardado anteriormente
- Copiamos la clave de Google API que aparece

4. Finalmente tenemos que añadir la clave, que acabamos de obtener, en nuestra aplicación.
En el Android Manifest añadimos el siguiente código abajo de <application>


 <meta-data            android:name="com.google.android.maps.v2.API_KEY"           android:value="API_KEY"/>


3 - Configuramos el Application Manifest

Tenemos que especificar los permisos que nuestra aplicación necesita añadiendo elementos 
<uses-permission> abajo del tag <manifest>
Abrimos el application manifest y añadimos los siguientes permisos que necesitamos para utilizar las API de Google Maps

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/><!-- The following two permissions are not required to use Google Maps Android API v2, but are recommended. --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION"/>



4 - Añadimos una mapa a nuestra aplicación y testamos

Finalmente solo nos falta de añadir una mapa a nuestra aplicación para testar su correcto funcionamiento.
Añadimos este código en el fichero XML de layout de nuestra aplicación

<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android"          android:id="@+id/map"          android:layout_width="match_parent"          android:layout_height="match_parent"          android:name=“com.google.android.gms.maps.MapFragment”/>

Ahora, vamos a modificar el código JAVA en MainActivity.java

package com.example.mapdemo;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Construimos y ejecutamos nuestra aplicación, si hemos seguido todo el tutorial correctamente nos debe salir una mapa!




Referencia