安卓6.0 運行時權限

Android 6.0之前,只有在app第一次安裝的時候纔會詢問用戶一次(之後不再詢問了),這樣很容易致使app安裝後給用戶帶來的危險行爲.而在6.0之後,當app須要咱們授予不恰當的權限的時候,咱們能夠予以拒絕.html

首先強調一點,必須是用android

compileSdkVersion >= 23

不然並不須要對權限進行任何處理git

舉個例子, 點擊上面那個button按鈕的時候會調用撥打電話這個功能,()github

Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "110);
intent.setData(data);
startActivity(intent);

撥打電話這權限是Dangerous Permissions, 若是在6.0之前的系統中,因爲用戶第一次安裝的時候已經默認勾選了全部所須要的權限,因此正常執行. 可6.0後, 由於撥打電話是一個Dangerous Permissions,根據安卓6.0規定,咱們必須對權限進行適配,適配後當用戶第一次點擊頂部的button按鈕後會彈出以上圖片的權限申請適配的dialog, 只有用戶勾選"容許"選項後纔可以直接撥打電話.網絡

新的權限機制更好的保護了用戶的隱私,Google將權限分爲兩類,一類是Normal Permissions,這類權限通常不涉及用戶隱私,是不須要用戶進行受權的,好比手機震動、訪問網絡等;另外一類是Dangerous Permission,通常是涉及到用戶隱私的,須要用戶進行受權,好比讀取sdcard、訪問通信錄等. app

Dangerous Permissions:ide

group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS group:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR group:android.permission-group.CAMERA permission:android.permission.CAMERA group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTSui

 

Android 6.0 權限申請權限步驟以下:this

1 和之前同樣,首先在AndroidManifest 中進行註冊;orm

2 檢查權限, 好比上面點擊button按鈕進行撥打電話時 咱們先檢查權限: 

ContextCompat.checkSelfPermission(this,
        Manifest.permission.CALL_PHONE)
        != PackageManager.PERMISSION_GRANTED)

3 申請權限: 

if (ContextCompat.checkSelfPermission(this,
        Manifest.permission.CALL_PHONE)
        != PackageManager.PERMISSION_GRANTED)
{
    // 沒有授予權限,進行申請權限
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CALL_PHONE},
            CALL_PHONE);
}else{ // 用戶已經申請過了權限,直接撥打電話
    Intent intent = new Intent(Intent.ACTION_CALL);
    Uri data = Uri.parse("tel:" + "10086");
    intent.setData(data);
    startActivity(intent);
}

 

4 申請權限的回調:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == CALL_PHONE)
    {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            callPhone();
        } else
        {
            // 拒絕權限
            Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

}

 

詳細代碼:

public class MainActivity extends AppCompatActivity {

    private static final int CALL_PHONE = 1 ;
    private Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bt = (Button) findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callPhone();
            }
        });

    }


    public void callPhone()
    {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED)
        {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CALL_PHONE},
                    CALL_PHONE);
        }else{
            Intent intent = new Intent(Intent.ACTION_CALL);
            Uri data = Uri.parse("tel:" + "10086");
            intent.setData(data);
            startActivity(intent);
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == CALL_PHONE)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                callPhone();
            } else
            {
                // 拒絕權限
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    }
}

 

其實權限適配很簡單,就這麼幾個簡單的步驟,不過寫起來會比較複雜,有不少重複的代碼,這裏推薦鴻陽大神的一個開源庫 https://github.com/hongyangAndroid/MPermissions.

相關文章
相關標籤/搜索