安卓開發(fā)入門教程-運(yùn)行時(shí)權(quán)限

什么是運(yùn)行時(shí)權(quán)限

為了更好的保護(hù)用戶隱私及安全,安卓自6.0版本開始,引入運(yùn)行時(shí)動(dòng)態(tài)權(quán)限檢查機(jī)制.應(yīng)用需要訪問一些涉及用戶隱私及安全權(quán)限時(shí),應(yīng)用需要調(diào)用系統(tǒng)權(quán)限檢查接口,查看是否已獲得權(quán)限,如果沒有,則由系統(tǒng)彈出權(quán)限申請(qǐng)窗口,由用戶決定是否允許使用相應(yīng)權(quán)限.

基礎(chǔ)樣例

下面例子中將申請(qǐng)打電話權(quán)限并完成打電話功能.

使用安卓原生方式申請(qǐng)權(quán)限

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener { applyPermissionAndCall() }
    }

    /**
     * 先檢查權(quán)限,如果已經(jīng)獲得權(quán)限,直接撥打電話;
     * 否則申請(qǐng)權(quán)限。
     */
    private fun applyPermissionAndCall() {
        if (hasPermission()) {
            call()
        } else {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1)
        }
    }

    /**
     * 檢查是否有權(quán)限
     */
    private fun hasPermission(): Boolean {
        val result = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
        return result == PackageManager.PERMISSION_GRANTED
    }

    /**
     * 處理申請(qǐng)權(quán)限的結(jié)果,如果獲得了權(quán)限,則撥打電話,否則toast報(bào)錯(cuò)。
     */
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            1 -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    call()
                } else {
                    toast("沒權(quán)限,打不了??")
                }
            }
        }
    }

    /**
     * 調(diào)用系統(tǒng)打電話功能,撥打10086
     */
    private fun call() {
        try {
            val intent = Intent(Intent.ACTION_CALL)
            intent.data = Uri.parse("tel:10086")
            startActivity(intent)
        } catch (e: SecurityException) {
            e.printStackTrace()
        }
    }

    private fun toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}

使用第三方開源庫(kù)(SoulPermission)申請(qǐng)權(quán)限

  1. 在模塊build.gradle文件中添加第三方庫(kù)(SoulPermission)依賴
implementation 'com.qw:soulpermission:1.3.0'
  1. 在activity中調(diào)用
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener { applyPermissionAndCall() }
    }

    /**
     * 先申請(qǐng)權(quán)限,再打電話
     */
    private fun applyPermissionAndCall() {
        SoulPermission.getInstance()
            .checkAndRequestPermission(
                Manifest.permission.CALL_PHONE,
                object : CheckRequestPermissionListener {
                    override fun onPermissionOk(permission: Permission) {
                        call()
                    }

                    override fun onPermissionDenied(permission: Permission) {
                        toast("沒權(quán)限,打不了??")
                    }
                })
    }

    /**
     * 調(diào)用系統(tǒng)打電話功能,撥打10086
     */
    private fun call() {
        try {
            val intent = Intent(Intent.ACTION_CALL)
            intent.data = Uri.parse("tel:10086")
            startActivity(intent)
        } catch (e: SecurityException) {
            e.printStackTrace()
        }
    }

    private fun toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}

完整源代碼

https://gitee.com/lblbc/permission-demo

申請(qǐng)多個(gè)權(quán)限樣例

private fun applyPermissionAndPhoto() {
    SoulPermission.getInstance()
        .checkAndRequestPermissions(
            Permissions.build(
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            ),
            object : CheckRequestPermissionsListener {
                override fun onAllPermissionOk(allPermissions: Array<out Permission>?) {
                    photo()
                }

                override fun onPermissionDenied(refusedPermissions: Array<out Permission>?) {
                }
            })
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容