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

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

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は、スーパークラスを示すものとして、そのままメソッドやフィールド名を

開発初心者がサーバーレスにアプリを作ってみた(Kotlin)

## はじめに
Android Advent Calender2022の21日目の記事です。

普段はニフクラ mobile backendというアプリ開発のサービスを企画職として運営している立場なんですが、アドベントカレンダーを機にアプリを開発してみました。

初心者なのでコードが変だったりすると思いますが、「自分も最初はこんなもんだったな~」とか思って年末を締めくくるのもたまには良いですよね。そういうのんびりした気持ちでお読みください。

## 開発するもの
開発なんもわからん。コードもわからん。どうすっかなぁ~と悩んだ結果、4択のクイズアプリを開発する事にしました。コードは最後に載せておきます。
※ファイル減らすために1ファイルにたくさん書いてます。下手くそなコードですが一旦動けばよし。

Kotlin: CalendarProviderでGoogleカレンダーの情報を取り出す

# はじめに
**CalendarProvider**を使って、端末に保存されたカレンダーに登録した予定を取得して取り出す方法です。(Googleログインなどは未実装)
GoogleCalendarAPIを叩かなくても簡易的にカレンダー情報を取得することができます。
最後の方に、簡易的にカレンダーを扱ったアプリの例も掲載しています。

# 目次 
1. 開発環境
2. カレンダーパーミッションの追加
3. アプリがカレンダーへアクセスするためのパーミッション設定
3. コードを書いてみる
3. 実際に使ってみる(アプリの例)
3. さいごに

# 開発環境
Android Studio Chipmunk|2021.2.1 Patch1

# カレンダーパーミッションの追加
`AndroidManifest.xml`に以下のパーミッションを追加します。

“`kotlin: AndroidManifest.xml

スワイプして〇〇するモジュールを作ってみた。

# スワイプして〇〇するモジュールを作ってみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612874/ae7ef596-b09b-f90b-0264-69453d9fb124.png)

よく見かける、スワイプして〇〇する機構(↑画像みたいな)を現在のPJのアプリ内に導入したかったのですが、
軽く検索してもライブラリ?や紹介記事がぱっと出てこなかったのでComposeの勉強も兼ねて自作することにしました。(絶対探せばあると思うけど。。。)
パラメータ類を調節すれば各々の好きな挙動が実現できるかと思います。
参考

https://developer.android.com/reference/kotlin/androidx/compose/material/package-summary?hl=ja#(androidx.compose.ui.Modifier).swipeable(androidx.compose.material.SwipeableState,kotlin.

[Android] AlertDialogはDialogFragmentを使って表示させよう

以下のように、`AlertDialog`を単体で使用しても、ダイアログを表示すること自体は可能である。

“`kotlin
class ExampleActivity : Activity {
val dialog = AlertDialog.Builder(this)
.setMessage(getString(R.string.order_confirmation))
.setPositiveButton(getString(R.string.ok)) { _, _ -> }
.create()
dialog.show()
}
“`

ただし、このようにすると、ユーザーが画面を回転させた場合や戻るボタンを押した場合のように、ライフサイクルに関するイベントが生じた際に、正しくハンドリングされないことがある。

そのため、Dialogのコンテナとして、`DialogFragment`を使用することが推奨されている。
`DialogFragment`を使用することで、ライフサイクルに関するイベント

setup & sample run android app with appium + ruby in Mac

# Outline

先日、java , python によるtest自動化するための構築,sample codeを記載した
Selenium WebDriver Java Simple Program – Login
setup & sample run android app with appium + python in Mac

今回は、NativeAPPをRubyでテストするための第一歩までを記述する。

# install ruby 3.x

Mac はDefaultでrubyがinstallされている。ただ、2.6と古いversionであり、3.x系を手動でインストールする
いまのrubyのversionを確認

“`
ruby -v
“`
ruby 2.6.8p205 (2021-07-07 revisi

SurfaceViewとTextureViewの違いを表にまとめる

良くごっちゃになるので以下のブログの内容をまとめておきます。

https://medium.com/androiddevelopers/android-hdr-migrating-from-textureview-to-surfaceview-part-1-how-to-migrate-6bfd7f4b970e

||SurfaceView|TextureView|
|—|—|—|
| Google推奨 | ⭕推奨 | ❌ API 24以下でアニメーションしたいときなど特定のシナリオで推奨 |
| 仕組み | Viewの中で穴を開けておいて、その部分位置で直接画面に描画する | Viewとして描画する。一度アプリケーションのレイヤーに画像をコピーする |
| 効率的・バッテリー消費の少なさ | ⭕ (アプリ描画を通さないので効率的) | ❌ (コピーするので非効率) |
| DRM | ⭕ | ❌ |
| 10-bit HDR | ⭕ | ❌ |
| API Level | 1 | 14 |
| 透明度の設定、回転、クリッピング | ❌ | ⭕ |
| アニメーション |

[Delphi] Windows / macOS / iOS / Android でアプリのバージョン情報を取得する

# バージョン番号の指定

Delphi はプロジェクトオプションでバージョン番号を指定できます。

:::note info
Android は VersionCode / VersionName を指定できます。
VersionCode は連番で増えていくもので、VersionName は人間が読めるバージョン情報です。
今回は、VersionName を取得します。
:::

画像は各プラットフォーム毎のバージョン番号指定部分を赤枠で示したものです。

左上:Windows
右上:Android
左下:macOS
右下:iOS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/a8ace051-95b2-bcfc-704d-4ab1868479f1.png)

# バージョン番号を取得する

バージョン情報ダイアログにバージョンを表示するときやサポートにログを送って貰うときにログにバージョンを仕込んでおくとか、そういう時にバージョン情報が必要になります。

ということでプロ

【Jetpack Compose】WearOSで簡単なアプリを作ってみる

この記事はand factory.inc Advent Calendar 2022 20日目の記事です。
昨日は @yuu__uuki さんの [【SwiftUI】カスタムTabViewを実装してみた](https://qiita.com/yuu__uuki/items/8ddbca8aa833763e62e9) でした。

# はじめに

Google製WearOSであるところのPixelWatchが今年10月に発売しました :tada:
私も早々に買ってちょくちょく弄ってみたので、その経験を元に、
JetpackComposeでごく簡単なアプリを作る手順をまとめてみます。

## 対象のサーフェスについて
前提として、WearOSにはモバイルよりも多彩なサーフェスが用意されています。

![principles_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241152/114cee26-af0d-8824-df64-e4d267088693.png)
[Wear OS 開発の原則 | And

【Flutter】Android StudioでLogcatがなぜか存在しない

# はじめに
普段はVScodeでFlutter開発してるのですが、ある事情によりAndroid Studioを使ってみることになりました。

するとLogcatがない。。。。
![Screen Shot 2022-12-19 at 21.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/9e247cf6-082a-7269-6945-d8f91c472bee.png)

# Event Logにも何もない
https://zenn.dev/fukutan/articles/33e45b48cf8fa6

![Screen Shot 2022-12-19 at 21.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/064e3c5b-5605-fdca-bc35-a0dd4e3fcfa4.png)
Event Logに何も表示されません。。。

どうしたら良いんですか?ずっとL