Hi all,

With new versions of Android, the library needs to be adapted to deal with new possibilities JavocSoft Android Toolbox Libraryand requirements. In this case, the new library JavocSoft Android Toolbox version has resources to handle new Android 6+ Permission system. This will allow us to embrace and adapt our applications to Android 6 new permissions usage approach.

Android 6 and Permissions

Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app. If the device is running Android 5.1 (API level 22) or lower, or the app’s targetSdkVersion is 22 or lower, the system asks the user to grant the permissions at install time.

System permissions are divided into two categories, normal and dangerous (more info):

  • Normal permissions do not directly risk the user’s privacy. If your app lists a normal permission in its manifest, the system grants the permission automatically. See the list here.
  • Dangerous permissions can give the app access to the user’s confidential data. If your app lists a normal permission in its manifest, the system grants the permission automatically. If you list a dangerous permission, the user has to explicitly give approval to your app. If an app requests a dangerous permission listed in its manifest, and the app already has another dangerous permission in the same permission group, the system immediately grants the permission without any interaction with the user.

See Google Developer Permissions to know more about it.

Adapt your application

To adapt an application to the new permissions usage approach of Android 6+, the application has to be able to deal with these use cases:

  • Start the App. Ask for permission (showing before a message telling why do you need before ask for them)
    • Accept. Ask for permissions:
      • Accept -> App runs normally with the service that requires the permissions.
      • Not accept -> App runs normally without the service that requires the permissions.
    • Cancel. App runs normally without the service that requires the permissions.
  • With previously granted permissions, start the App:
    • Start the App -> App runs normally with the service that requires the permissions.
  • In a running App with granted permissions:
    • Deny the permissions -> When returning to the App, it Asks for permissions (showing before a message telling why do you need before ask for them):
      • Accept. Ask for permissions:
        • Accept -> App runs normally with the service that requires the permissions.
        • Not accept -> App runs normally without the service that requires the permissions.
      • Cancel. App runs normally without the service that requires the permissions.
  • User denies the permission and marks “Never ask again”
    • Start the App:
      • Show a message to the user about the required permissions (showing before a message telling why do you need before ask for them)
        • Accept. Ask for permissions:
          • Accept -> App runs normally with the service that requires the permissions.
          • Not accept -> App runs normally without the service that requires the permissions.
        • Cancel. App runs normally without the service that requires the permissions.

For devices with Android minor than 6 version, API Level 23, you should be able to open the application normally and use it without prompting for any permission because they are already granted when the application is installed.

 

The library JavocSoft Android Toolbox gives you the method to achieve these point in a relative easy way.

Usage

ToolBox provides methods to check for permissions allowing us to present to the user an informative dialog and also ask to allow them if they are not already granted. ToolBox uses the Android Support Library for backward Android compatibility.

The list of functions to handle permissions are:

  • permission_askFor
  • permission_checkAskPermissionsresult
  • permission_isGranted
  • permission_areGranted

ToolBox also provides a set of permissions packages according with Google permissions group. This makes easy for you to ask for permissions for a service that requires a set of permissions.

  • PERMISSION_CALENDAR
  • PERMISSION_CAMERA
  • PERMISSION_LOCATION
  • PERMISSION_MICROPHONE
  • PERMISSION_PHONE
  • PERMISSION_SENSORS
  • PERMISSION_SMS
  • PERMISSION_STORAGE

Here is an example of usage. In this case we are going to use the localization service.

This service requires two permissions that are not automatically granted (not in Google NORMAL permissions group):

  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION

ToolBox has these two permissions in the PERMISSION_LOCATION set. We will use this set to ask for permission to the user:

<!-- Before use it, we check if the permissions are already granted. -->
if(!ToolBox.permission_areGranted(TheActivity.this, ToolBox.PERMISSION_LOCATION.keySet())) {
    //Permissions not yet granted, we need to be ask.
    ToolBox.permission_askFor(TheActivity.this, ToolBox.PERMISSION_LOCATION,     
            ToolBox.PERMISSIONS_REQUEST_CODE_ASK_LOCATION, 
        getString(R.string.permissions_required_title), 
        getString(R.string.permissions_button_ok),
        getString(R.string.permissions_button_deny),
        getString(R.string.permissions_location_required_text));
}else{
     //Permissions are already granted, continue using the localization service...
 
}

To handle the permissions ask response, we must do the following:

<!-- This method handles the response -->
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    permissionsLocationGranted = checkAskPermissionsresult(requestCode, permissions, grantResults);
    Log.i(Constants.TAG, "Location permissions granted? " + permissionsLocationGranted);
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 
    if(permissionsLocationGranted) {
        //Continue with the usage of the service that needs the permissions...
 
    }else{
        //Do something if required...
    }        
}
 
private boolean checkAskPermissionsresult(int requestCode, String[] permissions, int[] grantResults) {
    boolean res = false;   
    if(requestCode == ToolBox.PERMISSIONS_REQUEST_CODE_ASK_LOCATION) {
            //We could check the permissions in our system
        //res = ToolBox.permission_areGranted(SplashActivity.this, Arrays.asList(permissions));         
            //We check the returned result. Only returns TRUE if all permissions are granted.
        res = ToolBox.permission_checkAskPermissionsresult(permissions, grantResults);
    }
    return res;
}

Have in mind that every time you use a service o function that requires permissions, you should check the current permissions by using:

ToolBox.permission_areGranted(TheActivity.this, ToolBox.PERMISSION_LOCATION.keySet());

To know more about it goto https://github.com/javocsoft/javocsoft-toolbox/wiki#android-6-permissions-handle.

 

Recommended videos about permissions in Android M that you should check:

 

I hope these addition could be useful for your applications.

Do not forget to check the blog to get more updates!

More info and HowTo at https://github.com/javocsoft/javocsoft-toolbox/wiki.

github_icon

As always, library is available on GitHub

javocsoft-toolbox.

Bye.

JavocSoft 2015.

Hi,

In this update I added some assistance classes related with inter-application messaging in Android to JavocSoft Android Toolbox.JavocSoft Android Toolbox Library

Sometimes an application needs to accept messages from other applications, in those cases, a Messenger service must be implemented. See Messenger for more information about messaging. So, to make easier having a messenger service in an application, i have added a base MessengerService.java class to the library. Click here to access to the Messenger Service Wiki.

Here can be seen full example of how to have a valid Messenger Service in your application:

First, create the message incoming handler:

public class MyMessengerIncomingHandler extends MessengerIncomingHandler {

    //Messenger WHAT possible values
    public static final int MSG_EVT_HI = 1000;

    public MyMessengerIncomingHandler(Context context) {
        super(context);
    }

    @Override
    protected void doWork(Message msg) {
        switch (msg.what) {
            case MSG_EVT_HI:
                Log.i(Constants.TAG, "Messenger received: Hi!!");
                break;
            default:
                super.handleMessage(msg);
        }
    }
}

Second, the Messenger Service:

 public class MyMessengerService extends MessengerService {

 @Override
 protected MessengerIncomingHandler getMessageIncomingHandler() {
    return new MyMessengerIncomingHandler(context);
 }

}

And finally, in our AndroidManifest.xml:

<!-- Application messenger -->
<service android:name="es.javocsoft.base.genapp.service.MyMessengerService" 
	 android:enabled="true" android:exported="true" >
   <intent-filter>             
	<action android:name="es.javocsoft.base.genapp.messenger.ACTION_BIND" />
   </intent-filter>
</service>

Because we could need also to connect and send messages to other applications messenger services, I also added a class Mezzenger.java. Click here to access to the Messenger Wiki.

 

Mezzenger messenger = new Mezzenger("Inner", getApplicationContext()); 
messenger.connect("application.package.service.ACTION"); 
messenger.sendMessage(MSG_EVT_HI, 0, 0, null);

 

Do not forget to check the blog to get more updates!

More info and HowTo at https://github.com/javocsoft/javocsoft-toolbox/wiki.

github_icon

As always, library is available on GitHub

javocsoft-toolbox.

Bye.

JavocSoft 2015.

Hace tiempo que pusimos en el store una aplicación llamada “AppVigilant” para poder conocer el detalle de un número corto que pudiera aparecernos en la factura o que necesitásemos consultar su información. La aplicación también permitía darse de baja de un servicio de suscripción si se recibía un mensaje de este tipo. Toda la información fiable dado que se consultaba a la CMT junto con otros servicios como Axesor.

Dicha funcionalidad quedaba reducida a la aplicación “AppVigilant” tan solo. Por ello, decidimos portar esta información, al considerarla útil, de una manera más general y quizás, más accesible. En el sidebar de este blog podeis ahora ver una nueva sección (widget) llamado “Consulta de número corto / PREMIUM“. A partir de ahí ó a través de este enlace podréis consultar la información de un número corto para conocer si se trata de un número de tarificación especial PREMIUM y/ó si es un servicio de suscripción PREMIUM.

El servicio, la web, usa una API sencilla que hemos creado, Shortnumbers API, y que esta accesible para su uso general también.

Para consultar la información de un número corto a través de la API bastaría con realizar un GET a la dirección http://api.shortnumbers.javocsoft.es/api/v1/info/short_number en donde “short_number” deberá ser sustituído por el número corto.

El formato de respuesta es un JSON tal que:

{
  "responseCode": 0,
  "responseText": "Success",
  "data": {
    "shortNumber": "XXXXXX",
    "company": "COMAPNY NAME",
    "tarificationName": "PREMIUM",
    "pricing": "1,2 euros mas IVA",
    "isSubscriptionService": true/false,
    "location": "HTTP MAPS ADDRESS",
    "rznSoc": "COMPANY LEGAL NAME",
    "address": "ADDRESS",
    "city": "CITY",
    "province": "PROVINCE"
  }
}

Como siempre, esperamos que os sea útil el servicio y que os animeis a usar la aplicación si aún no la habeis instalado.

 

Un saludo,

 

1 estrella2 estrellas3 estrellas4 estrellas (No Ratings Yet)
Loading...

Google IO 2015 – GCM 3.0

Google I/O 2015

Para los que aún no hayan visto aún esta edición, la 2015, entre las novedades, referente a GCM (Google Clud Messaging), en su versión 3.0, hay una serie de novedades que merecen ser nombradas:

Para no perderte las novedades, si aún no lo viste, haz clic en Google I/O 2015 – Google Cloud Messagin 3.0. Tenéis también la web https://developers.google.com/cloud-messaging en donde poder ver todo lo relativo a GCM.

Como siempre, poco a poco iré integrando estas novedades en la librería Android javocsoft-toolbox, para que podáis disfrutar de dichos cambios de una manera sencilla.

 

Os dejo los videos, a modo recopilatorio, del evento ya pasado.

Y aquí otras exposiciones sobre temas concretos:

 

Un saludo,

Hola de nuevo.

Hoy he hecho cambios en la librería, a modo resumen son:

  • He corregido un BUG relativo al observer SMS que hacía que el objeto SMS no
    android-lib-iconestuviera inicializado en la clase SMSRunnableTask.java.
  • Y de paso, he aprovechado a mejorarla un poco, añadiendo una clase Helper para el envío de notificaciones PUSH desde la propia aplicación. Esta clase Helper, llamada “GCMDelivery.java” contiene una serie de métodos estáticos para el envío singular/múltiple de una notificación PUSH con uno o varias keys:
    • void gcm_sendMessageToDevice(String apiKey, Map<String, String> data,
      String collapseKey, boolean delayWhileIdle, int timeToLive,
      String device, int retries) throws GCMDeliveryException
    • void gcm_sendMessageToDevice(String apiKey, String key, String message, String collapseKey, boolean delayWhileIdle, int timeToLive,
      String device, int retries) throws GCMDeliveryException
    • void gcm_sendMessageToDevices(String apiKey, String key, String message, String collapseKey, boolean delayWhileIdle, int timeToLive,
      List<String> devices, int retries) throws GCMDeliveryException
    • void gcm_sendMessageToDevices(String apiKey, Map<String, String> data, String collapseKey, boolean delayWhileIdle, int timeToLive,
      List<String> devices, int retries) throws GCMDeliveryException.

Esta clase Helper de envío GCM puede ser usada además en la parte servidora si se gcm-logo-e1357123459595incluyen las dos librerías requeridas por GCMgcm-server.jar” y “json_simple-1.1.jar” (incluídas en el directorio “lib” de la librería).

He documentado cada método muy bien, explicando los parámetros al detalle ya que el tema de los parámetros de envío PUSH, al menos a mí, me parecía un poco complicado de entender del todo (ha sido también el motivo de incluir esta clase de envío). os aconsejo leeros la info de los métodos para aclarar ideas aunque es probable que haga un post al respecto.

Recordad por último, que la apiKey, que es lo que se necesita para enviar mediante GCM, la tenéis explicada en el PDF que adjunta la librería en la carpeta “docs“.

 

github_icon

Como siempre, teneis la librería disponible en GitHub

javocsoft-toolbox.

 

Un saludo.

JavocSoft 2013.

JavocSoft

Hola

Bueno, al final parece que no ha habido suerte, no han considerado que ninguna de las apps merezca pasar a la final, una pena. Sobre todo porque como AppVigilant no había ninguna (con el tema SMS y visualmente estaba bien además, evitaba el fraude), MarcaBlanca da un conjunto de información no muy accesible y solo hay copias en el market, y malas XD y WCTime mola un huevo, para pasar el rato va muy bien (sin tener que configurar nada de nada como en otras apps). Sigo pensando que son muy útiles y alguna debería haber pasado pero bueno, habrá que currárselo más para el próximo año. A ver si se me ocurre una ideal genial :).

AppCircus Barcelona

De las apps que han pasado a la final en mi opinión, solo hay cuatro que me parecen originales, divertidas y/ó curiosas y que yo hubiera puesto también en la final, una se llama AudioSnaps, lo que hace es asociarte a una captura de imagen el sonido ambiente y lo subes todo así, cuando ves la imagen la vives más al tener asociado el sonido, la idea mola la verdad. La otra es RunLoc, que te permite seguir a los participantes de una carrera en vivo y la otra es Mr. Badekker, un guía virtual en tu dispositivo muy gracioso y que además ha debido llevar curro hacerlo. Luego, por último esta Muster my Monsters, un juego de lucha con mascotas, monstruos de graficos amenos pero divertido y que te permite jugar en local con otros colegas que tengas al lado.

appcircus_finalist2

De las demás pues bueno, no asombra mucho la originalidad, de entre ellas esta por ejemplo, como no, una educativa, Pupitre, ya hay un porrón en el market (solo teneis que abrir la sección “Educación”), siempre queda bien una App así en un concurso y la verdad que esta currada. Luego esta EyeTok que aporta poder ver en streaming lo que hace otra persona (ya hay apps desde hace tiempo que emiten en streaming e incluso puedes ver a través de una web, no solo desde móvil). Luego hay una musical, Splyce, que te pilla toda la música de tu dispositivo y te hace una mezcla coherente, esta no esta mal.

Podéis echar un ojo a las demás si tenéis curiosidad en la página web del evento y os animo, a participar a aquellos que hagáis apps porque:

  • Sigo pensando que la originalidad hay que mostrarla aunque a veces, no se valore como uno mismo espere.
  • Si habéis hecho una app que aporta una utilidad que aún no esta cubierta en el market o ayuda de alguna manera a la gente, merece la pena darla a conocer.
  • Da visibilidad a vuestras apps, al ser descargadas y se hable de ellas.
  • Es emocionante participar en una de estos eventos y exponer en todo caso tu app si sale seleccionada como finalista.

Lo único que me gustaría es que ya que presentas la app y haces publicidad también del evento en tu blog, te enviaran por e-mail un resumen de lo que le ha parecido al jurado las aplicaciones que has presentado porque puede ser, que alguna opinión te parezca consistente y puedas aprender de ella si no, simplemente te quedas con un pues vale, ok.

Así que ya sabéis, a hacer apps y a participar 🙂

 

Un saludo,

JavocSoft 2013