ActivityResultLauncher實(shí)現(xiàn)權(quán)限申請

前言

前面我們有講到權(quán)限申請相關(guān)文章晋南,大家感興趣的話可以參考以下文章:
PermissionsDispatcher動態(tài)權(quán)限申請
PermissionsDispatcher動態(tài)權(quán)限申請kotlin版
RxPermission申請權(quán)限
今天我們來講講ActivityResultLauncher實(shí)現(xiàn)的動態(tài)權(quán)限申請恒界。具體使用我已經(jīng)將其封裝成工具類
PermissionHelper,下面就來具體講下它的使用吧踩蔚。

今天涉及內(nèi)容:
1.添加依賴
2.PermissionHelper中方法簡單介紹
3.PermissionHelperMainActivity中的使用
4.運(yùn)行效果
5.PermissionHelper相關(guān)源碼

一.添加依賴

由于androidstudio已經(jīng)Compose化,相關(guān)Activity已經(jīng)默認(rèn)引用"androidx.activity:activity-compose:1.7.0"禾嫉,從而導(dǎo)致ActivityResultLauncher在使用上無法識別灾杰,所以我們需要在app_modulebuild.gradle中引入以下依賴:

dependencies {
    implementation("androidx.appcompat:appcompat:1.7.0")
    //其他代碼省略
    //......
}

這樣我們在使用ActivityResultLauncher及相關(guān)方法的時(shí)候,才不會報(bào)錯(cuò)熙参。

二. PermissionHelper 中方法簡單介紹

作為權(quán)限申請的工具類PermissionHelper中具有以下公開方法:

    /**
     * 監(jiān)聽權(quán)限返回處理
     *
     * @param listener 權(quán)限返回監(jiān)聽類
     * @return 返回 ActivityResultLauncher<Array<String>> 對象
     */
    fun getRequestPermissionLauncher(listener: IPermissionListener): ActivityResultLauncher<Array<String>>

    /**
     * 發(fā)起權(quán)限申請
     *
     * @param resultLauncher ActivityResultLauncher<Array<String>>對象
     */
    fun requestPermissions(resultLauncher: ActivityResultLauncher<Array<String>>)

    /**
     * 檢測是否permisson已經(jīng)授權(quán)
     *
     * @param permission eg: Manifest.permission.READ_EXTERNAL_STORAGE
     * @return boolean  true:已授權(quán)   false:未授權(quán)
     */
    fun checkSelfPermission(permission: String): Boolean

    /**
     * 檢測是否需要給未授權(quán)權(quán)限給出拒絕理由
     *
     * @param permission eg: Manifest.permission.READ_EXTERNAL_STORAGE
     * @return boolean  true:需要給出拒絕理由   false:不需要給出拒絕理由
     */
    fun checkShouldShowPermissionDescription(permission: String): Boolean

三. PermissionHelper 在 MainActivity 中的使用

代碼示例中使用的是ViewBinding初始化控件艳吠,大家如果對ViewBinding使用不甚了解的話,可以參考以下文章:
ViewBinding(1) — 在Activity中使用
ViewBinding(2) — Activity中ViewBinding和include標(biāo)簽使用
ViewBinding(3) — ViewBinding在fragment中使用
ViewBinding(4) — ViewBinding在Adapter中使用
MainActivity中申請權(quán)限是以讀寫和定位權(quán)限為例孽椰,所以需要在AndroidManifest.xml中添加以下權(quán)限:

    <!-- 讀寫權(quán)限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!-- 定位權(quán)限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

接下來讓我們看看PermissionHelperMainActivity中的使用:

package com.example.kdemo.ui

import android.Manifest
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.appcompat.app.AppCompatActivity
import com.example.kdemo.R
import com.example.kdemo.bean.StudentBean
import com.example.kdemo.databinding.ActivityMainBinding
import com.example.kdemo.permission.PermissionHelper
import com.example.kdemo.util.LogUtil

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding:ActivityMainBinding

    private lateinit var mPermissionHelper:PermissionHelper
    private lateinit var mActivityResultLauncher:ActivityResultLauncher<Array<String>>

    private var mPermissions = arrayOf(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.ACCESS_FINE_LOCATION
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        initData()
        setListener()

    }

    protected val initData = {
        mBinding.mTvName.text="我是中國人"

        var studentBean=StudentBean("小華",13)
        LogUtil.i("studentBean=${studentBean}")

        mPermissionHelper = PermissionHelper(this@MainActivity,mPermissions)
        //監(jiān)聽申請結(jié)果
        mActivityResultLauncher = mPermissionHelper.getRequestPermissionLauncher(object :
            PermissionHelper.IPermissionListener {
            override fun requestSuccess() {
                LogUtil.i("permission request success")
            }

            override fun shouldShowPermissionDescription(descriptionList: MutableList<String>) {
                LogUtil.i("permission request should show description dialog: ")
                descriptionList.forEach {
                    LogUtil.i("description permission: $it")
                }
            }

            override fun requestFail(requestFailList: MutableList<String>) {
                LogUtil.i("permission request fail")
                requestFailList.forEach {
                    LogUtil.i("fail permission: $it")
                }
            }
        })
    }


    protected val setListener = {
        mBinding.mTvName.setOnClickListener {
            when(it.id){
//                R.id.mTvName ->toast("大家好")

                R.id.mTvName ->{
                    LogUtil.i("start request permission")
                    //申請權(quán)限
                    mPermissionHelper.requestPermissions(mActivityResultLauncher)
                    LogUtil.i("request permission over")
                }


            }
        }
    }

    protected val toast: (String) -> Unit = {
            Toast.makeText(this@MainActivity, it, Toast.LENGTH_SHORT).show()
        }

}

從以上代碼可以看到昭娩,MainActivity在執(zhí)行初始化操作時(shí),我們初始化了PermissionHelper對象并傳入了權(quán)限數(shù)組黍匾。初始化ActivityResultLauncher對象的時(shí)候監(jiān)聽權(quán)限申請的結(jié)果回調(diào)栏渺。然后在需要申請權(quán)限的地方調(diào)用:

//申請權(quán)限
mPermissionHelper.requestPermissions(mActivityResultLauncher)

需要注意的是,在權(quán)限申請回調(diào)中有三個(gè)方法:

        //申請權(quán)限成功
        fun requestSuccess()

        //拒絕授權(quán)需要提供理由
        fun shouldShowPermissionDescription(descriptionList: MutableList<String>)

        //申請權(quán)限失敗的權(quán)限列表
        fun requestFail(requestFailList: MutableList<String>)

fun requestSuccess():權(quán)限申請成功的處理锐涯,在此處你可以做你app內(nèi)部需要處理的邏輯磕诊。
fun shouldShowPermissionDescription(descriptionList: MutableList<String>):權(quán)限被用戶拒絕,然后你需要給出申請這些權(quán)限的理由,用于引導(dǎo)用戶給予權(quán)限霎终,此方法返回的是被用戶拒絕的權(quán)限列表滞磺,你可以再此彈出dialog并羅列被拒絕的權(quán)限,并給出各權(quán)限申請的理由以引導(dǎo)用戶繼續(xù)授權(quán)
fun requestFail(requestFailList: MutableList<String>)申請用戶授權(quán)失敗莱褒,返回授權(quán)失敗的權(quán)限列表击困,在此方法內(nèi),你可以羅列哪些權(quán)限申請被拒絕广凸,并以彈出dialog的方式告知用戶

四.運(yùn)行效果

此次運(yùn)行后阅茶,界面先彈出是否授權(quán)位置,我選擇拒絕谅海,接著彈出是否授權(quán)拍照和相冊權(quán)限的dialog目派,我選擇允許,然后運(yùn)行的日志如下:

start request permission
request permission over
permission request fail
fail permission: android.permission.ACCESS_FINE_LOCATION

可以看到fun requestFail(requestFailList: MutableList<String>)執(zhí)行并返回位置授權(quán)失敗胁赢。

五.PermissionHelper 相關(guān)源碼

下面給出PermissionHelper類源碼:

還有 39% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
支付 ¥3.00 繼續(xù)閱讀
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市白筹,隨后出現(xiàn)的幾起案子智末,更是在濱河造成了極大的恐慌,老刑警劉巖徒河,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件系馆,死亡現(xiàn)場離奇詭異,居然都是意外死亡顽照,警方通過查閱死者的電腦和手機(jī)由蘑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來代兵,“玉大人尼酿,你說我怎么就攤上這事≈灿埃” “怎么了裳擎?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長思币。 經(jīng)常有香客問我鹿响,道長,這世上最難降的妖魔是什么谷饿? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任惶我,我火速辦了婚禮,結(jié)果婚禮上博投,老公的妹妹穿的比我還像新娘绸贡。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布恃轩。 她就那樣靜靜地躺著结洼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叉跛。 梳的紋絲不亂的頭發(fā)上松忍,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音筷厘,去河邊找鬼鸣峭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酥艳,可吹牛的內(nèi)容都是我干的摊溶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼充石,長吁一口氣:“原來是場噩夢啊……” “哼莫换!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骤铃,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拉岁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惰爬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊暖,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年撕瞧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陵叽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丛版,死狀恐怖巩掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情页畦,我是刑警寧澤锌半,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站寇漫,受9級特大地震影響刊殉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜州胳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一记焊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栓撞,春花似錦遍膜、人聲如沸碗硬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恩尾。三九已至,卻和暖如春挽懦,著一層夾襖步出監(jiān)牢的瞬間翰意,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工信柿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冀偶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓渔嚷,卻偏偏與公主長得像进鸠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子形病,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容