PermissionsDispatcher предоставляет простой API на основе аннотаций для обработки разрешений во время выполнения.
Эта библиотека снимает бремя, связанное с написанием множества проверочных операторов независимо от того, было ли от вас разрешение или нет, чтобы сохранить ваш код чистым и безопасным.
Вот минимальный пример, в котором вы регистрируете MainActivity
, для которого требуется Manifest.permission.CAMERA
.
Добавьте следующую строку в AndroidManifest.xml
:
<uses-permission android:name="android.permission.CAMERA" />
PermissionsDispatcher представляет лишь несколько аннотаций, сохраняя общий API кратким:
ПРИМЕЧАНИЕ. Аннотированные методы не должны быть
private
.
Аннотация | Необходимый | Описание |
---|---|---|
@RuntimePermissions | ✓ | Зарегистрируйте Activity или Fragment для обработки разрешений. |
@NeedsPermission | ✓ | Аннотируйте метод, который выполняет действие, требующее одного или нескольких разрешений. |
@OnShowRationale | Аннотируйте метод, объясняющий, почему необходимы разрешения. Он передает объект PermissionRequest , который можно использовать для продолжения или отмены текущего запроса разрешения после ввода пользователя. Если вы не укажете ни одного аргумента для метода, компилятор сгенерирует process${NeedsPermissionMethodName}ProcessRequest и cancel${NeedsPermissionMethodName}ProcessRequest . Вы можете использовать эти методы вместо PermissionRequest (например, с DialogFragment ). | |
@OnPermissionDenied | Аннотируйте метод, который вызывается, если пользователь не предоставляет разрешения. | |
@OnNeverAskAgain | Аннотируйте метод, который вызывается, если пользователь решил, что устройство «никогда больше не спрашивать» о разрешении. |
@RuntimePermissions
class MainActivity : AppCompatActivity (), View.OnClickListener {
@NeedsPermission( Manifest .permission. CAMERA )
fun showCamera () {
supportFragmentManager.beginTransaction()
.replace( R .id.sample_content_fragment, CameraPreviewFragment .newInstance())
.addToBackStack( " camera " )
.commitAllowingStateLoss()
}
@OnShowRationale( Manifest .permission. CAMERA )
fun showRationaleForCamera ( request : PermissionRequest ) {
showRationaleDialog( R .string.permission_camera_rationale, request)
}
@OnPermissionDenied( Manifest .permission. CAMERA )
fun onCameraDenied () {
Toast .makeText( this , R .string.permission_camera_denied, Toast . LENGTH_SHORT ).show()
}
@OnNeverAskAgain( Manifest .permission. CAMERA )
fun onCameraNeverAskAgain () {
Toast .makeText( this , R .string.permission_camera_never_askagain, Toast . LENGTH_SHORT ).show()
}
}
Теперь генерируемые функции стали намного лаконичнее и интуитивно понятнее, чем в Java-версии!
override fun onCreate ( savedInstanceState : Bundle ? ) {
super .onCreate(savedInstanceState)
setContentView( R .layout.activity_main)
findViewById( R .id.button_camera).setOnClickListener {
// NOTE: delegate the permission handling to generated function
showCameraWithPermissionCheck()
}
}
override fun onRequestPermissionsResult ( requestCode : Int , permissions : Array < String >, grantResults : IntArray ) {
super .onRequestPermissionsResult(requestCode, permissions, grantResults)
// NOTE: delegate the permission handling to generated function
onRequestPermissionsResult(requestCode, grantResults)
}
Ознакомьтесь с образцом для получения более подробной информации.
ПРИМЕЧАНИЕ:
Чтобы добавить PermissionsDispatcher в свой проект, включите в файл build.gradle
модуля приложения следующее:
${latest.version}
— это
dependencies {
implementation " com.github.permissions-dispatcher:permissionsdispatcher: ${ latest.version } "
annotationProcessor " com.github.permissions-dispatcher:permissionsdispatcher-processor: ${ latest.version } "
}
С Котлином:
apply plugin : ' kotlin-kapt '
dependencies {
implementation " com.github.permissions-dispatcher:permissionsdispatcher: ${ latest.version } "
kapt " com.github.permissions-dispatcher:permissionsdispatcher-processor: ${ latest.version } "
}
Copyright 2016 Shintaro Katafuchi, Marcel Schnelle, Yoshinori Isogai
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.