1. 程式人生 > >android手機許可權動態申請的那些坑(附帶kotlin的動態申請程式碼)

android手機許可權動態申請的那些坑(附帶kotlin的動態申請程式碼)

首先注意一點:在清單檔案內沒有進行申明的許可權進行動態申請時,並不會彈窗

確保需要申請的許可權已經在清單檔案中申明以後,就可以根據相應的功能進行申請:
該部落格只涉及使用Google提供的官方庫進行處理
首先在app的構建檔案中匯入
implementation ‘pub.devrel:easypermissions:1.0.1’
然後開始編輯動態申請的許可權工具類

class PermissionUtils(var activity: Activity, var callback: CallBackInterface) : EasyPermissions.PermissionCallbacks {

override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>?) {
    if (EasyPermissions.somePermissionPermanentlyDenied(activity, perms!!)) {
        AppSettingsDialog.Builder(activity).build().show()
    }else{
        callback.success()
    }
}

override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>?) {
    if (callback != null) {
        callback.success()
    }
}


override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    //將請求結果傳遞EasyPermission庫處理
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}

fun requestPermission(perms: Array<String>) {
    var check = PermissionManager.checkPermission(activity, perms)
    if (!check) {
        PermissionManager.requestPermission(activity, "為了功能正常使用,請允許以下許可權", 1000, perms)
    }else{
        callback.success()
    }
}

}

CallBackInterface只是為了非同步互動而接入的介面,裡面的方法就倆,一個success 一個erro
manage裡面的內容是呼叫google外掛的內容

object PermissionManager {

fun checkPermission(context: Activity, perms: Array<String>): Boolean {
    return EasyPermissions.hasPermissions(context, *perms)
}

/**
 * 請求許可權
 * @param context
 */
fun requestPermission(context: Activity, tip: String, requestCode: Int, perms: Array<String>) {
    EasyPermissions.requestPermissions(context, tip, requestCode, *perms)
}

}

相應許可權的呼叫如此實現,比如:我需要申請一個定位許可權,需要在該activity內接入CallBackInterface介面,然後傳入utils便可:


PermissionUtils(this,this).requestPermission(arrayOf(“android.permission.ACCESS_FINE_LOCATION”,
“android.permission.ACCESS_COARSE_LOCATION”))