真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中怎么在程序運行時申請權(quán)限-創(chuàng)新互聯(lián)

這篇文章給大家介紹Android中怎么在程序運行時申請權(quán)限,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供淮安區(qū)企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、做網(wǎng)站、HTML5、小程序制作等業(yè)務(wù)。10年已為淮安區(qū)眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進行中。

這里我們以撥打電話申請權(quán)限來寫個小例子,也就是CALL_PHONE,因為撥打電話會涉及用戶手機的資費問題,因而被列為了危險權(quán)限,在Android6.0系統(tǒng)出現(xiàn)之前,撥打電話功能的實現(xiàn)其實非常簡單,修改activity_mainxml中的代碼,如下:




 
 

我們在布局文件中只定義了一個按鈕,當點擊按鈕時就會去觸發(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)限:




 
 
 
 
  
  

  
  
 
 

這樣我們就將撥打電話的功能實現(xiàn)了,并且在低于Android6.0系統(tǒng)的手機上都是可以正常運行的,但是如果我們在6.0或者更高版本系統(tǒng)的手機上運行,點擊Make Call按鈕就沒有任何效果,這時觀察logcat中的日志,會報如下錯誤:

Android中怎么在程序運行時申請權(quán)限

錯誤信息中提示我們Permission Denial,可以看出,是由于權(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()方法來撥打電話,如果用戶拒絕的話我們只能放棄操作,并且彈出一條失敗提示。

現(xiàn)在重新運行一下程序,并點擊Make Call按鈕,效果如圖:

Android中怎么在程序運行時申請權(quán)限

由于用戶還沒有授權(quán)過我們撥打電話權(quán)限,因此第一次運行會彈出這樣一個權(quán)限申請的對話框,用戶可以選擇同意或者拒絕,比如說這里點擊了DENY,結(jié)果如圖:

Android中怎么在程序運行時申請權(quán)限

由于用戶沒有同意授權(quán),我們只能彈出一個操作失敗的提示,下面我們再次點擊Make Call,任然會彈出權(quán)限申請的對話框,這次點擊ALLOW,結(jié)果如圖:

Android中怎么在程序運行時申請權(quán)限

可以看到,這次我們就成功進入到撥打電話界面了,并且由于用戶已經(jīng)完成了授權(quán)操作,之后再點擊Make Call按鈕就不會再彈出權(quán)限申請對話框了,而是可以直接撥打電話,那可能你會擔心,萬一以后我又后悔了怎么辦?沒有關(guān)系,用戶隨時都可以將授予程序的危險權(quán)限進行關(guān)系,進入Settings-->Apps-->RuntimePermissiontTest-->Permissions,界面如圖:

Android中怎么在程序運行時申請權(quán)限

關(guān)于Android中怎么在程序運行時申請權(quán)限就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


文章題目:Android中怎么在程序運行時申請權(quán)限-創(chuàng)新互聯(lián)
文章來源:http://weahome.cn/article/dogosj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部