PDM Avanzado Permisos AndroidManifiest.xml

De MediaWiki
Ir a la navegación Ir a la búsqueda

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.
  • A lista de permisos considerados perigosos é:
READ_CALENDAR
WRITE_CALENDAR
CAMERA
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
RECORD_AUDIO
READ_PHONE_STATE
READ_PHONE_NUMBERS 
CALL_PHONE
ANSWER_PHONE_CALLS 
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
BODY_SENSORS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE


  • 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 requestPermissions 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: Faise uso da AppCompactActivity.

 1 public class UD12_01_Permisos extends AppCompatActivity {
 2 
 3     // Usado por si necesitamos diferentes permisos, para identificar cual de ellos es
 4     private final int CODIGO_IDENTIFICADOR=1;
 5 
 6     // Xa comprobamos nos que o temos antes de chamar
 7     @SuppressLint("MissingPermission")
 8     private void chamarTelefono(){
 9         Intent callIntent = new Intent(Intent.ACTION_CALL);
10         callIntent.setData(Uri.parse("tel:123456789"));
11         startActivity(callIntent);
12     }
13 
14 
15     private void xestionarEventos(){
16         Button boton = (Button)findViewById(R.id.UD12_01_btnChamar);
17         boton.setOnClickListener(new View.OnClickListener() {
18             @Override
19             public void onClick(View view) {
20                 if (Build.VERSION.SDK_INT>=23){
21                     int permiso = checkSelfPermission(Manifest.permission.CALL_PHONE);
22                     if (permiso == PackageManager.PERMISSION_GRANTED){
23                         chamarTelefono();
24                     }
25                     else{
26                         ActivityCompat.requestPermissions(UD12_01_Permisos.this, new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);
27                     }
28                 }
29             }
30         });
31     }
32 
33     @Override
34     protected void onCreate(Bundle savedInstanceState) {
35         super.onCreate(savedInstanceState);
36 
37         setContentView(R.layout.activity_ud12_01__permisos);
38         xestionarEventos();
39     }
40 
41 
42     @Override
43 
44     public void onRequestPermissionsResult(int requestCode,
45                                            String permissions[], int[] grantResults) {
46         switch (requestCode) {
47             case CODIGO_IDENTIFICADOR: {
48                 // If request is cancelled, the result arrays are empty.
49                 if (grantResults.length > 0
50                         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
51                     chamarTelefono();
52                 } else {
53                     Toast.makeText(this,"É NECESARIO O PERMISO PARA CHAMAR POR TELÉFONO",Toast.LENGTH_LONG).show();
54                 }
55                 return;
56             }
57         }
58 
59     }
60 
61 
62 }


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