1. 程式人生 > >Android 6.0 執行時許可權機制瞭解與應用

Android 6.0 執行時許可權機制瞭解與應用

  目前的安卓手機系統版本普遍都在5.0、6.0以上甚至7.0、8.0。在Andorid 6.0系統之後開始引入了執行時許可權這個機制。許可權機制在android中原本就有的在manifest中編寫的permission標籤,而新增的執行時許可權則是將容易暴露使用者隱私的一些許可權列為危險許可權,在程式需要的時候向用戶請求是否提供許可權從而保護使用者隱私。簡單的講就是為了更好的保護使用者的安全和隱私。

  市面上很多軟體都存在濫用許可權的行為,在安裝軟體時就發現安裝列表上申請了一大堆的許可權,不管是用不用的到的一股腦的全部先申請個遍可謂未雨綢繆。這種情況下在Android6.0以前如果使用者不滿意其中一個許可權拒絕了授予許可權就會導致整個app都沒法正常安裝使用,而若是Android6.0以後部分危險許可權可以先不申請,通過程式碼在需要的地方請求使用者進行授權,這就可以避免一些許可權濫用以及部分許可權不授權就無法使用app其他功能的情況。

  許可權被分為了正常許可權、危險許可權還有特殊許可權。所有的危險的Android系統許可權都屬於許可權組,申請了某一許可權組中的某一個許可權就等於申請了該許可權組中的所有許可權。對於這些分類的描述在官方文件中都可以找的到,你可以訪問http://developer.android.com/reference/andorid/Manifest.permission.html可以檢視許可權分類(不過這個貌似要fq),當然如果不能fq或者看不懂英文也可以通過Android官方文件中文網檢視。下圖為危險許可權及許可權組列表:

其實沒必要去記有多少許可權,哪些是危險的哪些是普通的,需要用到的時候查一下表對照一下就可以,如果要申請的許可權屬於危險許可權則需要進行執行時許可權處理,如果是普通許可權只要在manifest中宣告許可權即可。

接下來以一個demo來看看如何進行執行時許可權處理:

先建立一個專案,新增一個按鈕

在as3.0版本這樣寫編譯時就提示需要檢查許可權申請問題,我們直接alt+enter自動補全看一下

不得不說as很好用呢,直接自動補全了檢查許可權的if語句,我們新增log進行列印判斷,若打印出該log則我們目前是沒有許可權撥打電話的。

執行完點選一下,可以看到我們目前是沒有許可權的,這時我們就需要開始處理執行時許可權的申請。

當然剛剛的程式碼需要稍微整理一下邏輯,申請完許可權之後記得要在onRequestPermissionsResult中處理返回的結果。

public class MainActivity extends AppCompatActivity {
    public static final int REQUSTCODE = 1;
    Button btn_call;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_call = findViewById(R.id.btn_call);

        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ActivityCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    Log.i("test","call permission denial");
                    ActivityCompat.requestPermissions(MainActivity.this,new String[]{
                            Manifest.permission.CALL_PHONE
                    },REQUSTCODE);
                }else{
                    call();
                }

            }
        });
    }

    /**
     * 調起撥打電話
     */
    public 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 請求碼
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        switch (requestCode){
            case REQUSTCODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    call();
                }else{
                    Toast.makeText(MainActivity.this,"permisson denial",
                            Toast.LENGTH_SHORT).show();
                }
                break;
                default:break;
        }
    }
}

執行之後就可以看一下效果

點選允許之後就開始撥打電話了

此demo為個人練手用途,需要demo的可以點選傳送門