- 1. 【Android】Firebaseを使っていて、Could not deserialize object…エラーが発生した時の解決方法
- 2. [Truth] MapSubject#containsExactlyEntriesIn()とMapSubject#containsAtLeastEntriesIn()の違い
- 3. [Jetpack Compose] 再コンポジションされているのにUIが更新されない
- 4. 【Android】実質たった3行でCloud Storageに画像をアップロードする方法
- 5. 【Android】JetpackCompose の基本【kotlin】
- 6. 【Android】Jetpack Composeで、表示させたいURLの画像をImageに渡す方法
- 7. Androidのホーム画面にウィジェットを配置しよう
- 8. [WearOS] Androidアプリ開発との相違点
- 9. CoroutineDispatcherをHiltでいい感じにDIする
- 10. 【Android】未使用リソースをまとめて削除する方法
- 11. Android の Geofence で気をつけること
- 12. 【Android】Jetpack Composeで、イメージピッカーを作ってみる【rememberLauncherForActivityResult()編】
- 13. SearchViewでソフトキーボードを非表示にする
- 14. 【Android】LazyColumnに手を出す前に、スクロール可能なColumnを作る方法
- 15. AndroidのMediaExtractorで映像・音声のソース確認
- 16. Android Enterpriseを支えるAndroid OSのソースコード解説
- 17. Google mapをJetpack Composeで扱うための環境構築
- 18. AndroidでVolleyを使った送信でcookieを使用する場合
- 19. Cloudflare Tunnelを使ってAndroidに立てたWebサイトを外部公開できるか検証してみた
- 20. 複数のRecyclerView間での移動を含むドラッグドロップ並べ替え機能を実装する
【Android】Firebaseを使っていて、Could not deserialize object…エラーが発生した時の解決方法
# エラーが発生した当時の環境
Firestoreに保存されているドキュメントを取得する際に、`toObject()`を呼び出してドキュメントをデータクラスのインスタンスに変換しようとしました。
その時に使用したのが、以下の内容の`Member`データクラスです。プロパティとして、`String`型や`DocumentReference`型に`Timestamp`型など、Firebaseを使う方にはお馴染みの内容かと思われます。
“`kotlin
data class Member(
val id: String = “”,
val name: String = “”,
val groupRef: DocumentReference,
val imageRef: DocumentReference? = null,
val createdAt: Timestamp = Timestamp(Date()),
)
“`そして、いつものように取得した`DocumentSnapshot`インスタンスの値に対して`toObject()`を呼び
[Truth] MapSubject#containsExactlyEntriesIn()とMapSubject#containsAtLeastEntriesIn()の違い
## 概要
ユニットテストを書いていて、Truthの `MapSubject#ontainsExactlyEntriesIn()` と `MapSubject#containsAtLeastEntriesIn()` の違いが分からなかったのでまとめました。## 環境
“` app/build.gradle
implementation com.google.truth:truth:1.1.3
“`## メソッドの説明から見る「違い」
それぞれのメソッドコメントを直訳しました。
### MapSubject#containsExactlyEntriesIn()
> Fails if the map does not contain exactly the given set of entries in the given map.
> 与えられたマップに少なくとも与えられたエントリのセットが含まれていない場合、失敗します。### MapSubject#containsAtLeastEntriesIn()
> Fails if the map does not contai
[Jetpack Compose] 再コンポジションされているのにUIが更新されない
## 概要
Jetpack Composeを使用して画面を作成した際、コード上は再コンポジションされているのに、端末上のUIが更新されないという事象に遭遇しました。
“` MainActivity.kt
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val counterState = remember { mutableStateOf(0) }
Counter(
count = counterState.value,
updateCount = { newCount ->
counterState.value = newCount
【Android】実質たった3行でCloud Storageに画像をアップロードする方法
# この記事で紹介する内容
今回は、Androidアプリで画像をアップロードする機能を実装したい方向けに、Firebaseを使えば簡単に画像アップロード機能を実装できることを紹介したいと思います。
具体的にいうと、この記事を読めば、**実質たった3行のコード**を書くだけで、画像を含めたファイルのアップロード機能を作成することができるようになります。
この記事を読んだ後に、「なんだ、Firebaseってめっちゃ使いやすいじゃいないか」と思っていただいた方にはFirebaseの公式ドキュメントをご一読いただき、その機能の豊富さとシンプルさに是非驚いていただけると幸いです。
https://firebase.google.com/docs/storage/android/start#kotlin+ktx
# 依存関係を追加する
Cloud Storageライブラリの依存関係を追加します。
そのために、以下の内容をbuild.gradleのdependenciesに追加してください。
“`gradle
implementation platform(‘com.google.
【Android】JetpackCompose の基本【kotlin】
# はじめに
今回はJetpackComposeの基本的なことを記事にします
自分の中の解釈で書いているので間違っている点もあるかとは思いますが、使いながら慣れていき
間違っていることに気が付いたら直していければな と思います# 基本
“`
@Composable
“`
上のアノテーションが付けられた関数がコンポーズ可能な関数“`
@Preview
“`
コンポーズ可能な関数に上のアノテーションを付けてプロジェクトをビルドすることで
Android Studio内でプレビューを表示することができます“`
@Composable
private fun Hoge(name: String) {
Surface(color = Color.Green) {}“`
Composeで作られたUIの背景色を変える場合はSurfaceでラップします
Surfaceは色を受け取ることができるので背景色に指定したい色を引数に渡しますSurfaceやTextなどのCompose内の要素は **modifier** という省略可能なパラメータにより親レイアウ
【Android】Jetpack Composeで、表示させたいURLの画像をImageに渡す方法
# アプリを作っていて・・・
ユーザーが保存した画像を、アイコンとして表示させたいなと思っていました。
ところが、今までアプリの内部で保存されていた画像リソースを参照して表示するくらいの機能しか作ったことがありませんでした。そこで、どうやったら画像URLをアプリ上で表示できるようになるかを調べたので、今後の自分への忘備録として記しておこうと思います。
今回は執筆時点のバージョンが**2.2.2**の**Coil**ライブラリを使用した場合の解説となりますので、あらかじめご了承ください。
# 画像を読み込むために必要なライブラリのインポート
外部URLに存在する画像を読み取るためには、**Coil**ライブラリが必要になります。
“`gradle
implementation(“io.coil-kt:coil:2.2.2”)
“`https://coil-kt.github.io/coil/compose/
続いて、Jetpack ComposeにてCoilを使いたいので、次のライブラリをインポートします。
“`gradle
implementation(“i
Androidのホーム画面にウィジェットを配置しよう
(今年一回目の投稿です)
今回はAndroidのホーム画面に自分カスタムのウィジェットを配置します。
カスタムといっても、自分の好きなWebAPIを呼び出すだけモノのです。
ですが、サーバを立ち上げてWebAPIの呼び出し先での後処理をカスタマイズすれば、なんでもできますよね。
ということで、ウィジェットを配置するAndroidアプリケーションと、WebAPI呼び出しを受け付けるNode.jsサーバの2本立てです。ソースコードもろもろは以下のGitHubに上げてあります。
poruruba/CustomWidget
https://github.com/poruruba/CustomWidget
# 全体構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/f9278efc-6f24-2878-d212-518d31cb0cf0.png)
ウィジェットのためのAndroidアプリケーションと、WebAPI呼び出しを受け付けるNode.jsサーバの2つからなりま
[WearOS] Androidアプリ開発との相違点
## :speaker: 今回話すこと
– Androidアプリ開発とWearアプリ開発との相違点について## :thinking: Androidアプリ開発との相違点
### :ok_woman: 同じところ :ok_woman:
#### AndroidStudioで開発できる
エミュレーターもWearOS端末で実行できるので、実機がなくても実行は出来ます。
ワイヤレスデバックにも対応しています。AndroidのエミュレーターとWearのエミュレーターを接続することも出来ます。
#### Jetpackライブラリを使用できる
Jetpackライブラリなどが使える点で、Androidエンジニアとしての知識がそのまま活用できます。
そのため、ViewModelやFlow, Hiltなどを用いたAACベースのアーキテクチャを採用できます。
また、UIもViewベースでの書き方とComposeベースの書き方両方あるので、特に変わりはないです。#### OSのバージョンが対応されている
同じである点か微妙ですが、一応。
AndroidのAPIレベルと対応されています。
CoroutineDispatcherをHiltでいい感じにDIする
# 概要
CoroutineのCoroutineDispatcherをHiltでDIできるようにした方法です。# 解決したいこと
まず前提としてCoroutinesをAndroidで使用する際に下記のように実装することが好ましいとされています。
また今回は1と3の問題を解決するためにCoroutineDispatcherをDIする必要性が出てきました。
1. suspend関数はmain-safeな実装にすること
2. suspend関数はcancellableな実装にすること
3. withContextのCoroutineDispatcherはハードコードしないことhttps://developer.android.com/kotlin/coroutines/coroutines-best-practices?hl=ja
## main-safeな実装について
suspend関数はMainスレッドから呼び出されても問題ない(クラッシュしたりフリーズしない)実装にすることが好ましいとされています。
## withContextのCoroutineDispatcherはハードコ
【Android】未使用リソースをまとめて削除する方法
# はじめに
本日は大晦日ですね、年の瀬となれば大掃除ですが、プロジェクト内のリソース整理できていますか?
歴史の長いプロジェクトであれば人の入れ替わりもあり、その辺りも疎かになりがちだと思いますが、全てサクッと消す方法があるので備忘録的にもまとめておこうと思います。# まとめて削除する方法
削除する方法は至って簡単です。
AndroidStudioのメニューから Refactor > Remove Unused Resources…を選択する形になります。上記に沿って選択していくと以下ダイアログが表示されますが、直ぐに消すのが不安な方はプレビューを選択していただければ消す前に削除する対象の一覧が確認できます。
もう年末ですが、今年とある機能の開発で戦った Android の Geofence について [Android Advent Calendar 2022](https://qiita.com/advent-calendar/2022/android) に書こうと思います。試しに動かすと動いちゃうんですよね。コイツは。でも少し深く掘って見ると様々な障害点が見つかります。
# Geofence とは
https://developer.android.com/training/location/geofencing?hl=ja
事前に設定した領域からの出入りをイベントとして処理を行うことができます。
:::note info
さらに Google Play 開発者サービスを利用の [Activity Recognition Transition API]( https://developers.google.com/location-context/activity-recognition) を利用すると、行動の様子(歩く・走る・止まる・乗り物)も含めてイベントにすることができます
【Android】Jetpack Composeで、イメージピッカーを作ってみる【rememberLauncherForActivityResult()編】
# イメージピッカーをJetpack Composeで作ってみたい
なにかしらの登録画面で、ギャラリーから画像を選択して、その選択した画像を登録できるようにしたいと思ったことはありませんか?しかも、Jetpack Composeを使って。
僕はこの問題に、今まさに直面しています。
そこでこの記事では、未来の自分への忘備録として、Jetpack Composeでイメージピッカーを作成する手順を解説しようと思います。
# rememberLauncherForActivityResult()とは
実際に、イメージピッカーの実装に入る前に、あるメソッドについて説明しておかないといけません。
そのメソッドとは、`rememberLauncherForActivityResult()`のことです。コンポーザブル内で、ファイルを選択したり保存したりする機能を実装したことがある方なら見覚えがあるかもしれません。
公式のドキュメントには次のように書かれています。
> rememberLauncherForActivityResult() API を使用すると、コンポーザブル内のアクテ
SearchViewでソフトキーボードを非表示にする
AndroidアプリでActionBarにSearchViewを実装する際のソフトキーボードを非表示にする方法は、以下の通りです。
今回は、Fragmentに## レイアウトファイル
“`menu/search.xml
AndroidのMediaExtractorで映像・音声のソース確認
# はじめに
株式会社THIRD IT開発部でモバイル開発チームでアプリ(Android及びiOS)の開発を行なっているエンジニアです。
弊社では不動産の点検や作業報告などをスマートフォンで行うためのアプリとして,管理ロイド等のアプリを開発及びリリースしています。管理ロイドではマンション等の各種点検業務でビデオデータを添付する事があります。
添付したビデオデータがごく稀に壊れている場合があるため`MediaExtractor`を使用しメディアデーター内のソースを確認する事としました。# ビデオ撮影について
ビデオ撮影については[ACTION_VIDEO_CAPTURE](https://developer.android.com/reference/android/provider/MediaStore#ACTION_VIDEO_CAPTURE)を使用してカメラアプリに撮影してもらっています。> カメラアプリ呼び出し例
“`kotlin
val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
startActivity
Android Enterpriseを支えるAndroid OSのソースコード解説
今年のAndroid Enterpriseアドベントカレンダーの締めくくりとして、この過疎っているアドベントカレンダーで紹介してきた機能の裏側(おもにAndroidフレームワークのソースコード)の解説を軽くしてみようと思います!
## まえおき
Android Enterpriseにはいくつかの動作モードがあります。
https://support.google.com/work/android/topic/9563482?hl=ja&ref_topic=9621435
1つのデバイスを仕事専用デバイスとしてMDM管理下に置くFully Managed deviceだけではなく、個人端末の業務利用(いわゆるBYOD)や業務端末の個人利用(BYODの逆)ができるWork Profileと呼ばれるモードがあるのが特徴的です。
1つのデバイスを複数のプロファイルで利用する、それをAndroid OS / Google Playサービスはどのように利用しているのでしょうか?
## Android OSはそもそも複数ユーザで利用ができる
Androidは、もう8年前くらいのバージョ
Google mapをJetpack Composeで扱うための環境構築
公式ドキュメントのインストール手順通りに進めてもうまく行かない箇所があったのでここに調査結果をまとめる。
なお、すでにGoogle mapのAPIキーは取得しているものとする。# プロジェクトを作成する
AndroidStudioのNew ProjectからEmpty Compose Activityを選択し、プロジェクトを作成する。# Google mapをAndroidで扱えるように設定する
Google maps platformの[Set up an Android Studio project](https://developers.google.com/maps/documentation/android-sdk/config)を参考に、以下の設定をしていく。### moduleレベルのbuild.gradleに依存関係を追加
“`gradle
dependencies {
implementation ‘com.google.android.gms:play-services-maps:18.1.0’
// …
}
“`
バージョンは
AndroidでVolleyを使った送信でcookieを使用する場合
# VolleyでCookieって・・・どうすんねん?
[AndroidでVolleyを使ってMultipart/form-data形式で送信してみる](https://qiita.com/cozyk100/items/927da723204f5c54a35b)でAndroidでVolleyを使ってHTTPでMultipart/form-data形式で送信する例を書きましたが、送信する相手がAPI形式で同時に認証もやってくれるならいいのですが、そうではない場合があります。例えば、API形式のI/Fが全く用意されていないく、ブラウザからHTMLで送信する画面しか用意されていない場合があります。この場合、通常
1. ログイン
1. Multipart/form-data形式で送信
1. ログアウトという流れになりますが1.でサーバ側からのレスポンスヘダーのset-cookieで払い出されたcookieをHTTPヘダーに設定して2.で送信しないと「ログインされていません」となります。
Volleyを使って1.、2.、3.で3回通信する場合、1.のレスポンスのset-cookieを2
Cloudflare Tunnelを使ってAndroidに立てたWebサイトを外部公開できるか検証してみた
## はじめに
[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/)はローカルに立てたサーバーを外部からアクセスできるようにするトンネリングサービスです。同じようなサービスに[ngrok](https://ngrok.com/)などがあります。今回はAndroidのTermuxに立てた.NETサーバーをCloudflare Tunnelを使って外部に公開できるか検証してみます。
## Cloudflare Tunnelがどのように動作するか
Cloudflare Tunnelは、[cloudflared](https://github.com/cloudflare/cloudflared)をインストールすることで動作します。cloudflaredは、近くのCloudflareデータセンターに対して長期間の接続を作ります。Cloudflareがドメインへのリクエストを受信すると、接続しているデータセンターにリクエストを中継します。中継されたリクエ
複数のRecyclerView間での移動を含むドラッグドロップ並べ替え機能を実装する
一つのRecyclerViewの中でdrag&dropでの並べ替え機能は、ItemTouchHelperを利用すると簡単に実装することができます。
https://qiita.com/ryo_mm2d/items/973b056b52b111bb58d4
ただ、一つのRecyclerViewの中の並べ替えではなく、複数のRecyclerView間での項目移動もしたくなります。候補リストから取捨選択もできるような機能で見られる以下のような動きですね。
実装方法としてはいくつかあると思いますが、AndroidのDrag&Dropフレームワークを利用する方法で説明しようと思います。ドラッグ中の描画や、対象となるViewの判定処理などを実装する手間がいらないというメリットがありますが、本来想定されている使い方は、View間のD