たかぎとねこの忘備録

プログラミングに関する忘備録を自分用に残しときます。マサカリ怖い。

Android

ビルドバリアントごとに処理の実装を切り替えたい場合に発生したコンフリクトを解消する方法

ビルドバリアントでは、mainディレクトリに置いてあるファイルとの差分の内容を、ビルドバリアントのディレクトリに配置することで、そのビルドバリアントを選択してビルドした際に優先的に読み込まれるのかと思っていた。 結論から言うと、ビルドタイプの名…

通知に関する実行時の権限を要求するダイアログが表示されない時に考えるべきこと

launchPermissionRequest()を呼び出して、通知に関する権限の確認を行いたい場合がある。 val permission = Manifest.permission.POST_NOTIFICATIONS val permissionState = rememberPermissionState(permission = permission) when { permissionState.statu…

ViewModelを初期化しようとして`Module with the Main dispatcher had failed to initialize`というエラーが出た話

テスト時にViewModelを初期化する処理を次のように書いた。 class LabelListViewModelTest { private val testScheduler = TestCoroutineScheduler() private val dispatcher = StandardTestDispatcher(testScheduler) private val repository = mockk<LabelRepository>(relax</labelrepository>…

`builder: Modifier.() -> Modifier`の読み方

DroidKaigi 2022のコードを眺めていると次のような記述にでくわした。 inline fun Modifier.ifTrue(value: Boolean, builder: Modifier.() -> Modifier): Modifier { val modifier = Modifier return then(if (value) modifier.builder() else modifier) } f…

NavigationBarのNavigationBarItemを何度もタップすることにより、アプリが強制終了する場合の対処法

NavigationBarのNavigationBarItemを何度もタップし、最後に一番左のNavigationBarItemを連打するとアプリがクラッシュする現象に遭遇した。 これがその時のエラーの抜粋。 java.util.NoSuchElementException: List contains no element matching the predic…

AndroidアプリでJetpack Composeを使って使用しているライブラリのライセンスを表示してみる

Androidアプリを開発していると直面するライセンス表示問題。 色々調べるとCookpadさんが公開しているプラグインにたどり着いた。だが、お察しのとおりすでにアーカイブされている。 github.com 代わりにおすすめされているのが、Googleが公開しているOSS Li…

以前の画面の状態が意図せぬ形で復元されてしまう場合の対処法

次の様な画面遷移図のアプリを考えてみる。 今までは全ての遷移時に次の様なコードを実行していた。 fun navigate( destination: TnaNavigationDestination, route: String? = null, from: NavBackStackEntry? = navController.currentBackStackEntry ) { if…

Androidのスプラッシュスクリーンで簡単に背景色をダークモード対応させる方法

Android Studioで、resディレクトリを右クリックして、New -> Android Resource Directoryを選択する。 Directory Nameにvalues-nightを入力して、OKをクリックする。 values-nightディレクトリが表示されない場合は、Projectビューに切り替える。 values-ni…

Androidではデータベースに画像のリソースIDを保存してはいけないらしい!

Androidアプリをコンパイルした後だったり、新しい画像をResource Managerに追加した後に、アプリで表示されていた画像がまったく異なる他の画像に置き換えられているケースが多々あった。 そろそろ対処しないとなーと思って色々調べていたら次のコメントを…

Jetpack Composeでディープリンクを開くテストをしてみる

ディープリンクを開くには次の書式でコマンドを実行する。 adb shell am start -W -a android.intent.action.VIEW -d <ディープリンクのURI> <アプリのパッケージ名> 実際に入力するときは次の様な感じ。 adb shell am start -W -a android.intent.action.VI…

Androidの通知に表示したいアイコンを用意する

Androidでは、アプリのアイコンと通知用のアイコンは異なる。 特に異なる部分はカラーの部分で、通知用のアイコンには基本的に色をつけることはできない。 Android 5.0以降では通知機能が大幅に変更されたため、アイコンのカラーチャンネルがすべて無視され…

React NativeでFirebaseのダイナミックリンクをハンドリングしてみる

Firebase Authに登録されたメールアドレスを認証したあと特定の画面に遷移して結果を表示したいというモチベーションが沸々と湧きあがった。 流れとしては次のような感じ。 firebase/authのsendEmailVerificationメソッドを利用してユーザーのメールアドレス…

EASを使ってAndroidアプリをビルドして実機で動かしてみような話

EASにはおおまかにわけて2種類の主要なサービスがある。 EAS Build EAS Submit EAS Buildは、ExpoやReact Nativeで作成されたアプリのバイナリをビルドするためのホスティングサービスです。 EAS Submitは、AppleのAppStoreやGoogle Play StoreにEASビルド…

一つの端末に複数環境用にビルドされたapkをインストールする話

ひとつの端末に本番環境、ステージング環境、開発環境用のそれぞれの環境でビルドされたアプリをインストールするためには、動的にapp.config.jsのios.bundleIdentifierフィールドとandroid.packageフィールドを変更する必要がある。 そのために環境変数APP_…

"Generating a new Keystore is not supported in --non-interactive mode"というエラーが出た場合の対処法

いつものようにGitHub Actions上で、EAS Buildを実行していたところ次のようなエラーが発生した。 ✔ Using remote Android credentials (Expo server) Error: Generating a new Keystore is not supported in --non-interactive mode 解決方法として、Androi…

Androidでインターネット接続の権限を追加する方法

AndroidManifest.xmlを開いて、<manifest>と<application>の間に<uses-permission android:name="android.permission.INTERNET" />を追加する。 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> </manifest></uses-permission></application></manifest>

Coroutineを学んでみた

CoroutineはノンブロッキングプログラミングをKotlinで使えるようにした機能。非同期操作を安全に扱える機能などが含まれている。 導入 Coroutineを使うにはkotlinx.coroutinesというパッケージを使わないといけない。 build.gradle.ktsファイルを開いて、de…

Kotlinはじめてみた

積読していたKotlinの入門本をちょっとずつ読んでみる。 基礎からわかる Kotlin | 富田健二 | 工学 | Kindleストア | Amazon 環境構築 環境設定から始める。 JetBrainsの公式サイトからIntelliJ IDEAをダウンロードする。 ちなみに、僕の場合はCommunity版の…