Android | Как запросить разрешения в приложении для Android?

Опубликовано: 5 Января, 2022

Начиная с Android 6.0 (API 23) , пользователи не запрашивают разрешения во время установки, а разработчикам необходимо запрашивать разрешения во время выполнения. Во время выполнения можно запросить только разрешения, определенные в файле манифеста.

Типы разрешений

1. Разрешения на время установки: для Android 5.1.1 (API 22) или ниже разрешение запрашивается во время установки в магазине Google Play .

Если пользователь принимает разрешения, приложение установлено. В противном случае установка приложения отменяется.

2. Разрешения во время выполнения: если Android 6 (API 23) или выше , разрешение запрашивается во время выполнения во время работы приложения.

Если пользователь принимает разрешения, можно использовать эту функцию приложения. В противном случае, чтобы использовать эту функцию, приложение снова запрашивает разрешение .

Итак, теперь разрешения запрашиваются во время выполнения. В этой статье мы обсудим, как запрашивать разрешения в приложении Android во время выполнения.

Шаги для запроса разрешений во время выполнения

Шаг 1. Объявите разрешение в файле манифеста Android : в Android разрешения объявляются в файле AndroidManifest.xml с помощью тега uses-permission.

<uses-permission android:name=”android.permission.PERMISSION_NAME”/>

Здесь мы объявляем хранилище и разрешение камеры.

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" />

Шаг 2: Измените файл activity_main.xml на Добавить две кнопки для запроса разрешения при нажатии кнопки: Разрешение будет проверяться и запрашиваться при нажатии кнопки. Откройте файл activity_main.xml и добавьте к нему две кнопки.

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"/>

Шаг 3. Проверьте, предоставлено ли уже разрешение. Если разрешение еще не предоставлено, запросите у пользователя разрешение : для использования какой-либо службы или функции требуются разрешения. Следовательно, мы должны убедиться, что для этого даны разрешения. Если нет, то запрашиваются разрешения.

Проверка разрешений. Начиная с Android 6.0 (уровень API 23), пользователь имеет право отозвать разрешения для любого приложения в любое время, даже если приложение нацелено на более низкий уровень API. Таким образом, чтобы использовать службу, приложение должно каждый раз проверять наличие разрешений.

Синтаксис:

 если (ContextCompat. checkSelfPermission (thisActivity, Manifest.permission.WRITE_CALENDAR)
   ! = PackageManager.PERMISSION_GRANTED) 
{
    // Разрешение не предоставлено
}

Запросить разрешения: когда PERMISSION_DENIED возвращается из метода checkSelfPermission () в приведенном выше синтаксисе, нам нужно запросить у пользователя это разрешение. Android предоставляет несколько методов, которые можно использовать для запроса разрешения, например requestPermissions () .

Синтаксис:

 ActivityCompat. requestPermissions (MainActivity.this, 
                                  разрешениеArray, 
                                  код заявки);

Здесь permissionArray - это массив типа String.

Пример:

Джава

// 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();
}
}

Котлин

// 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()
}
}

Эта функция будет отображать всплывающее сообщение, если разрешение уже предоставлено, в противном случае запрашивать разрешение у пользователя.

Шаг 4: Переопределить метод onRequestPermissionsResult (): onRequestPermissionsResult () вызывается, когда пользователь предоставляет или отклоняет разрешение. RequestCode - один из параметров этой функции, который используется для проверки действий пользователя по соответствующим запросам. Здесь отображается всплывающее сообщение с указанием разрешения и действия пользователя.

Пример:

Джава

// 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();
}
}
}

Котлин

// 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()
}
}
}

Ниже приведен полный код этого приложения:

Ниже приведен код файла activity_main.xml.

XML

<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
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 >

Ниже приведен код файла 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 >

Ниже приведен код файла MainActivity.

Котлин

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()
}
}
}
}

Джава

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,