2023 Mar. 05.
2022 Mar. 11.
出典 Android の位置情報の権限要求(フォアグラウンド)について
Android 7.0 android 11で動作確認した
Android 7.0ではパーミッション取得確認ダイアログに「今後表示しない」チェックボックスが表示された
Android11では「今後表示しない」が表示されなかった
概要
xml version="1.0" encoding="utf-8"
<manifest xmlnsandroid="http://schemas.android.com/apk/res/android"
package="PROJECT">
<uses-permission androidname="android.permission.READ_EXTERNAL_STORAGE" />
<application
build.gradle(:app)
viewBindingを記述
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 32
defaultConfig {
applicationId "net.sytes.rokkosan.mygetpermission"
minSdk 24
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
activity_main.xml
xml version="1.0" encoding="utf-8"
<androidxconstraintlayoutwidgetConstraintLayout xmlnsandroid="http://schemas.android.com/apk/res/android"
xmlnsapp="http://schemas.android.com/apk/res-auto"
xmlnstools="http://schemas.android.com/tools"
androidlayout_width="match_parent"
androidlayout_height="match_parent"
toolscontext=".MainActivity">
<TextView
androidid="@+id/tvResult"
androidlayout_width="wrap_content"
androidlayout_height="wrap_content"
androidtext="Hello World!"
applayout_constraintBottom_toTopOf="@id/btnGetPermission"
applayout_constraintLeft_toLeftOf="parent"
applayout_constraintRight_toRightOf="parent"
applayout_constraintTop_toTopOf="parent" />
<Button
androidid="@+id/btnGetPermission"
androidlayout_width="wrap_content"
androidlayout_height="wrap_content"
androidtext="@string/get_permission"
applayout_constraintBottom_toBottomOf="parent"
applayout_constraintLeft_toLeftOf="parent"
applayout_constraintRight_toRightOf="parent"
applayout_constraintTop_toBottomOf="@id/tvResult" />
</androidxconstraintlayoutwidgetConstraintLayout>
strings.xml
<resources>
<string name="app_name">MyGetPermission</string>
<string name="get_permission">Get_Permission</string>
<string name="failed_permission">Failed getting permission</string>
<string name="already_rejected_permission">Already reejected to get permission</string>
<string name="got_permission">Got_Permission</string>
<string name="please_open_configuration">ストレージ読込みの権限が拒否されました。設定から読込権限を許可してください</string>
<string name="go_to_configuration">設定を開く</string>
<string name="ok">OK</string>
<string name="dismiss">Dismiss</string>
<string name="please_require_permission">ストレージ読込権限が必要です。許可しますか?</string>
<string name="reason_for_permission">ストレージファイル読み込みに読込権限の許可が必要です。設定を開きますか?</string>
</resources>
MainActivity.kt
package net.sytes.rokkosan.mygetpermission
import android.Manifest
import android.content.Context
import android.content.SharedPreferences
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import net.sytes.rokkosan.mygetpermission.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) }
private val myPermission = Manifest.permission.READ_EXTERNAL_STORAGE
private var isCheckedNotAskAgain: Boolean = false
private val sharedPref: SharedPreferences by lazy { this.getSharedPreferences("myPref", Context.MODE_PRIVATE) }
private val permisLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) {
isCheckedNotAskAgain = false
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
myWorkWithPermission()
} else {
if (shouldShowRequestPermissionRationale(myPermission)) {
isCheckedNotAskAgain = false
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
} else {
isCheckedNotAskAgain = true
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
}
myWorkWithoutPermission()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
isCheckedNotAskAgain = sharedPref.getBoolean("isCheckedNotAskAgain", false)
binding.btnGetPermission.setOnClickListener{
getMyPermission()
}
}
private fun getMyPermission() {
if ( ContextCompat.checkSelfPermission(this, myPermission) ==
PackageManager.PERMISSION_GRANTED) {
isCheckedNotAskAgain = false
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
myWorkWithPermission()
} else {
if (isCheckedNotAskAgain) {
val openConfigDialogFragment = OpenConfigDialogFragment()
openConfigDialogFragment.show(supportFragmentManager, "simple")
if ( ContextCompat.checkSelfPermission(this, myPermission) ==
PackageManager.PERMISSION_GRANTED) {
isCheckedNotAskAgain = false
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
myWorkWithPermission()
} else {
if (shouldShowRequestPermissionRationale(myPermission)) {
isCheckedNotAskAgain = false
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
} else {
isCheckedNotAskAgain = true
with (sharedPref.edit()) {
putBoolean("isCheckedNotAskAgain", isCheckedNotAskAgain)
apply()
}
}
myWorkWithoutPermission()
}
} else {
permisLauncher.launch(myPermission)
}
}
}
private fun myWorkWithPermission(){
binding.tvResult.text = getString(R.string.got_permission)
}
private fun myWorkWithoutPermission(){
binding.tvResult.text = getText(R.string.failed_permission)
}
}
OpenConfigDialogFragment.kt
package net.sytes.rokkosan.mygetpermission
import android.app.AlertDialog
import android.app.Dialog
import android.content.DialogInterface
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import androidx.fragment.app.DialogFragment
class OpenConfigDialogFragment: DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return activity?.let {
val builder = AlertDialog.Builder(it)
builder.setMessage(R.string.reason_for_permission)
.setPositiveButton(R.string.ok,
DialogInterface.OnClickListener { dialog, id ->
val packageName = context?.applicationContext?.packageName
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:${packageName}")
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
})
.setNegativeButton(R.string.dismiss,
DialogInterface.OnClickListener { dialog, id ->
})
builder.create()
} ?: throw IllegalStateException("Activity cannot be null")
}
}
以下、旧文
2022 Feb. 12.
2022 Jan. 30.
build.gradle(:app)に記入したコンパイル設定
android {
compileSdk 31
defaultConfig {
minSdk 24
targetSdk 31
出典 https://codechacha.com/ja/android-request-runtime-permissions/
val PERMISSION_READ_EX_STOR: Int = 100
if ( isGrantedReadStorage()) {
myWork()
} else {
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_READ_EX_STOR)
}
fun isGrantedReadStorage(): Boolean {
return (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED)
}
override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
PERMISSION_READ_EX_STOR -> {
if (grantResults.isEmpty()) {
throw RuntimeException("Empty permission result")
}
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
myWork()
} else {
if (shouldShowRequestPermissionRationale(
Manifest.permission.READ_EXTERNAL_STORAGE)) {
requestPermissions( arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_READ_EX_STOR)
} else {
}
}
}
}
}
fun myWork() {
}