การขอ Permission

การขอ Permission ในตัวอย่างเป็นการขอสิทธิการอ่าน contact

ใส่รายการ permission ที่ต้องการในไฟล์ AndroidManifest.xml

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.phaisarn.permission">

    <uses-permission android:name="android.permission.READ_CONTACTS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java

package com.phaisarn.permission;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
    private static final String tag = "logPermission";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(tag, "onCreate");

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

            // Permission is not granted
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_CONTACTS)) {
                // Show an explanation 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 {
                Log.d(tag, "No explanation needed; request the permission");
                // No explanation needed; request the permission
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        } else {
            // Permission has already been granted
            Log.d(tag, "Permission has already been granted");
            // TO DO ...
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // 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.
                    Log.d(tag, "permission was granted");
                    // TO DO ...
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Log.d(tag, "permission denied");
                    // TO DO ...
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }
}

บรรทัดที่ 23 ตรวจสอบว่ามีสิทธิ์ที่ต้องการแล้วหรือยังด้วย checkSelfPermission()

บรรทัดที่ 36 ขอสิทธิด้วย requestPermissions()

ถ้าเป็นการขอสิทธิครั้งแรก แล้ว user Allow จะทำงานบรรทัดที่ 58 แต่ถ้า user Deny จะทำงานบรรทัดที่ 63

รันครั้งต่อมา ถ้าก่อนหน้า user Allow จะทำงานบรรทัดที่ 45 แต่ถ้า user Deny จะเข้าบรรทัดที่ 30 แต่ไม่มี dialog มาถาม user ละ

Link