EasyPermissions เป็นไลบรารี wrapper เพื่อลดความซับซ้อนของตรรกะการอนุญาตระบบขั้นพื้นฐานเมื่อกำหนดเป้าหมายเป็น Android M หรือสูงกว่า
หมายเหตุ: หากแอปของคุณเขียนด้วย Kotlin ให้พิจารณาไลบรารี easypermissions-ktx ซึ่งจะเพิ่มส่วนขยาย Kotlin ให้กับไลบรารี EasyPermissions หลัก
EasyPermissions ได้รับการติดตั้งโดยเพิ่มการพึ่งพาต่อไปนี้ให้กับไฟล์ build.gradle
ของคุณ:
dependencies {
// For developers using AndroidX in their applications
implementation ' pub.devrel:easypermissions:3.0.0 '
// For developers using the Android Support Library
implementation ' pub.devrel:easypermissions:2.0.1 '
}
ในการเริ่มใช้ EasyPermissions ให้ Activity
ของคุณ (หรือ Fragment
) แทนที่เมธอด onRequestPermissionsResult
:
public class MainActivity extends AppCompatActivity {
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
}
@ Override
public void onRequestPermissionsResult ( int requestCode , String [] permissions , int [] grantResults ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults );
// Forward results to EasyPermissions
EasyPermissions . onRequestPermissionsResult ( requestCode , permissions , grantResults , this );
}
}
ตัวอย่างด้านล่างแสดงวิธีการขอสิทธิ์สำหรับวิธีที่ต้องใช้ทั้งสิทธิ์ CAMERA
และ ACCESS_FINE_LOCATION
มีบางสิ่งที่ควรทราบ:
EasyPermissions#hasPermissions(...)
เพื่อตรวจสอบว่าแอปมีสิทธิ์ที่จำเป็นอยู่แล้วหรือไม่ วิธีการนี้สามารถรับสิทธิ์จำนวนเท่าใดก็ได้เป็นอาร์กิวเมนต์สุดท้ายEasyPermissions#requestPermissions
วิธีนี้จะขอสิทธิ์ของระบบและแสดงสตริงเหตุผลที่ให้ไว้หากจำเป็น รหัสคำขอที่ให้มาควรไม่ซ้ำกันสำหรับคำขอนี้ และวิธีการสามารถรับสิทธิ์จำนวนเท่าใดก็ได้เป็นอาร์กิวเมนต์สุดท้ายAfterPermissionGranted
นี่เป็นทางเลือก แต่มีไว้เพื่อความสะดวก หากได้รับอนุญาตทั้งหมดในคำขอที่กำหนด วิธีการ ทั้งหมด ที่มีคำอธิบายประกอบด้วยรหัสคำขอที่ถูกต้องจะถูกดำเนินการ (ต้องแน่ใจว่ามีรหัสคำขอที่ไม่ซ้ำกัน) วิธีการใส่คำอธิบายประกอบจะต้องเป็น โมฆะ และ ไม่มีพารามิเตอร์อินพุต (คุณสามารถใช้ onSaveInstanceState แทน เพื่อรักษาสถานะของพารามิเตอร์ที่ถูกระงับ) นี่เป็นการลดความซับซ้อนของขั้นตอนทั่วไปในการเรียกใช้วิธีการร้องขอหลังจากที่ได้รับสิทธิ์อนุญาตทั้งหมดแล้ว ซึ่งสามารถทำได้โดยการเพิ่มตรรกะในการโทรกลับ onPermissionsGranted
@ AfterPermissionGranted ( RC_CAMERA_AND_LOCATION )
private void methodRequiresTwoPermission () {
String [] perms = { Manifest . permission . CAMERA , Manifest . permission . ACCESS_FINE_LOCATION };
if ( EasyPermissions . hasPermissions ( this , perms )) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request them now
EasyPermissions . requestPermissions ( this , getString ( R . string . camera_and_location_rationale ),
RC_CAMERA_AND_LOCATION , perms );
}
}
หรือเพื่อการควบคุมกล่องโต้ตอบเหตุผลอย่างละเอียดยิ่งขึ้น ให้ใช้ PermissionRequest
:
EasyPermissions . requestPermissions (
new PermissionRequest . Builder ( this , RC_CAMERA_AND_LOCATION , perms )
. setRationale ( R . string . camera_and_location_rationale )
. setPositiveButtonText ( R . string . rationale_ask_ok )
. setNegativeButtonText ( R . string . rationale_ask_cancel )
. setTheme ( R . style . my_fancy_style )
. build ());
หรืออีกทางหนึ่ง เพื่อการควบคุมที่ละเอียดยิ่งขึ้น คุณสามารถให้ Activity
/ Fragment
ของคุณใช้อินเทอร์เฟซ PermissionCallbacks
ได้
public class MainActivity extends AppCompatActivity implements EasyPermissions . PermissionCallbacks {
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
}
@ Override
public void onRequestPermissionsResult ( int requestCode , String [] permissions , int [] grantResults ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults );
// Forward results to EasyPermissions
EasyPermissions . onRequestPermissionsResult ( requestCode , permissions , grantResults , this );
}
@ Override
public void onPermissionsGranted ( int requestCode , List < String > list ) {
// Some permissions have been granted
// ...
}
@ Override
public void onPermissionsDenied ( int requestCode , List < String > list ) {
// Some permissions have been denied
// ...
}
}
ในบางกรณี แอปของคุณจะทำงานไม่ถูกต้องหากไม่มีการอนุญาตบางอย่าง หากผู้ใช้ปฏิเสธการอนุญาตเหล่านี้ด้วยตัวเลือก "ไม่ต้องถามอีก" คุณจะไม่สามารถขอการอนุญาตเหล่านี้จากผู้ใช้ได้ และจะต้องเปลี่ยนแปลงในการตั้งค่าแอป คุณสามารถใช้เมธอด EasyPermissions.somePermissionPermanentlyDenied(...)
เพื่อแสดงกล่องโต้ตอบให้กับผู้ใช้ในสถานการณ์นี้ และนำพวกเขาไปยังหน้าจอการตั้งค่าระบบสำหรับแอปของคุณ:
หมายเหตุ : เนื่องจากข้อจำกัดในข้อมูลที่ได้รับจาก API การอนุญาตกรอบงาน Android วิธีการ somePermissionPermanentlyDenied
จะทำงานเฉพาะหลังจากที่การอนุญาตถูกปฏิเสธ และแอปของคุณได้รับการโทรกลับ onPermissionsDenied
เท่านั้น มิฉะนั้น ห้องสมุดไม่สามารถแยกแยะการปฏิเสธถาวรจากกรณีที่ "ยังไม่ถูกปฏิเสธ" ได้
@ Override
public void onPermissionsDenied ( int requestCode , List < String > perms ) {
Log . d ( TAG , "onPermissionsDenied:" + requestCode + ":" + perms . size ());
// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
// This will display a dialog directing them to enable the permission in app settings.
if ( EasyPermissions . somePermissionPermanentlyDenied ( this , perms )) {
new AppSettingsDialog . Builder ( this ). build (). show ();
}
}
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent data ) {
super . onActivityResult ( requestCode , resultCode , data );
if ( requestCode == AppSettingsDialog . DEFAULT_SETTINGS_REQ_CODE ) {
// Do something after user returned from app settings screen, like showing a Toast.
Toast . makeText ( this , R . string . returned_from_app_settings_to_activity , Toast . LENGTH_SHORT )
. show ();
}
}
ใช้ EasyPermissions.RationaleCallbacks
หากคุณต้องการโต้ตอบกับกล่องโต้ตอบเหตุผล
@ Override
public void onRationaleAccepted ( int requestCode ) {
// Rationale accepted to request some permissions
// ...
}
@ Override
public void onRationaleDenied ( int requestCode ) {
// Rationale denied to request some permissions
// ...
}
การเรียกกลับตามเหตุผลไม่จำเป็นต้องหมายความถึงการเปลี่ยนแปลงสิทธิ์ หากต้องการตรวจสอบสิ่งเหล่านั้น โปรดดูที่ EasyPermissions.PermissionCallbacks
Copyright 2017 Google
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.