Android関連のことを調べてみた2022年12月24日

Android関連のことを調べてみた2022年12月24日
目次

ブロードキャストでAndroidのシステム情報を取得する

# ブロードキャストとは
[公式ドキュメント](https://developer.android.com/guide/components/broadcasts?hl=ja)には以下のように書かれています。
> たとえば、システムの起動、デバイスの充電の開始など、さまざまなシステム イベントが発生したときに、Android システムがブロードキャストを送信します。
>
このようにブロードキャストを用いることで、Androidシステムの情報を取得することができるようになります。

# システム情報を取得する際の注意点
プライバシーの問題からシステム情報を取得する方法は刻一刻と変化しています。
特にAndroidのアップデートの際は、取得する方法が変わっていないか注意しましょう。

## OSのバージョンによる制限
OSのバージョンによって取得できる情報が制限されるようになっています。

#### Android9以降
Android9以降のデバイスでは、プライバシーの観点から以下の情報が取得できなくなっています。
> – 位置情報や個人を特定できるデータを受信しなくなっています。
>

元記事を表示

Composeのテストを試す

### はじめに
– この記事はand factory.inc Advent Calendar 2022 24日目の記事です。
昨日は @ykkd さんの 「[OperationQueueを活用して、前処理,後処理,キャンセル処理が必要なタスクをバックグラウンドで行う](https://qiita.com/ykkd/items/f1cb5807f8c5733fd37e)」でした。

– モチベーションはUIのリグレッションテストの自動化です :shield:

### 依存の追加

“`
androidTestImplementation(“androidx.compose.ui:ui-test-junit4:$compose_version”)
“`

今回は、”androidx.compose.ui:ui-test-manifest:$compose_version” は使わないので追加していません。
こちらはアクティビティにアクセスする場合に使うようです。( [JetChat](https://github.com/android/compose-samples/bl

元記事を表示

Kotlin のマルチプラットフォームモバイル開発の話

# はじめに!

今年久しぶりに ACCESS Advent Calendar 2022 参加させていただきます!
こちらはACCESS Advent calendarの24日目の記事となります。
今回の記事のテーマは **Kotlin のマルチプラットフォームモバイル開発** を試してみた記事です。
書かれていたコードは全部サンプルプロジェクト作ったら生成されているので、興味がありましたら、是非参考のリンクを辿って、試してみてください。

# Kotlin Multiplatform Mobile (KMM) とは?

Kotlin Multiplatform Mobile (KMM) は Android と iOS を開発するための Kotlin の SDK です。
以下の図を見ると、ビジネスロジックは共通することができますが、View は各 OS の実装になります。
Shared Code は Kotlin で書きます。
【Kotlin】 わからなかったCoroutineScopeを、なるべく短く理解する

# CoroutineScopeをざっくりと説明
コルーチンを起動するには、どのスコープで起動するかを指定する必要があります。このスコープこそがCoroutineScopeです。

# コルーチンビルダーはCoroutineScopeの拡張関数

コルーチンを起動するにはコルーチンビルダーを使用します。このコルーチンビルダーには`launch()`や`async()`といった関数が存在しますが、これらはすべて**CoroutineScopeの拡張関数**として定義されています。

そしてすべてのsuspend関数はコルーチンで実行しないといけないので、普段ViewModelでsuspend関数を呼び出し、UiStateを更新する場合は次のように書いたりします。

“`kotlin
viewModelScope.launch {
val result = repository.getActivities()
viewModelState.update {
it.copy(

)
}
}
“`

#

元記事を表示

React Native のログを Cloud Watch Logs に送信する方法

私が実装するうえで大変苦労した React Native アプリのログを Cloud Watch Logs に直接送信する方法をご紹介します。
とは言っても、 React Native アプリから直接ログを送信したい場合は稀かもしれませんが…

# 前提

この記事では以下の環境で実装を行なっております。
* OS:MacOS Monterey 12.6.1の M1チップ
* Android Studio:Chipmunk 2021.2.1
* Node.js:16.16.0
* DB:Firestore

# 苦労した理由

1. React Native のライブラリで Cloud Watch Logsと連携するものが少ない
2. ライブラリがあったとしても、ログを送信するものではなくログを取得するもの
4. Firestore へ書き込み、読み込み、削除したときのデータと Cloud Watch Logs に送信されたデータの順番や値が合わない
5. そもそも技術力が不足している

3について、データは送信した順番で受信されるとは限らないことが勉強となりました。

# 使用

元記事を表示

TargetSdkVersionを更新しないとどうなるのか

こんんにちは、メグリ株式会社でAndroidエンジニアをしている増田と申します。
少し前に約2年ほどTargetSdkVersionを更新していなかったアプリについて、アプリの公開にまつわる重要なお知らせがGoogleから来ていたので備忘録的にまとめたいと思います。

## 少しおさらい
TargetSdkVersionの対応期限について軽くおさらいです。
Android開発者であればおなじみのTargetSdkVersionの更新は、毎年Googleから通達があって、新規アプリの場合と既にストアで公開されているアプリで対応期限が異なります。

通例だと毎年、新規アプリの場合は8月1日、既にストアで公開されているアプリでは11月1日が対応期限となっており、それ以降は基準に満たないバージョンが指定されている apk/aab はplay consoleにアップロードできないようになっています。
![スクリーンショット 2022-12-22 20.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22

元記事を表示

(ESP32/MQTT/AWS)センサデータをAWSIoTCoreへ送信してTimestreamへ格納する

# はじめに
MQTTとはIoTデバイスでよく使用される軽量なデータ配信プロトコルです。
IoTCoreを経由することでDBへの格納やトリガーにも利用できます。
今回は勉強がてらに、温度/湿度データをAWSIoTCoreを経由してTimestreamに格納することをゴールにします。

# Timestreamの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/d3ccd59d-0c80-5f2d-9691-77fe2a06aa37.png)

### Database/Tableの作成

先に格納先のDBとtableを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/a5ed9afa-205c-bb69-5b78-622345becd93.png)

“`
DB:esp32_test_database
table:esp32_test_tab

元記事を表示

casa-androidを使ってcatalogアプリを試しに作ってみた

[casa-android](https://github.com/google/casa-android) という catalog アプリを作れるフレームワークが新たに登場したので、どのようなことができるのか試しに使ってみました。

casa-android は 2022/12/22 時点で Ver 0.1.0 となっており、将来的に大きく実装が変わる可能性があります。

## 導入

基本的には https://github.com/google/casa-android#how-to-use-it に書かれている通りです。
ただし、Ver 0.1.0 ではいくつかハマりポイントがあります。

– パッケージ名が `com.google.android.catalog.framework:xxx:0.1.0` として配布されている
– README にある `com.google.android.casa` ではない
– [sample modules の設定](https://github.com/google/casa-android#create-sample-mod

元記事を表示

Android12以降でのAndroidアプリリンクの話

ブラウザや別アプリからアプリを起動したい時に
特定のURLに紐付けてアプリ起動させる内容

公式の内容
https://developer.android.com/training/app-links/verify-android-applinks?hl=ja

# 前提の各種情報

以下の情報をまずは把握します。

“`
**アプリのパッケージ名**
com.wakka0014.app

**ドメイン名**
wakka0014.ne

**アプリ公開鍵のSHA-256**
AA:BB:CC:DD……()
“`

**AndroidManifestの設定**

“`

元記事を表示

compose公式のswipeRefreshを使う

# 初めに
今回は、`jetpack compose`の公式からでた`1.4.0-alpha01`から使える`swipeRefresh`を実装していこうと思います
### 本文
実装自体はすごく単純で`awipeRefresh`をつけたい`Box`などに下記の設定を追加するだけです
“`kotlin
val pullRefreshState =
rememberPullRefreshState(refreshing = isRefreshing, onRefresh = { onRefreshed() })
Box(
modifier = Modifier
.pullRefresh(pullRefreshState)
.fillMaxSize()
) {

}

PullRefreshIndicator(
refreshing = isRefreshing,
state = pullRefreshState,
modifier = Modifi

元記事を表示

コード生成の力でsealed class/interfaceのwhen式のネストを浅くする

こんにちは!tkhsktです。

Kotlinのsealed class/interfaceは便利なんですが、when式でサブクラスの分岐を作るとネストが深くなりますよね…
この記事では、sealed class/interfaceのwhen式をフラットにするコードの生成方法を紹介します。

今回紹介する方法はライブラリとして公開しているので、気になる方はそちらもご参照ください?
https://github.com/tkhskt/shiirudo

## 「ネストが深くなる」とは

この記事では下記のようなsealed classについて考えます。

“`kotlin
sealed class Event {
object ShowModal : Event()
object DismissModal : Event()
data class ShowToast(val message: String) : Event()
}
“`

このsealed classのサブクラスをwhen式で分岐する場合、通常であれば下記のようになります。

“`kot

元記事を表示

【Android】楽曲情報の読み上げがしたい!

この記事はレコチョク [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/recochoku) の22日目の記事になります。

https://qiita.com/advent-calendar/2022/recochoku

# はじめに
株式会社レコチョクでAndroidアプリ開発をしている寺島です。
最近、ReoNaさんのお歌にハマっています。
(ReoNaさんが曲のことをお歌と言います)
気になったら、聴いてみてください。

最近思ってた事を解決すべく、挑戦した事を記事にしました!

# 最近思ってた事について
みなさん、音楽って聴きますか?
自分は移動中に聴くことや、ながら聴きをすることが多いです。

自分のように移動中に聴いたり、何かをしながら聴いたりする人は多いと思います。その場合、音楽を聴きながら何の曲を聴いているか知りたくなるときはないでしょうか?

自分はあります。
**『スマホで画面を確認せずに、今流れている曲の曲名やアーティスト名が分かればいいのにな~』**
と思うことが、多々あります。

元記事を表示

Flutterアプリをリリースするために僕が考えたブランチ戦略とデプロイ方法と仕組みについてまとめてみた!

# はじめに
この記事は[MIXI DEVELOPERS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mixi) の22日の記事です。

# この記事はなに?
昨年からFlutterでアプリ(iOS/Android)開発をはじめ、今年の頭に初めてアプリをリリースしました!
リリースする際に考えたブランチ戦略、デプロイ方法と仕組みについてまとめてました!

## この記事で紹介すること
– ブランチ戦略について
– デプロイ方法と仕組みについて

上記について紹介します!

# 環境
今回の記事は以下の環境、ツールを使用しています。
– MacOS: monterey 12.6 2
– Flutter: 3.0.2
– Fastlane: 2.190.0
– GitHub
– DeployGate
– Bitrise

# ブランチ戦略について
まずはアプリをリリースするまでのブランチ戦略についてご紹介していきます!

## 具体的なリリース手順
以下の図でリリース作業を進めています。それぞれ解説してい

元記事を表示

【JetpackCompose】テキスト入力された最後の文字だけマスクを外したい

# はじめに
パスワードを入力する時に表示した文字をマスクして隠したいというのはよくあります。

それをJetpackComposeで実現する場合は、TextFieldのvisualTransformationに[PasswordVisualTransformation](https://developer.android.com/reference/kotlin/androidx/compose/ui/text/input/PasswordVisualTransformation)を指定すれば入力した文字をマスクすることができます。
ただこちらの動きがViewシステムのEditTextの`android:inputType=”textPasssord”`とは微妙に異なっていました。

EditText | TextField
— | —
![edittext-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953466/6fe353e8-b6f4-d4c7-95bf-b7be6cf7

元記事を表示

[Android] Splash画面の実装 コピペ可能

### コピペ可能でいけます!

アプリ起動時にいきなりアプリ画面を表示させるのではなく、LINEみたいに一旦起動中の画面を表示させたいですよね。
そんな時に使えるSplash画面。
コピペでいけるので、ぜひ試してください。
方法は超簡単です!

### まずは
“`build.gradle
dependencies {
// コルーチン設定
implementation ‘org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4’
}
“`
“`AndroidManifest.xml
// メインのActivityをSplashに




// メイン画面に遷移できるように追記

“`

### ソースコード
“`SplashActivity.kt
class SplashActivity : AppCompatActivity(

元記事を表示

[Android]TabLayoutカスタマイズ ViewPager2

### TabLayoutカスタマイズ
<できたこと>
・ViewPager2でのTabLayout実装。
・タブ選択時に背景と文字色が変更。
・タブ間の区切り線(divider)の表示。

### ソースコード
“`MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val viewPager : ViewPager2 = findViewById(R.id.viewPager)
val tabLayout : TabLayout = findViewById(R.id.tablayout)

val adapter = ViewPagerAdapter(supportFragm

元記事を表示

Unity開発アプリでのGooglePlayConsole NativeDebugSymbols登録について

本記事は[サムザップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sumzap) の12/21の記事となります。

# **はじめに**
2022年11月30日より、Android Vitalsにてクラッシュ率及びANR率が高いアプリには
GooplayPlayストア上で警告がでる可能性があるとのことで今回自社アプリでの調査を強化するため対応進めていました。
Android VitalsにはクラッシュやANRが発生した際のスタックトレースが蓄積されるのですがそのままだと難読化されていて読み解こうにもはっきりとはわかりません。
シンボリケーションを行い、人が見てわかるように難読化を解除する必要があります。
そのために必要になるのがGooglePlayConsoleにアップロードするための**シンボリケーションファイル**となります。

よくよく思い返せば簡単なことなのですが備忘録もかねて記事とさせていただきます。

※2022/12時点での情報になります。
 今後Googl

[Delphi][小ネタ] Windows / macOS / iOS / Android で等幅フォントを取得する

# 等幅フォントを取得する

コードはもちろんのこと情報を表示するときとかに等幅フォントが必要になる事があります。
各プラットフォーム毎にフォント名が異なるのでめんどい!のと毎回調べてるので、メソッドにまとめてみました。

コードは以下の通り。

“`delphi
(*
* Font Utility
*
* PLATFORMS
* Windows / macOS / iOS / Android
*
* LICENSE
* Copyright (c) 2022 HOSOKAWA Jun
* Released under the MIT license
* http://opensource.org/licenses/mit-license.php
*
* HISTROY
* 2022/12/19 Version 1.0.0 First Release
*
* Programmed by HOSOKAWA Jun (twitter: @pik)
*)

unit PK.Utils.Font;

interface

type
TFo

なんとなく使いこなしてた気がしてた、StateFlowを理解する

新しいViewModelを作るときに、`uiState`を必ずといって良いほど定義します。
その際に毎回必ず`stateIn()`を使って`MutableStateFlow`に変換してからコンポーザブルで利用するのですが、いつもこれは一体何をしているんだろうとモヤモヤしながら書いていました。

そこで今回は、将来の自分がまた`Flow`や`StateFlow`で迷子にならないための忘備録として、難しいことは一切省いた`StateFlow`の解説記事を残しておこうと思います。

# KotlinにおけるFlowとは一体なんなの?

そもそも、概念的な意味におけるKotlinでのFlowとは、suspend関数を使って非同期に値を生成し、その生成された値を必要としているレイヤー側にて使用するまでの**一連の流れ**のことを表します。

そして、この一連の流れであるFlowは、以下の3つの要素で成り立っています。

– Producer(プロデューサー)
– Intermediary(インターミディアリー)
– Consumer(コンシューマー)

## FlowのProducerとは

AndroidをJavaで実装するんですけど色々と分からなかったところまとめます

# Androidってなあに?

Androidは、スマートフォンなどの携帯情報端末のために、Google社が開発したOSです。
毎年バージョンアップした端末が発売されるのでそれに伴ってアプリもバージョンアップしなければいけません(汗)

この記事は**自分が詰まって学んだことをツラツラ書いていきます**
少しでも誰かの役に立ちますように・・・

# Androidに出てくるJavaの機能
**onCreateメソッド** : プログラムを起動したとき最初に呼び出される
onCreateメソッド内に
“`
super.onCreate(savedInstanceState);
“`
このコードが書かれています。
ここで書かれている**super**というのは、**スーパークラス**を意味します。スーパークラスは、継承する元になっているクラスのことです。

スーパークラスにあるonCreateメソッドを最初に呼び出して、スーパークラス側の処理を全部済ませてから、自分の処理を行うようにしています。このように、superは、スーパークラスを示すものとして、そのままメソッドやフィールド名を