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>.