Android関連のことを調べてみた2021年11月30日

Android関連のことを調べてみた2021年11月30日

launchWhen〇〇〇は止めてrepeatOnLifecycleを使おう!

# はじめに

皆さんはlaunchWhenCreated, launchWhenStarted, launchWhenResumedを使ってますか?coroutinesでライフサイクルを意識して書く場合、必須とでも言うべきメソッドです。

ですが、Flowでこれらを利用するのは避けたほうが良いです。なぜか?
launchWhen〇〇〇ではFlowが完全には停止せず、リソースが消費される可能性があるからです。

https://developer.android.com/topic/libraries/architecture/coroutines

> Lifecycle が STOPPED の場合、前者の API はコルーチンをキャンセルするのではなく停止するため、アップストリーム フローはバックグラウンドでアクティブのままにされ、新しいアイテムが出力される可能性やリソースが浪費される可能性があります。

## launchWhen〇〇〇は将来的に廃止予定

また、launchWhen〇〇〇は将来的に下記リンクにある通りで`This API will be removed in a

元記事を表示

【Jetpack Compose】Composeをオーバーレイ表示する

要素の上に半透明で表示するオーバーレイ表示をしてみました。
サイズが固定の場合はとても簡単なのですが、サイズが不定の場合はちょっとコツ(?)が必要でした。

オーバーレイ表示はこんな感じのものです。

## 固定サイズの場合

固定サイズの場合は、そのComposeの上に `fillMaxSize()` で半透明のComposeを重ねるだけです。

例えば、こんなカード表示のComposeの場合です。
横幅は引数のModifierで指定できますが、縦幅は80dpで固定指定になっています。

“`kotlin
@Composable
fun Card(modifier: Modifier = Modifier) {
Card(modifier = modifier.height(80.dp), shape = Rou

元記事を表示

Android Studio Gradleのセッティング

Could not install gradle distribution from XXXが表示された場合の対処法をマイ忘備録として記載します。

こちらも参考
https://note.com/yvonne8823/n/n80214762a8d4

file>close projectでいったん編集中のプロジェクトを閉じる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312214/a37e3f35-585b-a756-d9f1-77be1572a4ab.png)

カスタマイズから、All settings…を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312214/8e029eef-48f2-8a17-b947-a7e3c7afa362.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.am

元記事を表示

Google codelabs Android DataBinding のコードのつながりをふわ~っと確認

最近、Databindingを理解するために、[Google codelabs Android DataBinding](https://developer.android.com/codelabs/android-databinding#0)で学習してみたのですが、~~思考停止で~~書かれている通りに実装したところ、Databindingは実装できたものの、**どのコードと、どのコードが関連して動作しているのかが、いまいちピンときていなかったので**、コード同士のつながりを確認することにしました。
この記事はその確認結果のまとめです。

#Google codelabs Android DataBindingで作るもの
このCodelabsでは以下のようなものを作ります。(ほぼ完成しているものが準備されている)
![アプリ動作.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599060/501929d5-b208-1749-774e-5e827a532d58.gif)

LIKEボタンをポチポチすると

元記事を表示

【Android】Modifier.requiredXXXについて、モヤモヤしなくなるくらいに理解する【Jetpack Compose】

# はじめに

Modifierでサイズを指定するとき、`width`と`requiredWidth`、`height`と`requiredHeight`、`size`と`requiredSize`があるよね。

[Composeの公式ドキュメント](https://developer.android.com/jetpack/compose/layout?hl=ja)を読めば言いたいことは大体理解できる。
親レイアウトが指定したサイズを無視して、子レイアウトのサイズを決定したい場合に`requiredXXX`を使うよってことよね。

これはわかる。
わかるんだけど、いざコードのコメントを和訳して読んでみると、


*requireSize
コンテンツのサイズを正確に[size] dpの幅と高さになるように宣言します。 着信測定[制約]はこの値を上書きしません。
コンテンツが着信[制約]を満たさないサイズを選択した場合、親レイアウトは[制約]で強制されたサイズとして報告され、コンテンツの位置は、割り当てられたスペースを中心に自動的にオフセットされます。
[制約]が尊重されること

元記事を表示

ktlint を導入した話

## はじめに

今更ながら ktlint を導入する機会があったので、その手順などをまとめました。

> 参考:ktlint とは?

ざっくり、[Kotlin Style Guide](https://developer.android.com/kotlin/style-guide) を元にコードスタイルのチェックをしてくれたり、lint で検出した部分にフォーマットをかけてくれたりしてくれる Kotlin 用の静的コード解析ツールになります。

> 公式ページ

[ktlint HP](https://ktlint.github.io/)

> サンプルソース

– GitHub
[simple-ktlint-android](https://github.com/ngkr327/simple-ktlint-android)

## 導入

### 1. やりたいこと

– ktlint でコードをフォーマットしたい
– さらに、ビルド時にフォーマットが走るようにしたい

### 2. 準備

Android Studio: `3.4.1`
ktlint: `0.4.0`

##

元記事を表示

Android12 targetSDKVersion31にしたら起きること

今働いている会社でそろそろtargetSDKVersion31への移行を行なっていく必要があり調査していて、発生したことをメモ書きしていきます。

https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja

アプリで対応する必要があった項目

・コンポーネントのエクスポートの安全性を改善
・ペンディング インテントの可変性

コンポーネントのエクスポートの安全性を改善

インテントフィルタの設定が入っている場合にはexportedのフラグ設定が必須になりました。元々デフォルトでインテントフィルタ設定がされてたらONになっていたがそれを明示的に指定するように。
そもそも内部でしか利用しないようなパターンがあったときに、勝手にONになっていたため知らず知らずのうちにアプリを公開してしまうっていうのを防ぐのが目的っぽい。

ビルド時にエラーで怒られます。対象のAndroidManifest.xmlのタブで「Marged Manifest」をタップするとエラー確認できます

元記事を表示

【Android】マルチモジュールって何?

# この記事は
マルチモジュールって何だろうと思い、恥を忍んでAndroidのお師匠さんに聞いてみた私が、「マルチモジュール完全に理解した」になるまでの物語である。

# 先生、マルチモジュールって何ですか?
これまでpackageとして管理していたある機能を持つまとまりを、モジュールとしてライブラリのように切り離して扱う方法のこと。

…ハァ?

# あの…モジュールって何ですか…?
ていうか、パッケージって何…(小声)

– packageとは

`app->com.ウンニャラカンニャラ`の下にあるフォルダ(?)
以下の画像における`view`や`viewModel`がパッケージとなる
![スクリーンショット 2021-11-25 16.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/94682283-3a77-7d74-27fa-b4fd99e0d97a.png)

– moduleとは

かの有名な[どすこい先生](https://twitter.com

元記事を表示

ViewPager2+PdfRendererで簡単なPDFビューアを作る

# 背景

とある Android アプリで PDF を閲覧する機能に AndroidPdfViewer (jcenter で配布されている) を使っていたのですが、2022年2月に jcenter が使えなくなるので、_「その内、MavenCentral なりで publish してくれるだろう」_ と呑気に構えていたのですが、README.md の先頭行に `Looking for new maintainer!` と書かれていたので、これはもう更新されないんだろうなと悟りました。

https://github.com/barteksc/AndroidPdfViewer

Android では iOS と違い OS 標準の WebView で PDF 表示とかしてくれません。

以下の記事にあるように、これで苦労したことがある Android プログラマは多いかもしれません。

https://qiita.com/s_of_p/items/1c1a467d246ab7dc45e1

ただし、Android 5.0 から API (PdfRenderer) が提供されているので、対

元記事を表示

LottieアニメーションをJetpack Composeで使用する

Jetpack Compose自体もUIのアニメーションはシンプルに実装できるフレームワークですが、Lottieを使うとより高度なアニメーションをデザイナー主導でリッチに表現することが手軽にできるようになります。

LottieはJetpack Composeにも対応しており、Jetpack Composeで組み立てているUIの中に簡単にLottieアニメーションを組み込むことができます。

まず、app/build.gradleにLottieの依存を追加します。

“`gradle
dependencies {
implementation “com.airbnb.android:lottie-compose:4.2.1”
}
“`

そして、`src/main/res/raw/`ディレクトリがなければ作成して、その中にLottieのJSONファイルを入れます。この記事ではこのファイルを`my_lottie_file.json`だとして扱います。

あとは、Lottieアニメーションを配置したい場所に`LottieAnimation`Composableを入れるだけです。

元記事を表示

事業フェーズごとにiOS/Androidアプリ開発で気をつけるべき観点

色々な事業フェーズに携わる中で、事業フェーズ別のアプリ開発に関する観点に対して思う所があったので個人的な見解をまとめます。

# 前段
事業状況は0→1、1→10、10→100などの局面によって変化していくものです。
その事業の局面ごとに最適なアプリの設計や重視すべき観点というのは変化していくのではないかと私は思います。
もちろん、アプリの特性と組織状況によっても最適なアプリの設計は変わるものですが、そこはサブ要因として今回は踏み込まずに思うところを記載していこうと思います。

# 0→1フェーズ
0→1フェーズは仮説検証を繰り返し行い、ビジネスが成立するコアサイクルを見つけ出すフェーズです。
この局面ではアプリに必要とされる機能やUXもどんどん変化するため、そもそもネイティブアプリとして作るべきかどうかも含めて検討すべきフェーズです。
可能であれば、NoCodeによるアプリ開発で簡素な仮説検証を繰り返して一定の方向性を見つけてからアプリ開発を開始すべきでしょう。
この段階で実際にアプリを開発する場合、仕様変更が頻発するとともに0→1に興味を持つ少数のエンジニアでどんどん開発を進めてい

元記事を表示

Timber×Crashlytics でログをクラッシュレポート送信(Timber編)

# はじめに

リリースしたモバイルアプリで、未検出のバグによりクラッシュしてしまう場合、ユーザーが声を上げない限り検知できない・・ということは避けたいですよね。

また、万が一そのような不具合があった場合、再現手順やユーザーの状態を調査・分析するのは骨が折れます。

更には、リリースしたモバイルアプリの動作ログを自前のプラットフォームに集約するような仕組みも敷居が高いです。

それらを踏まえて、

– クラッシュするまでの詳細なログをクラッシュレポートで確認したい
– ログはいい感じに出力したい(`if (Logger.isDebugEnabled()) { … }`みたいな分岐はイヤ)
– 手軽に導入したい

という思いのもと、Timber と Firebase Crashlytics での実装例を紹介したいと思います。

# Timber

[Timber](https://github.com/JakeWharton/timber) は、Android向けのログ出力ライブラリです。

ログと言えば、Androidの標準ロガーとして、`android.util.Lo

元記事を表示

[Flutter] FCM vs Local Notification

# はじめに
FlutterでAndroidとiOSのアプリを両方開発しているところで、Push Notificationを実装することになりました。
最初はFCMとLocal Notificationの機能に関して紛らわしいことがありましたので、今回はこれに関して整理しようと思います。

# FCM (Firebase Cloud Messaging)
https://firebase.google.com/docs/cloud-messaging?hl=ja
> Firebase Cloud Messaging(FCM)は、メッセージを無料で確実に送信するためのクロスプラットフォーム メッセージング ソリューションです。

Firebaseサイトで定義されてる概念で、Firebaseサーバーを使って簡単にユーザーにメッセージを送信することができるとで理解すれば、大丈夫だと思います。

# FlutterにFCMを適用する方法

https://pub.dev/packages/firebase_messaging/install

Flutterでは、firebase_messag

元記事を表示

Freezedの使い方

#はじめにFreezedとは
簡単に言えばコピーメソッド等を含む**Immutable(不変)**なクラスを生成することができるパッケージのこと
Freezedでコードを生成することで便利なメソッドがいくつか使用できるようになる。

:::note info
・copyWith
nullを割り当てることが可能な複製メソッド

・==
同値であることの確認

・toString
文字列化した時の結果

・fromJson
Mapからの変換

・toJson
Mapへの変換

:::
上記のメソッドを使用して開発を楽にしましょう!

#Freezedの使用方法
## インストール

“`pubspec.yaml
dependencies:
// @freezed などを使うために必須
freezed_annotation:

dev_dependencies:
//コード生成するために必要
build_runner:
freezed:
// fromJson/toJson 

元記事を表示

BottomNavigationでアイコンを再タップして子画面から親画面に戻すテクニック

# 概要
この記事では、Bottom navigationで現在選択されている行先のアイコンを再度タップすることにより、その行先のトップの画面(ここでは親画面と呼びます)へと戻る処理を実装します。
これにより、ユーザーは複数の階層を下った画面からでも1タップで親画面へ戻ることができるようになります。
また、親画面で再タップした時に(親画面にあるRecyclerViewをトップまでスクロールするなどの)特定のアクションを起こせるような実装も同時に行います。

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557192/beedefa2-c8e3-a264-7c61-194187886097.gif)

# 環境
– Kotlin 1.5.31
– Androidx.Navigation 2.3.5

# テクニック

## アイテムを再選択したことの検知

[`BottomNavigationView#setOnNavigationItemReselectedListener(listener)`

元記事を表示

Agoraを使った音声ライブ配信アプリの作り方

## はじめに
プレミアム音声サービスNowVoiceのAndroidアプリ開発を担当しているkiyoです。
NowVoiceアプリでは、音声ライブ配信機能を提供しています。
この記事では、ライブ機能を実装するまでの導入手順や実装ポイントについてまとめました。

## NowVoiceライブ配信機能

NowVoiceアプリのライブ配信機能では、単純なライブ配信機能の他にも以下のような機能を備えています。
そしてその機能のほとんどがAgoraSDKを介して実装されています。

“`
## ライブ配信機能
– MAX4人の対談機能
– ホストがユーザを対談に招待する機能(招待機能)
– リスナー側がホストに対談をリクエストする機能(挙手機能)
– コメント投稿機能
– 課金型コメント投稿機能(スーパーチャット)
“`

この記事では、AgoraSDKを用いた音声ライブ配信機能を実現するためのポイントについてご説明します。

## 目次
1. Agoraとは
2.

元記事を表示

Firebase Cloud Messaging(FCM)は中国では使えない

iOS/Androidアプリの開発を協業している他社担当者から、システムテストにおいて、

「プッシュ通知が届かない」
「iOS/Androidとも同じく」

という報告があり、再現性を確認したのですが弊社側では再現せず…

同アプリはプッシュ通知にFirebase Cloud Messaging(FCM)を利用しています。
バックエンド側のログなどを追うと、どうやら、SDK経由で取得できるはずのプッシュトークンが取得できていない模様。

協業他社によくよく聞いてみると、「中国でテストをしている」、とのこと。

そこで調べたところ、FCMって中国(本土)では使えないんですね…(→参考リンク)

同アプリは日本国内での利用が前提なので、協業他社に「プッシュ通知のテストだけは国内でお願いします」と依頼するだけで済んだのですが…

もしグローバルなサービスだったら、中国本土で使えるプッシュ通知mBaaSに乗り換えるなど、大幅なアーキテクチャ変更になるところでした。:cold_sweat:

なお、FCMの公式ドキュメントではその辺りの制限事項に関する記述は見つけられませんでした。

参考リン

元記事を表示

Android ダークモード コードで判定

### 内容
– コード上で、ダークモードを判定する

### 環境
今回の内容を実践した私の環境です。
– macOS Monterey Version 12.0.1
– Android Studio Chipmunk 2021.2.1 Canary 4

### 結論
下記のコードにより、ダークモード・ライトモード判定ができます。

“`kotlin:judgeMode.kt
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// SDKのバージョンがR以降である場合にダークモード設定が導入されたため、それを判定する
if (context.theme.resources.configuration.isNightModeActive) {
// ダークモードの場合にこのスコープに入る
}
}
“`

元記事を表示

ReactエンジニアがReact Nativeを使ってみた

#はじめに
もともとReactを使用してweb開発をしていましたが、React Nativeを使用したモバイル開発に関わることになりました。Reactを使っていた人間がReact Nativeを勉強してみた所感を書きたいと思います。本記事はReact Native公式ドキュメント[[1]]を参考に書いていきます。

#前提
Reactが使える
TypeScriptが使える
モバイルは初めて

環境構築と簡単な動作確認が知りたい人は前回の記事[[1]]で行っているのでそちらを参照してください。

#React Nativeの必要性
現在モバイル端末での使用OSはAndroidOSとiOSで二極化しており、なおかつそれぞれでの使用プログラミング言語も異なります。昔はiOSではObjective-C、AndroidではJavaが使用されていました。しかし、最近ではiOSではSwift、AndroidではKotlinという言語が使われており、2つのOS合わせると最大4つのコードが存在する可能性があるわけです。もちろんこれは開発効率の観点から見て良くなく、これを解決するためにReact Nati

元記事を表示

【Kotlin】TextView・AlertDialogにHTMLのタグを適用する

この記事では、以下のような`String`をTextViewにバインドし、TextViewにHTMLタグを適用させていきます。

“`kotlin
val link = “””
Qiitaを開く
“””.trimIndent()
“`

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/d9c01e62-a66c-c3b2-b7e0-e1e211174381.gif)

### HtmlCompactの利用
[HtmlCompact](https://developer.android.com/reference/androidx/core/text/HtmlCompat)を利用することでHTMLのタグをAndroidにも適用することができます。

“`kotlin
private fun transformHtml(text: String): Spanned {

元記事を表示

OTHERカテゴリの最新記事