1. 程式人生 > >Android 運行時權限(危險權限)

Android 運行時權限(危險權限)

一個 IE ID 通訊錄 rac provider param HR extend

一、說明

Android 6.0開始,Google將權限分為兩類,一類是Normal Permission, 這類權限一般不涉及用戶隱私,是不需要用戶進行授權的,比如手機震動、訪問網絡等;另一類是Dangerous Permission,一般是涉及到用戶隱私的,需要用戶進行授權,比如讀取sdcard、訪問通訊錄等。

二、危險權限列表

下表列出了Android所有的危險權限,剩余的權限就都是普通權限

需註意表中每個危險權限都屬於一個權限組,我們在運行時權限處理時使用權限名,用戶一旦同意授權了,那麽該權限組中其他權限也將同時被授權

三、在程序運行時申請權限

以撥打電話為例

界面很簡單,就一個按鈕,點擊後撥打10086.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"

android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/Make_Call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Make_Call" />
</android.support.constraint.ConstraintLayout>
代碼:

package com.czlt.test.contentprovidertest;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button makeCall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
makeCall = findViewById(R.id.Make_Call);
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判斷用戶是否已經給程序授權。第一個參數:context 第二個參數:具體權限名。
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
//未授權,調用 ActivityCompat.requestPermissions() 方法,向用戶申請授權
//參數:1.Activity實例,2.申請的權限名數組,3.請求碼,只要是唯一值即可
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 e) {
    e.printStackTrace();
    }
    }
    /**
  • 申請授權結果
  • @param requestCode 請求碼,對應 ActivityCompat.requestPermissions() 中的請求碼
  • @param permissions 權限列表
  • @param grantResults 請求結果
    */
    @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(MainActivity.this,"You denied the permission",Toast.LENGTH_SHORT).show();
    }
    break;
    default:
    break;
    }
    }
    }
    當然,配置文件AndroidManifest.xml 中,也要加上權限

Android 運行時權限(危險權限)