- 1. ViewModelProvider.Factory を省略する方法
- 2. GradleのVersion catalogで少し詰まったところ
- 3. Dagger Hilt alpha版からの移行
- 4. Using state in Jetpack Composeのcodelabで概念的な用語を拾うメモ
- 5. render problem エラーでレイアウトが表示されなくなった話
- 6. Android + FirebaseAuth で Twitter OAuth認可時の accessToken, secret の取得方法(Kotlin)
- 7. [Android]リリースビルドを実行して、スマホにインストールする方法
- 8. Android 11(API レベル 30)以上をターゲットにする
- 9. AndroidでFirebaseAuthを使用する際の証明書SHA-1(Debug, Release, PlayStore)
- 10. エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるルーティングの柔軟性(Sync関数概要)
- 11. GradleのVersion catalogでcompileSdk等も管理する方法
- 12. webインスペクタを使って、mac pcとandroid端末にてchromeの実機検証を行う
- 13. 【Jetpack Compose】ロングタップ時に Ripple Effect を表示する方法
- 14. エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるフィルタリング
- 15. Android11でアプリ内の領域に出力したファイルを自分の手元のPCに持ってこようとしたら Permission denied と言われる件
- 16. Jetpack Compose ConstraintLayoutの基本的な利用方法
- 17. JNIでNullableなint値を受け取り、jobjectからint値に変換する方法
- 18. Androidでキーボードを閉じられたのを検知する方法
- 19. Androidでアプリ起動時にEditTextにフォーカスがあたらないようにする方法
- 20. AndroidのEditTextからフォーカスを外す方法
ViewModelProvider.Factory を省略する方法
# ■ 概要
[ViewModel](https://developer.android.com/reference/androidx/lifecycle/ViewModel) にコンストラクタ引数が存在する場合に [ViewModelProvider.Factory](https://developer.android.com/reference/android/arch/lifecycle/ViewModelProvider.Factory) の実装を毎回作るのがめんどくさいので、それを省略する。# ■ Before
こういうのがめんどくさい“`kotlin
// Factory を呼ぶのがめんどい。
viewModels{ Factory(arg1) } // Factory を実装するのがめんどい。
class Factory(private val arg1: String) : ViewModelProvider.Factory {
@Suppress(“UNCHECKED_CAST”)
overri
GradleのVersion catalogで少し詰まったところ
小一時間ハマりました。
Version catalogでKotlin Serializationを管理したかっただけなんですが。。。# OK
“`groovy:gradle/libs.versions.toml
[versions]
kotlin = “1.5.31”[plugins]
kotlin = { id = “org.jetbrains.kotlin.android”, version.ref = “kotlin” }
kotlinserialization = { id = “org.jetbrains.kotlin.plugin.serialization”, version.ref = “kotlin” }“`
“`groovy:app/build.gradle
plugins {
…
alias(libs.plugins.kotlin)
alias(libs.plugins.kotlinserialization)
}
“`# NG
“`groovy:gradle/libs.versions.toml
[versi
Dagger Hilt alpha版からの移行
いささか気を逸した話題ではありますが……
記録しておきます。運用中のプロダクトで使用しているDagger Hiltのアップデートを行いました。
**2.28-alpha**から**2.38.1**までアップデートしています。
以下、やったことを順番に記載します。# build.gradleの編集
hilt-lifecycleが不要になりましたので依存関係から排除します
before
“` build.gradle
implementation “com.google.dagger:hilt-android:$dagger_hilt_version”
kapt “com.google.dagger:hilt-android-compiler:$dagger_hilt_version”
def hilt_lifecycle_version = “1.0.0-alpha02”
implementation “androidx.hilt:hilt-lifecycle-viewmodel:$hilt_lifecycle_version”
Using state in Jetpack Composeのcodelabで概念的な用語を拾うメモ
以下で色々概念的な説明があるので拾っていきます。
Using state in Jetpack Compose
https://developer.android.com/codelabs/jetpack-compose-state#0なんとなくはそれぞれ分かっているんですが、ちょっと一旦用語の整理的な感じなことをしておきます。
だんだん下に行くにつれてレベルアップしていくかも??# Stateとは?
> State in an application is any value that can change over time.
> For example it may be a value stored in a Room database, a variable on a class, or even the current value read from an accelerometer.
アプリケーションにおけるStateとは時間とともに変化しうる値。
例えばRoom databaseに保存される値やクラスにある変数。加速度計から読み取った今の値でさえsta
render problem エラーでレイアウトが表示されなくなった話
2021/11/3 初版
# 事象
AndroidStudioのautofill機能でレイアウトを作っている途中で一回落として再起動したら画像のようにレイアウトが表示されなくなる![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/16d90885-47ff-aab7-e8b7-b2c1d7684d38.png)
# 試したこと(もしかしたらこっちで解決する人がいるかも)
– 下記URLに従ってキャッシュを無効化して再起動
– https://blog.mktia.com/how-to-solve-render-problems-on-android-preview/– APIレベルが高すぎると発生するらしいという記事を見つけたのでレベルを下げる
– https://teratail.com/questions/24420
※よくよく読んでみるとAPIレベル23で当時不具合が発生していたという内容っぽかったです
※記事が少し古い
Android + FirebaseAuth で Twitter OAuth認可時の accessToken, secret の取得方法(Kotlin)
# 概要
Android アプリで FirebaseAuth を使って Twitter OAuth の認可を受けた後、サーバに accessToken と secret を送り、サーバ側で Twitter API を用いて認可されている情報の参照などを行います。
クライアント(Android アプリ)側の実装については、基本的に公式ドキュメント(以下)に記述されている通りの方法でできますが、**accessToken と secret の取得方法** で少し迷ったので、備忘録を兼ねてその解決方法を記します。
https://firebase.google.com/docs/auth/android/twitter-login?hl=ja
# accessToken, secret の取得方法
Androidアプリが Firebase SDK の Twitter OAuth で認可を受けると、`OnSuccessListener::onSuccess` がコールバックされ、その引数(`AuthResult`)から accessToken と secret を取得できます。
以
[Android]リリースビルドを実行して、スマホにインストールする方法
#はじめに
おはようございます。システムエンジニアのDiavoloです。最近、仕事でAndroidStudioを触ることが増えてきました。当方、Androidアプリ開発をがっつり経験したことがなく、またテレワークのため、気軽に聞ける相手がいるわけでもない状態です。
そんな感じで、AndroidStudioの操作にも慣れておらず。トホホ・・・。今回は、apk をリリースビルドして、スマホにインストールする手順を記事にしました。
GooglePlayにアプリを上げたことはなく、今までは、デバッグビルドなのかリリースビルドなのかを意識せずに使っていました。
とは言っても、今回もGooglePlayにアプリを上げる訳ではないので、スマホとPCをUSBでつないでインストールする手順の記事になっております。#1.Build Variant を debug から release に変更します。
メニューのBuildからSelect Build Variantを実行すると、Build Variantsを選択する画面が出てきますので、
Active Build Variantを releas
Android 11(API レベル 30)以上をターゲットにする
![Android 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/32efeea3-3ad2-ac4c-dfbb-dec24d7ed5e0.png)
“`
2021 年 11 月 1 日以降に Google Play で配信しているアプリおよびゲームを更新する場合、
Android 11(API レベル 30)以上をターゲットにすることが必須となります。
この日を過ぎると、targetSdkVersion が 30 未満の新しい App Bundle と APK はアップロードできなくなります。なお、Wear OS アプリには API レベル 30 の要件は適用されません。
アプリのターゲットを最新の API レベルに設定することで、セキュリティとパフォーマンスを大きく改善できます。
もちろん、アプリは古い Android バージョン(minSdkVersion まで)でも引き続き動作します。
“`2021年11月1日からGoogle Playにアップロードする場合
AndroidでFirebaseAuthを使用する際の証明書SHA-1(Debug, Release, PlayStore)
# 概要
Android で Firebase SDK の Authentication を使って Twitter の OAuth 認可機能を実装する場合、[コチラの手順](https://firebase.google.com/docs/auth/android/twitter-login?hl=ja)を見れば特に問題なく実装できると思いますが、以下 3 種類の SHA 証明書フィンガープリントを登録する必要がある点が、公式ドキュメントだと分かり難いかもしれないので解説します。
1. デバッグビルド時の証明書フィンガープリント(SHA-1)
1. リリースビルド時の証明書フィンガープリント(SHA-1)
1. PlayStore公開時の証明書フィンガープリント(SHA-1)> Firebase の「プロジェクトの設定」-「マイアプリ」-「(対象のAndroidアプリ)」で「フィンガープリントの追加」で上記 3 つを次のように登録します。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c
エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるルーティングの柔軟性(Sync関数概要)
## はじめに
Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、AndroidやiPhone(Swift, Objective-C)のようなスマートフォンやエッジデバイス用の組込データベースであるCouchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。
[エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるアクセス制御モデル](https://qiita.com/yoshiyuki_kono/items/b9eb6ddae93fc98f4f7b)にも書いた通り、Sync Gatewayでは、ユーザーとロールとチャネルによって、データ(ドキュメント)のルーティングを構成します。
ここで紹介するSync関数(Sync Function)を定義することによって、アプリケーションは、データルーティングとアクセス制御を実装することができます。
[Couchbase Mobile
GradleのVersion catalogでcompileSdk等も管理する方法
他のことは全部下記に書いてあります。
https://star-zero.medium.com/gradle%E3%81%AEversion-catalog%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%AE%A1%E7%90%86-eb81f8e88444
# 環境
Android Studio Bumblebee | 2021.1.1 Beta 2
Bumblebeeでは`enableFeaturePreview(‘VERSION_CATALOGS’)`の追加が必要でした。
“`groovy:settings.gradle
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}enableFeaturePreview(‘VERSION_CATALOGS’) // <- 追加
webインスペクタを使って、mac pcとandroid端末にてchromeの実機検証を行う
はじめに:
開発者向けオプションをandroid側で、onにする。→端末情報を何回かクリックすると開放。
USBデバッグの設定をonにして、デバッグモードを使えるようにする。
これを行うと開発者用モードを使用できるようになる。webインスペクタ:
参考URL上では、USB接続と言ってますが、type cで繋げています。(androidがtype cなので)デバッグモードが使えるようになっていれば、chrome://inspect/#devicesにアクセスすると、Remote Targetの下に自分の端末が出ているはず。
##### ※このときに、type c同士の接続でうまくいきました。一方がtype c 一方がusbの形のケーブルだとdebugツールが反応してくれませんでした。なので、うまくいかない時には、ケーブルなどを変えてみてはいかがかと!
設定がうまくいけば、Remote Targetの下にandroid側で開いているタブ一覧が表示されるので、inspectをクリックします。
すると、pc側で以下のような画面が現れます。実際に動かしたり、html,cssをいじる
【Jetpack Compose】ロングタップ時に Ripple Effect を表示する方法
Jetpack Compose で任意の Composable にロングタップ時の操作をさせたい場合について、公式では下記のように記載されています(2021 年 11 月 1 日時点)。
“`kotlin
Modifier.pointerInput(Unit) {
detectTapGestures(
onLongPress = { /* ロングタップ時に呼ばれる */ }
)
}
“`引用元:[操作 | Jetpack Compose | Android Developers](https://developer.android.com/jetpack/compose/gestures#tapping)
ですが、これだとロングタップ時に Ripple Effect が表示されず、どこがロングタップされたのかがわかりづらいです。
エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるフィルタリング
## はじめに
Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、AndroidやiPhone(Swift, Objective-C)のようなスマートフォンやエッジデバイス用の組込データベースであるCouchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。
[エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるアクセス制御モデル](https://qiita.com/yoshiyuki_kono/items/b9eb6ddae93fc98f4f7b)では、データ同期に参加するモバイル端末/ユーザーの観点からみたコントロールについて紹介しました。
本稿では、データ同期されるデータ(ドキュメント)の観点からみたコントロールについて紹介します。
[Couchbase Mobileアプリケーション開発へのロードマップ](https://qiita.com/yoshiyuki_ko
Android11でアプリ内の領域に出力したファイルを自分の手元のPCに持ってこようとしたら Permission denied と言われる件
# 概要
掲題について、調べると手順が出てくるのですが、おおよそ– Android端末内の/sdcard/にファイルを一度コピー
– それをadb pull でPCへコピーという手順になるのですが /sdcard/(実際には /storage/self/primary へのシンボリックリンク)へのコピーが Permission denied となってしまいました。
# 端末
Android11# 今回の回避方法
おそらく正しいアプローチがあるのだと思いますが、今回そこまで時間をかけられなかったので、以下でとりあえずの回避が出来ました。アプリのファイルのパスを確認
“`
TANMATSU:/ $ run-as com.xxx.xxxxxxxxzzz
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz $ cd files
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz/files $ pwd
/data/user/0/com.xxx.xxxxxxxxzzz/files
TANMATSU:/data
Jetpack Compose ConstraintLayoutの基本的な利用方法
AndroidのJetpack ComposeでConstraintLayoutの基本的な利用方法です。
この記事は以下のバージョンに対応しています。| | バージョン |
|:———–|:————:|
|Jetpack Compose|1.0.4|
|androidx.constraintlayout:constraintlayout-compose|1.0.0-beta02|
|AndroidStudio|ArcticFox 2020.3.1 Patch 3|# 基本的な利用方法
Jetpack ComposeでConstraintLayoutを利用するために固有の`androidx.constraintlayout:constraintlayout-compose`というライブラリを導入する必要があります。`ConstraintLayoutSample`を例に基本的な利用方法を説明します。
“`Kotlin:ConstraintLayoutSample.kt
@Preview(showBackground = true)
@Compo
JNIでNullableなint値を受け取り、jobjectからint値に変換する方法
# 概要
JNIを使用したAndroidのアプリをKotlinで作成しているとき、JNIの関数にNullableのKotlinのInt値を渡したいということがあった。
Nullableでない値を渡す場合であればネイティブ側でjintとして受け取るところなのだが、Nullableの場合だとエラーが発生してjintは使用できなかった。
そのため、Nullableな値をネイティブ側でjobjectとして受け取った後にjobjectからint値に変換するということを行ったのでその方法を記載する。# JNIでjobjectからint値に変換する方法
以下のようにすることでjobjectをint値に変換することができる。
“`cpp
// JNI関数の定義はKotlin側の別の場所で以下のように定義されている
external fun sampleFunc(value: Int?): Int// ネイティブ側のコード
// サンプルなので関数名は適当かつ、int値を返すだけのコード
JNIEXPORT jint JNICALL
con_example_app_sampleFunc
Androidでキーボードを閉じられたのを検知する方法
# 概要
AndroidのEditTextを入力時、戻るボタンを押してキーボードを閉じたときに特定の処理を行いたいことがあった。
そのため、Androidで表示されているキーボードが閉じられたのを検知する方法を記載する。
言語はKotlin# キーボードが閉じられたのを検知する方法
以下のようにすることで、キーボードが戻るボタンで閉じられたのを検知できる。
“`kotlin
// EditTextを継承したクラスで以下を定義
override fun onKeyPreIme(key_code: Int, event: KeyEvent): Boolean {
if(key_code == KeyEvent.KEYCODE_BACK && evnet.action == KeyEvent.ACTION_UP) {
// TODO キーボードを閉じたときに実行したい処理を書く
}
return super.onKeyPreIme(key_code, event)
}
“`
Androidでアプリ起動時にEditTextにフォーカスがあたらないようにする方法
# 概要
Androidでアプリ作成時にアプリ起動時にEditTextにフォーカスがデフォルトであたっていた。
そのため、特定の端末ではアプリ起動時にキーボードが表示されてしまうという現象が発生した。
この現象を修正するために行った、起動時にEditTextにフォーカスがあたらないようにする方法を記載する。
アプリを作成する際に使用していた言語はKotlin# アプリ起動時にEditTextにフォーカスがあたらないようにする方法
AndroidのLayoutのxmlでEditTextの親のレイアウトに以下のコードを追加する。
こうすることでアプリ起動時にEditTextにフォーカスはあたらなくなる。“`xml
android:descendantFocusability=”beforeDescendants”
android:focusableInTouchMode=”true”
“`
AndroidのEditTextからフォーカスを外す方法
# 概要
AndroidのEditTextで入力を確定したあともフォーカスがそのまま残ることがあった。
入力確定後はEditTextからフォーカスは外れてほしい。
そのためAndroidでEditTextからフォーカスを外す方法を記載する。
言語はKotlin# フォーカスを外す
以下のコードを入力確定時のイベントで実行するようにすることでフォーカスが外れるようにすることができる。
“` Kotlin
val parent = parent as View
parent.isFocusable = true
parent.isFocusableInTouchMode = true
parent.requestFocus()
“`