Permission ในระบบ android แบ่งได้เป็น 2 ชนิดคือ
- Normal Permission กรณีนี้ไม่จำเป็นต้องขอ Runtime Permission
- Dangerous Permission จำเป็นต้องขอ Runtime Permission
แต่อย่างไรก็ตาม ต้องขอ Permission ในไฟล์ AndroidManifest.xml ด้วย
build.gradle (Module: app)
apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.0" defaultConfig { applicationId "com.phaisarn.myapplication" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.github.armcha:SimplePermissions:1.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dist="http://schemas.android.com/apk/distribution" package="com.phaisarn.myapplication"> <dist:module dist:instant="true" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <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>
บรรทัดที่ 8-9 : ขอ Permission
MainActivity.java
package com.phaisarn.myapplication; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.Toast; import com.luseen.simplepermission.permissions.Permission; import com.luseen.simplepermission.permissions.PermissionActivity; import com.luseen.simplepermission.permissions.SinglePermissionCallback; public class MainActivity extends PermissionActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Build.VERSION.SDK_INT >= 23) { // >= Build.VERSION_CODES.M requestPermission(Permission.CAMERA, new SinglePermissionCallback() { @Override public void onPermissionResult(boolean permissionGranted, boolean isPermissionDeniedForever) { if (permissionGranted) { imageCapture(); } else { Toast.makeText(getBaseContext(), "Please grant permissions", Toast.LENGTH_SHORT).show(); } } }); } else { imageCapture(); } } }); } private void imageCapture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //... startActivityForResult(intent, 999); } }
บรรทัดที่ 14 : กำหนดให้สืบทอดจาก PermissionActivity
(ปกติสืบทอดจาก AppCompatActivity
)
ถ้าเป็น Fragment ให้สืบทอดจาก PermissionFragment
(ปกติสืบทอดจาก Fragment
)
บรรทัดที่ 25 : ขอ Permission เดียว ใช้ SinglePermissionCallback()
Link