android 6.0許可權申請機制(簡單案例)

納蘭寒明發表於2019-01-22

android 6.0更新了全新的許可權機制,在使用一些涉及使用者隱私的許可權時,會讓使用者做出選擇是否該app可以使用此許可權。

本文章是根據鴻翔大神的Android 6.0執行時許可權處理完全解析部落格思路開始學習的。

在檢視本文章之前,希望大家可以移步官方開發文件 使用許可權。在該文章中,詳細描述了新版本的許可權機制的更改,宣告許可權未發生改變,需要詳細觀看在執行時請求許可權,檢視許可權最佳做法可以避免糟糕的使用者體驗。

在許可權中,分為Normal Permissions和Dangerous Permissions兩種類別。其中Normal Permissions屬於正常許可權,不需要使用者授權的;而Dangerous Permissions屬於危險許可權,與使用者隱私密切相關,所以授權給使用者。我們在程式中就需要對這種危險許可權提供使用者授權處理,保證app的正常執行。官方文件給出了正常許可權和危險許可權,不清楚的可以在官網檢視。

#####申請許可權的小案例 1).在AndroidManifest中新增許可權。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
複製程式碼

2).Activity中的具體申請方法(參考官網的課程步驟)

package com.example.mypremission;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
{

    private static final int MY_PERMISSIONS_EXTERNAL_STORAGE_REQ_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermission();
    }

    public void requestPermission(){
        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //檢查到未授權該許可權資訊
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
               //上一次使用者拒絕了開啟此許可權!
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
            } else {
                // No explanation needed, we can request the permission.
                //請求許可權
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_EXTERNAL_STORAGE_REQ_CODE);
                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_EXTERNAL_STORAGE_REQ_CODE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    Toast.makeText(this, "申請成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "申請失敗", Toast.LENGTH_SHORT).show();
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
}
複製程式碼

執行程式:

手機執行截圖.png

接下來我會研究許可權機制的封裝,完成許可權批量申請的好辦法!

相關文章