目錄
1.需要?jiǎng)討B(tài)申請權(quán)限的原因
2.Android權(quán)限動(dòng)態(tài)申請
1.需要?jiǎng)討B(tài)申請權(quán)限的原因
? 首先,Android權(quán)限分為大致兩類,一類是普通權(quán)限,一類是危險(xiǎn)權(quán)限,準(zhǔn)確地講其實(shí)還有一些特殊的權(quán)限,不過這些權(quán)限使用得相對較少,我們大致跳過.對于普通權(quán)限,系統(tǒng)會(huì)自動(dòng)幫我們進(jìn)行授權(quán),由于Android對用戶的保護(hù),我們通常在進(jìn)行涉及到危險(xiǎn)權(quán)限的時(shí)候,需要進(jìn)行動(dòng)態(tài)聲明,不然無法通過,會(huì)對程序終止,且發(fā)出異常
例子如下:
我已經(jīng)在清單文件中進(jìn)行權(quán)限申請了,但是仍然會(huì)出現(xiàn)如下的異常,這是因?yàn)?gt;=Android6.0認(rèn)為打電話是一個(gè)危險(xiǎn)的權(quán)限需要我們進(jìn)行動(dòng)態(tài)聲明
2.Android權(quán)限動(dòng)態(tài)申請
package com.quick.testmyphone import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private lateinit var mBtn: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mBtn = findViewById(R.id.call) mBtn.setOnClickListener { /** * 判斷用戶是否已經(jīng)給過了對應(yīng)的權(quán)限: * 利用ContextCompat.checkSelfPermission方法 (參數(shù)一:上下文,參數(shù)二:對應(yīng)的權(quán)限名稱) 的返回值與 * PackageManager.PERMISSION_GRANTED 做比較,相等代表已經(jīng)聲明權(quán)限 */ if (ContextCompat.checkSelfPermission(MainActivity@this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED ) { /** * 如果不相等,那么調(diào)用ActivityCompat.requestPermissions 方法進(jìn)行權(quán)限申明 參數(shù)一:上下文, 參數(shù)二: string數(shù)組用于填寫權(quán)限名, 參數(shù)三: 請求碼,唯一值即可 */ ActivityCompat.requestPermissions( MainActivity@this, arrayOf(Manifest.permission.CALL_PHONE), 1 ) } else { // 如果已經(jīng)聲明了權(quán)限那么直接就進(jìn)行打電話操作 callPhone() } } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when(requestCode) { 1 -> { /** * 由于授權(quán)的結(jié)果會(huì)封裝在grantResults 數(shù)組中,我們可以進(jìn)行非空判斷后 取出 與 PackageManager.PERMISSION_GRANTED作對比 */ if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { callPhone() } else { /** * 當(dāng)用戶拒絕的話,顯示一個(gè)吐司的效果,提醒用戶 */ Toast.makeText( MainActivity@this, "You denied the perssion", Toast.LENGTH_SHORT ).show() } } } } fun callPhone() { /** * 進(jìn)行打電話操作 */ val mIntent = Intent(Intent.ACTION_CALL).apply { data = Uri.parse("tel:10086") } startActivity(mIntent) } }
上述代碼運(yùn)行后的效果:文章來源:http://www.zghlxwxcb.cn/news/detail-828634.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-828634.html
到了這里,關(guān)于Android動(dòng)態(tài)申請權(quán)限(運(yùn)行時(shí)申請權(quán)限)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!