安卓入門:獲取危險許可權——執行時許可權處理

安卓入門:獲取危險許可權——執行時許可權處理
主題

在6.0版本以上的系統在使用危險許可權時需要進行執行時許可權處理

執行環境

7.0安卓手機

許可權宣告
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.momingqi.runtimepermissiondemo">
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
android:allowBackup="true"
...
</application>
</manifest>
執行程式碼:
try
{
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
} catch (SecurityException exception)
{
exception.printStackTrace();
}
錯誤提示

提示沒有授權這個Intent

java.lang.SecurityException:
Permission Denial: starting Intent
{ act=android.intent.action.CALL
dat=tel:xxxxx
cmp=com.android.server.telecom/.components.UserCallActivity } 
from ProcessRecord{3560ec5 2240:com.momingqi.runtimepermissiondemo/u0a72} (pid=2240, uid=10072) with revoked permission
android.permission.CALL_PHONE
修改程式碼

在執行時請求許可權

public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_call).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
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:10086"));
startActivity(intent);
} catch (SecurityException exception)
{
exception.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, "你拒絕了該許可權請求",Toast.LENGTH_SHORT);
}
break;
default:
break;
}
}
}
執行結果

執行時許可權1

執行時許可權2

注意

ACTION.CALL與ACTION.DIAL的區別:
– ACTION_DIAL只是開啟撥號介面,需要使用者主動進行撥號;而ACTION_CALL會自動撥打給data中的號碼
– ACTION.CALL屬於危險許可權,需要在manifest中宣告許可權並且進行執行時授權;ACTION_DIAL則不需要任何授權

獲取危險許可權方法過程
  1. 檢查是否已經授權
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED)
  1. 發起許可權請求
ActivityCompat.requestPermissions(MainActivity.this
, new String[]{Manifest.permission.CALL_PHONE }, 1); //引數:上下文,許可權列表,請求碼
  1. 過載上下文的onRequestPermissionsResult方法
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)

通過請求碼來識別這個活動在不同地方請求許可權的結果,引數grantResults是對應permissions裡請求的許可權的返回結果合集,通過索引就能得到每一個許可權請求的返回結果。