การขอ 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