PDM Avanzado Permisos AndroidManifiest.xml

De MediaWiki
Saltar a: navegación, buscar

Introdución

Como xa sabedes cando facemos algunha aplicación que necesite permisos especiais, é necesario engadir ditos permisos ao arquivo AndroidManifiest.xml.

A partires da API 23, Android incorpora outro nivel de seguridade, de tal forma que agora, a maiores, teremos que solicitar dito permiso a nivel de programación.

Nese momento, ao usuario apareceralle un diálogo no que se lle solicitará o seu permiso para que a aplicación faga uso do recurso.


PDM Avanzada Permisos 1.JPG


Isto só se aplica a permisos denominados perigosos (o veremos a continuación) e executando a aplicación nun dispositivo cunha versión Android 6.0 e un targetSDK 23. En caso contrario, o permiso o pedirá como ata o de agora, no momento da instalación.



Máis información en:

Tipos de permisos

  • Podedes consultar a lista completa de permisos que poden ir no AndroidManifiest.xml neste enlace.


  • En Android teremos dous tipos de permisos:
  • Normais: permisos que non afectan á privacidade do usuario. Estes só teñen que estar incluídos no arquivo androidmanifiest.xml.
  • Perigosos: permisos que poden afectar a privacidade do usuario e teñen que ser permitidos polo usuario no momento que se necesiten por parte da aplicación. Podedes consultar a lista de permisos perigosos neste enlace.


  • Para facer uso dun permiso 'considerado' perigoso, teremos que pedir autorización ao usuario.
Nota: Isto só é aplicable a aplicacións cun TargetSDK >=23 e executadas nun dispositivo cunha API 23 ou superior (Android 6.0).

Comprobando se temos o permiso

O permiso non é necesario pedilo sempre. Con tal de que o dea a primeira vez xa queda 'gardado'. Polo tanto podemos chequear se xa temos o permiso do usuario.

Neste exemplo estamos a solicitar un permiso para chamar por teléfono.

Previamente teríamos que ter posto no androidmanifiest.xml o permiso correspondente:

  1.     <uses-permission android:name="android.permission.CALL_PHONE" />

O código dentro da activity:

  1.            if (Build.VERSION.SDK_INT>=23){
  2.                     int permiso = checkSelfPermission(Manifest.permission.CALL_PHONE);
  3.                     if (permiso ==PackageManager.PERMISSION_GRANTED){
  4.                             // TEMOS O PERMISO
  5.                     }
  6.                     else{
  7.                             // NON TEMOS O PERMISO TEREMOS QUE SOLICITALO
  8.                     }
  9.                 }
  • Liña 1: Comprobamos que a versión é a API 23. Isto é necesario se temos un minSDK inferior á 23.
  • Liña 2: Chamamos ao método checkSelfPermission, que devolve un número que nos vai a indicar se temos o permiso.
  • Liña 3: Comprobamos se temos o permiso (granted ou denied).

Neste código suponse que a activity deriva da clase Activity e non dunha AppCompatActivity (librerías de compatibilidade). Se é o caso, o código varía un pouco:

  1.            if (Build.VERSION.SDK_INT>=23){
  2.                     int permiso = ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE);
  3.                     if (permiso ==PackageManager.PERMISSION_GRANTED){
  4.                             // TEMOS O PERMISO
  5.                     }
  6.                     else{
  7.                             // NON TEMOS O PERMISO TEREMOS QUE SOLICITALO
  8.                     }
  9.                 }


Solicitando o permiso

Para solicitar o permiso temos que chamar a un método que dará como resultado a visualización dunha caixa de diálogo;

PDM Avanzada Permisos 1.JPG


O resultado dese diálogo vai ir a o método onRequestPermissionsResult. Como podemos ter varios permisos diferentes, podemos enviar un código asociado a dita solicitude para que despois poidamos distinguir cal foi o permiso concedido ou denegado por parte do usuario.


Exemplo de código:

  1.  // Usado por si necesitamos diferentes permisos, para identificar cual de ellos es
  2.    private final int CODIGO_IDENTIFICADOR=1;
  3.  
  4.    public void pedirPermiso(){
  5.  
  6.       requestPermissions( new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);
  7.  
  8.    }
  9.  
  10.    @Override
  11.     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
  12.  
  13.         switch (requestCode) {
  14.             case CODIGO_IDENTIFICADOR: {
  15.                 // Se o usuario premeou o boton de cancelar o array volve cun null
  16.                 if (grantResults.length > 0
  17.                         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  18.                     // PERMISO CONCEDIDO
  19.                 } else {
  20.                     // PERMISO DENEGADO
  21.                     Toast.makeText(this,"É NECESARIO O PERMISO PARA CHAMAR POR TELÉFONO",Toast.LENGTH_LONG).show();
  22.                 }
  23.                 return;
  24.             }
  25.  
  26.             // Comprobamos os outros permisos
  27.  
  28.         }
  29.     }
  • Liña 6: Solicitamos o permiso enviado un código asociado (valor 1)
  • Liña 11: Aquí chega a resposta do usuario.
  • Liñas 15-22: Xestionamos que o usuario concedera ou non o permiso.


No caso de utilizar unha AppCompactActivity, o código sería:

  1.  
  2.    public void pedirPermiso(){
  3.  
  4.       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);
  5.  
  6.    }

Caso práctico

O obxectivo desta práctica e ver pedir un permiso ao S.O. Android de tipo 'perigoso'. Concretamente para chamar a un número de teléfono.

Consta dun botón no que se chamará a un número prefixado.

PDM Avanzada Permisos 2.jpg


Creamos a activity

  • Nome do proxecto: UD12_01_Permisos
  • Nome da activity: UD12_01_Permisos.java


Código do layout xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  3.    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
  4.    android:paddingRight="@dimen/activity_horizontal_margin"
  5.    android:paddingTop="@dimen/activity_vertical_margin"
  6.    android:paddingBottom="@dimen/activity_vertical_margin"
  7.    tools:context="es.cifprodolfoucha.angelfernandez.myapplication.UD08_01_Permisos">
  8.  
  9.     <Button
  10.        android:layout_width="wrap_content"
  11.        android:layout_height="wrap_content"
  12.        android:text="Chamar por teléfono"
  13.        android:id="@+id/UD12_01_btnChamar"
  14.        android:layout_alignParentTop="true"
  15.        android:layout_centerHorizontal="true" />
  16. </RelativeLayout>


Código da clase UD12_01_Permisos
Obxectivo: Solicitar un permiso para un dispositivo Android 6.0 e un targetSDK>=23.


Nota: Non se utilizan bibliotecas de compatibilidade.

  1. public class UD08_01_Permisos extends Activity {
  2.  
  3.     // Usado por si necesitamos diferentes permisos, para identificar cual de ellos es
  4.     private final int CODIGO_IDENTIFICADOR=1;
  5.  
  6.     private void chamarTelefono(){
  7.         Intent callIntent = new Intent(Intent.ACTION_CALL);
  8.         callIntent.setData(Uri.parse("tel:123456789"));
  9.         startActivity(callIntent);
  10.     }
  11.  
  12.     private void xestionarEventos(){
  13.  
  14.         Button boton = (Button)findViewById(R.id.UD12_01_btnChamar);
  15.         boton.setOnClickListener(new View.OnClickListener() {
  16.             @Override
  17.             public void onClick(View view) {
  18.  
  19.                 if (Build.VERSION.SDK_INT>=23){
  20.                     int permiso = checkSelfPermission(Manifest.permission.CALL_PHONE);
  21.                     if (permiso ==PackageManager.PERMISSION_GRANTED){
  22.                         chamarTelefono();
  23.                     }
  24.                     else{
  25.                         UD08_01_Permisos.this.requestPermissions( new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);
  26.                     }
  27.  
  28.                 }
  29.             }
  30.         });
  31.  
  32.  
  33.     }
  34.     @Override
  35.     protected void onCreate(Bundle savedInstanceState) {
  36.         super.onCreate(savedInstanceState);
  37.         setContentView(R.layout.activity_telefono_carrion);
  38.  
  39.  
  40.         xestionarEventos();
  41.  
  42.     }
  43.  
  44.     @Override
  45.     public void onRequestPermissionsResult(int requestCode,
  46.                                            String permissions[], int[] grantResults) {
  47.         switch (requestCode) {
  48.             case CODIGO_IDENTIFICADOR: {
  49.                 // If request is cancelled, the result arrays are empty.
  50.                 if (grantResults.length > 0
  51.                         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  52.                     chamarTelefono();
  53.                 } else {
  54.  
  55.                     Toast.makeText(this,"É NECESARIO O PERMISO PARA CHAMAR POR TELÉFONO",Toast.LENGTH_LONG).show();
  56.                 }
  57.                 return;
  58.             }
  59.  
  60.             // other 'case' lines to check for other
  61.             // permissions this app might request
  62.         }
  63.     }
  64.  
  65.     @Override
  66.     public boolean onCreateOptionsMenu(Menu menu) {
  67.         // Inflate the menu; this adds items to the action bar if it is present.
  68.         getMenuInflater().inflate(R.menu.menu_telefono_carrion, menu);
  69.         return true;
  70.     }
  71.  
  72.     @Override
  73.     public boolean onOptionsItemSelected(MenuItem item) {
  74.         // Handle action bar item clicks here. The action bar will
  75.         // automatically handle clicks on the Home/Up button, so long
  76.         // as you specify a parent activity in AndroidManifest.xml.
  77.         int id = item.getItemId();
  78.  
  79.         //noinspection SimplifiableIfStatement
  80.         if (id == R.id.action_settings) {
  81.             return true;
  82.         }
  83.  
  84.         return super.onOptionsItemSelected(item);
  85.     }
  86. }


-- Ángel D. Fernández González --2015