




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么在程序運行時申請權(quán)限
這篇文章給大家介紹Android中怎么在程序運行時申請權(quán)限,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。這里我們以撥打電話申請權(quán)限來寫個小例子,也就是CALL_PHONE,因為撥打電話會涉及用戶手機的資費問題,因而被列為了危險權(quán)限,在Android6.0系統(tǒng)出現(xiàn)之前,撥打電話功能的實現(xià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>我們在布局文件中只定義了一個按鈕,當點擊按鈕時就會去觸發(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();
}
}
});
}
}可以看到,在按鈕的點擊事件中,我們構(gòu)建了一個隱式Intent,Intent的action指定為Intent.ACTION_CALL,這是一個系統(tǒng)內(nèi)置的打電話的動作,然后在data部分指定了協(xié)議是tel,號碼是10000,表示打開撥號界面,這個是不需要聲明權(quán)限的,而Intent.ACTION_CALL則可以直接撥打電話,因此必須申明權(quán)限,另外為了防止程序崩潰,我們將所有操作都放在了異常捕獲代碼塊當中。那么接下來修改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>這樣我們就將撥打電話的功能實現(xiàn)了,并且在低于Android6.0系統(tǒng)的手機上都是可以正常運行的,但是如果我們在6.0或者更高版本系統(tǒng)的手機上運行,點擊MakeCall按鈕就沒有任何效果,這時觀察logcat中的日志,會報如下錯誤:錯誤信息中提示我們PermissionDenial,可以看出,是由于權(quán)限被禁止所導(dǎo)致的,因為6.0及以上系統(tǒng)在使用危險權(quán)限時都必須進行運行時權(quán)限處理。那么下面我們就來嘗試修復(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)
{
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;
}
}
}上面的代碼將運行權(quán)限的完成流程都覆蓋了,下面我們來具體解析一下,說白了,運行時權(quán)限的核心就是在程序運行過程中由用戶授權(quán)我們?nèi)?zhí)行某些危險操作,程序是不可以擅自做主去執(zhí)行這些危險操作的,因此,第一步就是要去判斷用戶是不是已經(jīng)給過我們授權(quán)了,借助的是ContextCompat.checkSelfPermission()方法,checkSelfPermission()方法接收兩個參數(shù),第一個參數(shù)是Context,這個沒什么好說的,第二個參數(shù)是具體的權(quán)限名,比如打電話的權(quán)限名就是Manifest.permission.CALL_PHONE,然后使用方法的返回值和packageManager.PERMISSION_CRANTED做比較,相等就說明用戶已經(jīng)授權(quán),不等就表示用戶沒有授權(quán)。如果已經(jīng)授權(quán)的話就簡單了,直接去執(zhí)行撥打電話的邏輯操作就可以了,這里我們把撥打電話的邏輯封裝到call()方法中,如果沒有授權(quán)的話,則需要調(diào)用ActivityCompat.requestPermissions()方法來向用戶申請授權(quán),requestPermissions()方法接收3個參數(shù),第一個參數(shù)要求是Activity的實例,第二個參數(shù)是一個String數(shù)組,我們把要申請的權(quán)限名放在數(shù)組中即可,第三個參數(shù)是請求碼,只要是唯一值就可以了,這里傳入1。調(diào)用完了requestPermissions()方法之后,系統(tǒng)會彈出一個申請權(quán)限的對話框,然后用戶可以選擇同意或拒絕我們的權(quán)限申請,不論是哪種結(jié)果,最終都會回調(diào)到onRequestPermissionsResult()方法中,而授權(quán)的結(jié)果則封裝在grantResults參數(shù)當中,這里我們只需要判斷一下最后的授權(quán)結(jié)果,如果用戶同意的話就調(diào)用call()方法來撥打電話,如果用戶拒絕的話我們只能放棄操作,并且彈出一條失敗提示?,F(xiàn)在重新運行一下程序,并點擊MakeCall按鈕,效果如圖:
由于用戶還沒有授權(quán)過我們撥打電話權(quán)限,因此第一次運行會彈出這樣一個權(quán)限申請的對話框,用戶可以選擇同意或者拒絕,比如說這里點擊了DENY,結(jié)果如圖:由于用戶沒有同意授權(quán),我們只能彈出一個操作失敗的提示,下面我們再次點擊MakeCall,任然會彈出權(quán)限申請的對話框,這次點擊ALLOW,結(jié)果如圖:可以看到,這次我們就成功進入到撥打電話界面了,并且由于
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2019-2025年軍隊文職人員招聘之軍隊文職教育學(xué)題庫與答案
- 2025年軍隊文職人員招聘之軍隊文職管理學(xué)與服務(wù)考試題庫
- 2021-2022學(xué)年廣東省廣州市白云區(qū)六校七年級(下)期中數(shù)學(xué)試卷(含答案)
- 企業(yè)級數(shù)據(jù)安全合規(guī)策略制定服務(wù)協(xié)議
- 網(wǎng)絡(luò)直播平臺合作項目表
- 四川省成都市武侯區(qū)2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 湖南省岳陽市岳陽縣2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 語言學(xué)英語翻譯技能測試卷
- 濕地松采脂承包合同
- 團隊目標與績效考核表
- 中國民航大學(xué)《普通物理專題》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版年度城市綠化活動策劃及實施服務(wù)合同范本
- 2025年誠通證券招聘筆試參考題庫含答案解析
- 人教版高一上學(xué)期數(shù)學(xué)(必修一)期末考試卷(附答案)
- 專題17 全等三角形模型之奔馳模型解讀與提分精練(全國)(解析版)
- 智能制造能力成熟度模型(-CMMM-)介紹及評估方法分享
- 臨床康復(fù)??谱o士主導(dǎo)神經(jīng)重癥患者早期漸進式離床活動實踐應(yīng)用
- 《搜索引擎使用方法》課件
- DBJT14-100-2013 外墻外保溫應(yīng)用技術(shù)規(guī)程(改性酚醛泡沫板薄抹灰外墻外保溫系統(tǒng))
- 《兒科補液》課件
- 2024解析:第六章質(zhì)量和密度-講核心(解析版)
評論
0/150
提交評論