A partir de Android 6.0 (API 23) , no se solicitan permisos a los usuarios en el momento de la instalación, sino que los desarrolladores deben solicitar los permisos en el momento de la ejecución. Solo los permisos que están definidos en el archivo de manifiesto se pueden solicitar en tiempo de ejecución.
Tipos de permisos
1. Permisos de tiempo de instalación: si el Android 5.1.1 (API 22) o anterior , el permiso se solicita en el momento de la instalación en Google Play Store .
Si el usuario acepta los permisos, la aplicación se instala. De lo contrario , se cancela la instalación de la aplicación .
2. Permisos de tiempo de ejecución: si Android 6 (API 23) o superior , el permiso se solicita en el tiempo de ejecución durante la ejecución de la aplicación.
Si el usuario acepta los permisos, se puede usar esa función de la aplicación. De lo contrario, para usar la función, la aplicación solicita permiso nuevamente .
Entonces, ahora los permisos se solicitan en tiempo de ejecución. En este artículo, discutiremos cómo solicitar permisos en una aplicación de Android en tiempo de ejecución.
Pasos para solicitar permisos en tiempo de ejecución
Paso 1: declarar el permiso en el archivo de manifiesto de Android : en Android, los permisos se declaran en el archivo AndroidManifest.xml mediante la etiqueta uses-permission .
<usos-permiso android:name=”android.permission.PERMISSION_NAME”/>
Aquí estamos declarando el almacenamiento y el permiso de la cámara.
XML
<!--Declaring the required permissions--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" />
Paso 2: Modifique el archivo activity_main.xml para Agregar dos botones para solicitar permiso al hacer clic en el botón: El permiso se verificará y se solicitará al hacer clic en el botón. Abra el archivo activity_main.xml y agréguele dos botones.
XML
<!--Button to request storage permission--> <Button android:id="@+id/storage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Storage" android:layout_marginTop="16dp" android:padding="8dp" android:layout_below="@id/toolbar" android:layout_centerHorizontal="true"/> <!--Button to request camera permission--> <Button android:id="@+id/camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Camera" android:layout_marginTop="16dp" android:padding="8dp" android:layout_below="@id/storage" android:layout_centerHorizontal="true"/>
Paso 3: compruebe si el permiso ya está concedido o no. Si aún no se ha otorgado el permiso, solicítelo al usuario : para usar cualquier servicio o función, se requieren los permisos. Por lo tanto, tenemos que asegurarnos de que se otorguen los permisos para eso. Si no, entonces se solicitan los permisos.
Comprobar los permisos: a partir de Android 6.0 (nivel de API 23), el usuario tiene derecho a revocar los permisos de cualquier aplicación en cualquier momento, incluso si la aplicación apunta a un nivel de API inferior. Entonces, para usar el servicio, la aplicación necesita verificar los permisos cada vez.
Sintaxis:
if(ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted }
Solicitar permisos: cuando se devuelve PERMISSION_DENIED desde el método checkSelfPermission() en la sintaxis anterior, debemos solicitar al usuario ese permiso. Android proporciona varios métodos que se pueden usar para solicitar permisos, como requestPermissions() .
Sintaxis:
ActivityCompat.requestPermissions(MainActivity.this, permissionArray, requestCode); Here permissionArray is an array of type String.
Ejemplo:
Java
// Function to check and request permission public void checkPermission(String permission, int requestCode) { // Checking if permission is not granted if (ContextCompat.checkSelfPermission(MainActivity.this, permission) == PackageManager.PERMISSION_DENIED) { ActivityCompat.requestPermissions(MainActivity.this, new String[] { permission }, requestCode); } else { Toast.makeText(MainActivity.this, "Permission already granted", Toast.LENGTH_SHORT).show(); } }
Kotlin
// Function to check and request permission. private fun checkPermission(permission: String, requestCode: Int) { if (ContextCompat.checkSelfPermission(this@MainActivity, permission) == PackageManager.PERMISSION_DENIED) { // Requesting the permission ActivityCompat.requestPermissions(this@MainActivity, arrayOf(permission), requestCode) } else { Toast.makeText(this@MainActivity, "Permission already granted", Toast.LENGTH_SHORT).show() } }
Esta función mostrará un mensaje Toast si ya se ha otorgado el permiso; de lo contrario, solicitará el permiso al usuario.
Paso 4: invalidar el método onRequestPermissionsResult() : se llama a onRequestPermissionsResult() cuando el usuario otorga o rechaza el permiso. RequestCode es uno de los parámetros de esta función que se utiliza para verificar la acción del usuario para las requests correspondientes. Aquí se muestra un mensaje de brindis que indica el permiso y la acción del usuario.
Ejemplo:
Java
// This function is called when user accept or decline the permission. // Request Code is used to check which permission called this function. // This request code is provided when user is prompt for permission. @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_PERMISSION_CODE) { // Checking whether user granted the permission or not. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Showing the toast message Toast.makeText(MainActivity.this, "Camera Permission Granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Camera Permission Denied", Toast.LENGTH_SHORT).show(); } } else if (requestCode == STORAGE_PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Storage Permission Granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Storage Permission Denied", Toast.LENGTH_SHORT).show(); } } }
Kotlin
// This function is called when the user accepts or decline the permission. // Request Code is used to check which permission called this function. // This request code is provided when the user is prompt for permission. override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == CAMERA_PERMISSION_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this@MainActivity, "Camera Permission Granted", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this@MainActivity, "Camera Permission Denied", Toast.LENGTH_SHORT).show() } } else if (requestCode == STORAGE_PERMISSION_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this@MainActivity, "Storage Permission Granted", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this@MainActivity, "Storage Permission Denied", Toast.LENGTH_SHORT).show() } } }
A continuación se muestra el código completo de esta aplicación:
A continuación se muestra el código para el archivo activity_main.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!-- To show toolbar--> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:background="@color/colorPrimary" app:title="GFG | Permission Example" app:titleTextColor="@android:color/white" android:layout_height="?android:attr/actionBarSize"/> <!--Button to request storage permission--> <Button android:id="@+id/storage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Storage" android:layout_marginTop="16dp" android:padding="8dp" android:layout_below="@id/toolbar" android:layout_centerHorizontal="true"/> <!--Button to request camera permission--> <Button android:id="@+id/camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Camera" android:layout_marginTop="16dp" android:padding="8dp" android:layout_below="@id/storage" android:layout_centerHorizontal="true"/> </RelativeLayout>
A continuación se muestra el código para el archivo AndroidManifest.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geeksforgeeks.requestPermission"> <!--Declaring the required permissions--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Actividad principal
Kotlin
import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { companion object { private const val CAMERA_PERMISSION_CODE = 100 private const val STORAGE_PERMISSION_CODE = 101 } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Defining Buttons val storage: Button? = findViewById(R.id.storage) val camera: Button? = findViewById(R.id.camera) // Set Buttons on Click Listeners storage?.setOnClickListener {checkPermission( Manifest.permission.WRITE_EXTERNAL_STORAGE, STORAGE_PERMISSION_CODE) } camera?.setOnClickListener { checkPermission(Manifest.permission.CAMERA, CAMERA_PERMISSION_CODE) } } // Function to check and request permission. private fun checkPermission(permission: String, requestCode: Int) { if (ContextCompat.checkSelfPermission(this@MainActivity, permission) == PackageManager.PERMISSION_DENIED) { // Requesting the permission ActivityCompat.requestPermissions(this@MainActivity, arrayOf(permission), requestCode) } else { Toast.makeText(this@MainActivity, "Permission already granted", Toast.LENGTH_SHORT).show() } } // This function is called when the user accepts or decline the permission. // Request Code is used to check which permission called this function. // This request code is provided when the user is prompt for permission. override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == CAMERA_PERMISSION_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this@MainActivity, "Camera Permission Granted", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this@MainActivity, "Camera Permission Denied", Toast.LENGTH_SHORT).show() } } else if (requestCode == STORAGE_PERMISSION_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this@MainActivity, "Storage Permission Granted", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this@MainActivity, "Storage Permission Denied", Toast.LENGTH_SHORT).show() } } } }
Java
import android.Manifest; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { // Defining Buttons private Button storage, camera; // Defining Permission codes. // We can give any value // but unique for each permission. private static final int CAMERA_PERMISSION_CODE = 100; private static final int STORAGE_PERMISSION_CODE = 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); storage = findViewById(R.id.storage); camera = findViewById(R.id.camera); // Set Buttons on Click Listeners storage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, STORAGE_PERMISSION_CODE); } }); camera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkPermission(Manifest.permission.CAMERA, CAMERA_PERMISSION_CODE); } }); } // Function to check and request permission. public void checkPermission(String permission, int requestCode) { if (ContextCompat.checkSelfPermission(MainActivity.this, permission) == PackageManager.PERMISSION_DENIED) { // Requesting the permission ActivityCompat.requestPermissions(MainActivity.this, new String[] { permission }, requestCode); } else { Toast.makeText(MainActivity.this, "Permission already granted", Toast.LENGTH_SHORT).show(); } } // This function is called when the user accepts or decline the permission. // Request Code is used to check which permission called this function. // This request code is provided when the user is prompt for permission. @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Camera Permission Granted", Toast.LENGTH_SHORT) .show(); } else { Toast.makeText(MainActivity.this, "Camera Permission Denied", Toast.LENGTH_SHORT) .show(); } } else if (requestCode == STORAGE_PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Storage Permission Granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Storage Permission Denied", Toast.LENGTH_SHORT).show(); } } } }
Producción:
Al iniciar la aplicación:
Al hacer clic en el botón de la cámara por primera vez:
Al otorgar el permiso:
Al hacer clic en el botón de la cámara de nuevo:
Publicación traducida automáticamente
Artículo escrito por aman neekhara y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA