Android | Как запросить разрешения в приложении для Android?
Начиная с 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" ?> 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,
РЕКОМЕНДУЕМЫЕ СТАТЬИ |