權限檢測基類

權限檢測基類

abstract class BasePermissionsActivity : AppCompatActivity() {

    private val permissionsRequestCode = 100

    //判斷是否需要檢測,防止不停的彈框
    private var isNeedCheck = true

    private lateinit var permissionsDialog: PermissionsDialog

    abstract fun getLayoutResID(): Int

    //需要授權的數組
    abstract fun permissionsList(): Array<String>

    //授權成功回調
    abstract fun successCallback()

    override fun onCreate(savedInstanceState: Bundle?) {
        //防止截屏攻擊風險
        window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
        //仿系統自帶短信界面 可以完全漂浮在軟鍵盤之上
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
        super.onCreate(savedInstanceState)

        setContentView(getLayoutResID())

        permissionsDialog = PermissionsDialog()
    }

    /**
     * 申請權限
     */
    override fun onResume() {
        super.onResume()
        if (isNeedCheck) {
            initRequestPermission(permissionsList())
        } else {
            isNeedCheck = true
        }
    }

    /**
     * 公共方法:初始化時統一申請權限
     */
    private fun initRequestPermission(@NonNull permissions: Array<String>) {
        val needRequestPermissionList = ArrayList<String>()
        for (permission in permissions) {
            //如果沒有授權放入待授權集合
            if (ContextCompat.checkSelfPermission(
                    this,
                    permission
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                needRequestPermissionList.add(permission)
            }
        }
        //將待授權集合轉換爲數組並申請授權
        val array = needRequestPermissionList.toTypedArray()
        if (array.isNotEmpty()) {
            ActivityCompat.requestPermissions(this, array, permissionsRequestCode)
        } else {
            successCallback()
        }
    }

    /**
     * 授權回調
     */
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        if (requestCode == permissionsRequestCode) {
            verifyPermissions(grantResults)
        }
    }

    /**
     * 判斷授權是否成功
     */
    private fun verifyPermissions(grantResults: IntArray) {
        for (result in grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                showDialog()
                return
            }
        }
        successCallback()
    }

    /**
     * 拒接授權彈出提示框
     */
    private fun showDialog() {
        permissionsDialog.show(supportFragmentManager, localClassName)
        isNeedCheck = false
    }

}

彈窗

import android.app.Dialog
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment

class PermissionsDialog : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        activity?.run {
            return with(AlertDialog.Builder(this)) {
                setTitle("提示")
                setMessage("在設置-應用-權限中開啓所需權限,以保證功能的正常使用")
                // 拒絕, 退出應用
                setNegativeButton("退出") { _, _ ->
                    finish()
                }
                setPositiveButton("設置") { _, _ ->
                    val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                    intent.data = Uri.parse("package:$packageName")
                    startActivity(intent)
                    dismiss()
                }
                setCancelable(false)
                create()
            }
        }
        return super.onCreateDialog(savedInstanceState)
    }

}

使用

class PermissionsActivity : BasePermissionsActivity() {

    override fun getLayoutResID(): Int {
        return R.layout.activity_permissions
    }

    override fun permissionsList(): Array<String> {
        return arrayOf()
    }

    override fun successCallback() {
        startActivity(Intent(this,MainActivity::class.java))
        finish()
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章