PROGRAMMING
Kotlin
ランタイムパーミッションの取得
ランタイムパーミッションの取得方法は何通りかありますが、その中で使いやすかったのが
Accompanist の Permissions ライブラリを使用する方法でした。
その Accompanist の Permissions ライブラリが非推奨になったようで、結果のあるアクティビティを起動する
rememberLauncherForActivityResult を使う方法が推奨されていました。
そこで、rememberLauncherForActivityResult を使ったコードを備忘録として載せておこうと思います。(2025.11.28)
≪開発環境≫
windows11
andriod studio Narwhal
MainActivity
普通の MainActivity です。
class MainActivity : ComponentActivity() {
private val viewModel: AudioRecorderViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AudioRecorderScreen(
context = this,
viewModel = viewModel)
}
}
}
パーミッションを要求しているスクリーン
rememberLauncherForActivityResult はコンポーザブル関数内でなければ使用できないようです。
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AudioRecorderScreen(context: Context, viewModel: AudioRecorderViewModel) {
/** Permission 要求 ======================================== */
val permission = Manifest.permission.RECORD_AUDIO
var showAlert by remember { mutableStateOf(false) }
var btnEnabled by remember{ mutableStateOf(true)}
// 権限リクエスト用の launcher を準備
val permissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
// 権限が許可された場合 ボタンを有効にする
btnEnabled = true
} else {
// 権限が拒否された場合 ボタンを無効にする
btnEnabled = false
// 拒否された場合、権限が必要なことを説明するダイアログ表示
showAlert = true
}
}
// コンポーザブルが最初に表示されたときに権限リクエストを実行
LaunchedEffect(Unit) {
// 権限が付与されていない場合、権限リクエストを開始
permissionLauncher.launch(permission)
}
if (showAlert) {
// 拒否された場合に、権限が必要なことを説明するダイアログ
AlertDialog(
onDismissRequest = {},
title = { Text("マイク使用の許可") },
text = { Text("録音の権限が必要です。設定を確認してください。") },
confirmButton = {
TextButton(
onClick = { showAlert = false },
) {
Text("OK")
}
},
)
}
/** ======================================================= */
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(100.dp))
Button(
onClick = { viewModel.startRecording() },
enabled = btnEnabled,
:
:
権限の有無でUIを切り分ける場合
権限が許可されている場合は OkScreen 、拒否されている場合は NoScreen 、というように切り分ける場合は、
var permissionGranted by remember { mutableStateOf(false) }
を利用する方法などが考えられると思います。
var permissionGranted by remember { mutableStateOf(false) }
val permissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
// 権限が許可された場合
permissionGranted = true
} else {
// 権限が拒否された場合
permissionGranted = false
}
}
LaunchedEffect(Unit) {
if (ContextCompat.checkSelfPermission(context, permission
) != PackageManager.PERMISSION_GRANTED
) {
// 権限が付与されていない場合、権限リクエストを開始
permissionLauncher.launch(permission)
}
}
if (permissionGranted) {
// 権限が許可されている場合に表示するUI
OkScreen()
} else {
// 権限が拒否されている場合に表示するUI
NoScreen()
}
複数のパーミッションがある場合
複数のパーミッションが有る場合は、パーミッションをリストにし、 複数のパーミッション用の RequestMultiplePermissions を使用するようです。
// パーミッションのリスト
val permissions = remember {
arrayOf(
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_AUDIO
)
}
// 複数のパーミッション用ランチャー(RequestMultiplePermissions)
val launcherMultiple = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestMultiplePermissions()
) { idGrantedList: Map<String, Boolean> ->
// permission には 「android.permission.READ_MEDIA_AUDIO」等が入るので必要に応じて利用する
idGrantedList.forEach { (permission, isGranted) ->
if (!isGranted) {
// 拒否された場合、権限が必要なことを説明するダイアログ表示
showAlert = true
}
}
}
LaunchedEffect(Unit) {
// 許可されていなければパーミッションリクエストが起動する
launcherMultiple.launch(permissions)
}
Kotlin
- ランタイムパーミッションの取得
- ViewMosel を経由せずに直接 Room を使う
- UiState の値が変わっても UI が変化しない?
- Room での SQL いろいろ
- Room を使うための Application Database Dao Repository ViewModel
- Room を使うための事前準備 (設定)
- 外部(共有)ストレージの Media ファイルへのアクセス
- 外部(共有)ストレージの Document ファイルへのアクセス
- 内部(App固有)ストレージへのアクセス
javascript
- ページャーを作る(簡易版)
- ページャーを作る 4/4
(クロスブラウザ対策)
(ページャー表示用メソッド)
(ページャーの使い方) - ページャーを作る 3/4
(イベント登録) - ページャーを作る 2/4
(スタイルの設定) - ページャーを作る 1/4
(ページャー用関数を準備)
(各要素を生成) - 自作カレンダーを作る 6/6
(11.~14.各種メソッド)
(15.簡単な使い方) - 自作カレンダーを作る 5/6
(09.祝休日の判定)
(10.閏年の判定) - 自作カレンダーを作る 4/6
(08.イベントの設定) - 自作カレンダーを作る 3/6
(07.スタイルの設定) - 自作カレンダーを作る 2/6
(05.カレンダーのマスのみ作成)
(06.各マスへ年月・日付を埋め込み) - 自作カレンダーを作る 1/6
(01.カレンダーの基を準備)
(02.各月の日数や年月日の区切り文字)
(03.前月・次月指定時の処理)
(04.前月・次月部分の年月を算出) - JS-Image-Resizerを使って画像を高画質で縮小
- ファイルを作成しローカルに保存
- モーダルウィンドウをクラス化
- ストップウォッチを作る
- XMLHttpRequest Lebel2を試してみる
- jQuery:Tableで親・子・兄弟要素を取得
- 文字列をセパレータ文字で分割し配列で返す関数
- forループのカウンタを使用している関数の定義
- クロージャの使いどころ
- JSONPでクロスドメイン
- AjaxでJSON形式のデータを扱う
- jsファイルからjsファイルを呼び出す
- jQuery:モーダルウィンドウを作ってみる
PHP
Java
- IntelliJ.Gradle.JavaFX(6) プラグイン org.beryx.jlink を使ってみる
- IntelliJ.Gradle.JavaFX(5) NSISでインストーラーを作る
- IntelliJ.Gradle.JavaFX(4) exewrapで実行可能jarをexe化する
- IntelliJ.Gradle.JavaFX(3) Jlink でカスタム JRE を作る
- IntelliJ.Gradle.JavaFX(2) すべての依存対象を含んだ Fatjar を作る
- IntelliJ.Gradle.JavaFX(1) アプリケーションを作る
- javaのコンパイルと実行
- イメージを回転する
- Exif情報を簡単に取得できるライブラリ
- 高画質で画像縮小
- JDBCによるデータベース操作