Этот пример исходного кода позволяет разрешить несколько запросов в Android с помощью kotlin. Этот исходный код протестирован, работает нормально и может использоваться.
MainActivity.kt
import android.Manifest import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button class MainActivity : AppCompatActivity() { private val PermissionsRequestCode = 123 private lateinit var managePermissions: ManagePermissions override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Initialize a list of required permissions to request runtime val list = listOf<String>( Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE ) // Initialize a new instance of ManagePermissions class managePermissions = ManagePermissions(this,list,PermissionsRequestCode) val button = findViewById(R.id.btnRequest) as Button // Button to check permissions states button.setOnClickListener{ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) managePermissions.checkPermissions() } }
Манифест
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
ManagePermission.kt
import android.app.Activity import android.app.AlertDialog import android.content.pm.PackageManager import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class ManagePermissions(val activity: Activity,val list: List<String>,val code:Int) { // Check permissions at runtime fun checkPermissions() { if (isPermissionsGranted() != PackageManager.PERMISSION_GRANTED) { showAlert() } else { Toast.makeText(activity, "Permissions already granted.", Toast.LENGTH_SHORT).show() } } // Check permissions status private fun isPermissionsGranted(): Int { // PERMISSION_GRANTED : Constant Value: 0 // PERMISSION_DENIED : Constant Value: -1 var counter = 0; for (permission in list) { counter += ContextCompat.checkSelfPermission(activity, permission) } return counter } // Find the first denied permission private fun deniedPermission(): String { for (permission in list) { if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_DENIED) return permission } return "" } // Show alert dialog to request permissions private fun showAlert() { val builder = AlertDialog.Builder(activity) builder.setTitle("Need permission(s)") builder.setMessage("Some permissions are required to do the task.") builder.setPositiveButton("OK", { dialog, which -> requestPermissions() }) builder.setNeutralButton("Cancel", null) val dialog = builder.create() dialog.show() } // Request the permissions at run time private fun requestPermissions() { val permission = deniedPermission() if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { // Show an explanation asynchronously Toast.makeText(activity, "Should show an explanation.", Toast.LENGTH_SHORT).show() } else { ActivityCompat.requestPermissions(activity, list.toTypedArray(), code) } } // Process permissions result fun processPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray): Boolean { var result = 0 if (grantResults.isNotEmpty()) { for (item in grantResults) { result += item } } if (result == PackageManager.PERMISSION_GRANTED) return true return false } }
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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"> <Button android:id="@+id/btnRequest" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="REQUEST" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>