【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限

這篇文章給大家介紹Android中怎么在程序運(yùn)行時(shí)申請(qǐng)權(quán)限,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。這里我們以撥打電話申請(qǐng)權(quán)限來寫個(gè)小例子,也就是CALL_PHONE,因?yàn)閾艽螂娫挄?huì)涉及用戶手機(jī)的資費(fèi)問題,因而被列為了危險(xiǎn)權(quán)限,在Android6.0系統(tǒng)出現(xiàn)之前,撥打電話功能的實(shí)現(xiàn)其實(shí)非常簡(jiǎn)單,修改activity_mainxml中的代碼,如下:<?xml

version="1.0"

encoding="utf-8"?>

<android.support.constraint.ConstraintLayout

xmlns:android="/apk/res/android"

xmlns:app="/apk/res-auto"

xmlns:tools="/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.runtimepermissiontest.MainActivity">

<Button

android:id="@+id/make_call"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Make

Call"

android:textAllCaps="false"/>

</android.support.constraint.ConstraintLayout>我們?cè)诓季治募兄欢x了一個(gè)按鈕,當(dāng)點(diǎn)擊按鈕時(shí)就會(huì)去觸發(fā)撥打電話的邏輯,接著修改MainActivity中的代碼,如下:public

class

MainActivity

extends

AppCompatActivity

{

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button

makeCall

=

findViewById(R.id.make_call);

makeCall.setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

view)

{

try

{

Intent

intent

=

new

Intent(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:10000"));

startActivity(intent);

}catch

(SecurityException

e){

e.printStackTrace();

}

}

});

}

}可以看到,在按鈕的點(diǎn)擊事件中,我們構(gòu)建了一個(gè)隱式Intent,Intent的action指定為Intent.ACTION_CALL,這是一個(gè)系統(tǒng)內(nèi)置的打電話的動(dòng)作,然后在data部分指定了協(xié)議是tel,號(hào)碼是10000,表示打開撥號(hào)界面,這個(gè)是不需要聲明權(quán)限的,而Intent.ACTION_CALL則可以直接撥打電話,因此必須申明權(quán)限,另外為了防止程序崩潰,我們將所有操作都放在了異常捕獲代碼塊當(dāng)中。那么接下來修改AndroidManifest.xml文件,在其中聲明如下權(quán)限:<?xml

version="1.0"

encoding="utf-8"?>

<manifest

xmlns:android="/apk/res/android"

package="com.example.runtimepermissiontest">

<uses-permission

android:name="android.permission.CALL_PHONE"

/>

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity

android:name=".MainActivity">

<intent-filter>

<action

android:name="ent.action.MAIN"

/>

<category

android:name="ent.category.LAUNCHER"

/>

</intent-filter>

</activity>

</application>

</manifest>這樣我們就將撥打電話的功能實(shí)現(xiàn)了,并且在低于Android6.0系統(tǒng)的手機(jī)上都是可以正常運(yùn)行的,但是如果我們?cè)?.0或者更高版本系統(tǒng)的手機(jī)上運(yùn)行,點(diǎn)擊MakeCall按鈕就沒有任何效果,這時(shí)觀察logcat中的日志,會(huì)報(bào)如下錯(cuò)誤:錯(cuò)誤信息中提示我們PermissionDenial,可以看出,是由于權(quán)限被禁止所導(dǎo)致的,因?yàn)?.0及以上系統(tǒng)在使用危險(xiǎn)權(quán)限時(shí)都必須進(jìn)行運(yùn)行時(shí)權(quán)限處理。那么下面我們就來嘗試修復(fù)這個(gè)問題,修改MainActivity中的代碼,如下:public

class

MainActivity

extends

AppCompatActivity

{

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button

makeCall

=

findViewById(R.id.make_call);

makeCall.setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

view)

{

if

(ContextCompat.checkSelfPermission(MainActivity.this,

Manifest.permission.CALL_PHONE)

!=

PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions(MainActivity.this,new

String[]{Manifest.permission.CALL_PHONE},1);

}else

{

call();

}

}

});

}

private

void

call(){

try

{

Intent

intent

=

new

Intent(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:10000"));

startActivity(intent);

}catch

(SecurityException

e){

e.printStackTrace();

}

}

@Override

public

void

onRequestPermissionsResult(int

requestCode,

@NonNull

String[]

permissions,

@NonNull

int[]

grantResults)

{

switch

(requestCode){

case

1:

if

(grantResults.length

>

0

&&

grantResults[0]

==

PackageManager.PERMISSION_GRANTED){

call();

}else

{

Toast.makeText(this,"You

denied

the

permission",Toast.LENGTH_SHORT).show();

}

break;

default:

break;

}

}

}上面的代碼將運(yùn)行權(quán)限的完成流程都覆蓋了,下面我們來具體解析一下,說白了,運(yùn)行時(shí)權(quán)限的核心就是在程序運(yùn)行過程中由用戶授權(quán)我們?nèi)?zhí)行某些危險(xiǎn)操作,程序是不可以擅自做主去執(zhí)行這些危險(xiǎn)操作的,因此,第一步就是要去判斷用戶是不是已經(jīng)給過我們授權(quán)了,借助的是ContextCompat.checkSelfPermission()方法,checkSelfPermission()方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是Context,這個(gè)沒什么好說的,第二個(gè)參數(shù)是具體的權(quán)限名,比如打電話的權(quán)限名就是Manifest.permission.CALL_PHONE,然后使用方法的返回值和packageManager.PERMISSION_CRANTED做比較,相等就說明用戶已經(jīng)授權(quán),不等就表示用戶沒有授權(quán)。如果已經(jīng)授權(quán)的話就簡(jiǎn)單了,直接去執(zhí)行撥打電話的邏輯操作就可以了,這里我們把撥打電話的邏輯封裝到call()方法中,如果沒有授權(quán)的話,則需要調(diào)用ActivityCompat.requestPermissions()方法來向用戶申請(qǐng)授權(quán),requestPermissions()方法接收3個(gè)參數(shù),第一個(gè)參數(shù)要求是Activity的實(shí)例,第二個(gè)參數(shù)是一個(gè)String數(shù)組,我們把要申請(qǐng)的權(quán)限名放在數(shù)組中即可,第三個(gè)參數(shù)是請(qǐng)求碼,只要是唯一值就可以了,這里傳入1。調(diào)用完了requestPermissions()方法之后,系統(tǒng)會(huì)彈出一個(gè)申請(qǐng)權(quán)限的對(duì)話框,然后用戶可以選擇同意或拒絕我們的權(quán)限申請(qǐng),不論是哪種結(jié)果,最終都會(huì)回調(diào)到onRequestPermissionsResult()方法中,而授權(quán)的結(jié)果則封裝在grantResults參數(shù)當(dāng)中,這里我們只需要判斷一下最后的授權(quán)結(jié)果,如果用戶同意的話就調(diào)用call()方法來撥打電話,如果用戶拒絕的話我們只能放棄操作,并且彈出一條失敗提示?,F(xiàn)在重新運(yùn)行一下程序,并點(diǎn)擊MakeCall按鈕,效果如圖:

由于用戶還沒有授權(quán)過我們撥打電話權(quán)限,因此第一次運(yùn)行會(huì)彈出這樣一個(gè)權(quán)限申請(qǐng)的對(duì)話框,用戶可以選擇同意或者拒絕,比如說這里點(diǎn)擊了DENY,結(jié)果如圖:由于用戶沒有同意授權(quán),我們只能彈出一個(gè)操作失敗的提示,下面我們?cè)俅吸c(diǎn)擊MakeCall,任然會(huì)彈出權(quán)限申請(qǐng)的對(duì)話框,這次點(diǎn)擊ALLOW,結(jié)果如圖:可以看到,這次我們就成功進(jìn)入到撥打電話界面了,并且由于

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論