- 1. Unity 2021.3.xでAndroid33をビルドできるようにする
- 2. APIのGET結果をキャッシュする (Room+Hilt)
- 3. SkyWay×Androidでビデオ通話アプリを作成してみた
- 4. Android StudioでYour CPU dose not support VT-x.のエラーを解消する方法
- 5. JetpackComposeでonTextLayoutを使わないAutoSizeTextを作る
- 6. ElixirDesktopでスマホアプリを作る – LiveViewを使用してCRUDの機能を実装する
- 7. JetpackComposeでSpannableテキスト
- 8. TextInputLayoutのスタイル設定
- 9. JetpackCompose+HorizontalPager+Indicator
- 10. JetpackCompose + HorizontalPager
- 11. 【Android】緯度経度から2点の距離を出す【Kotlin】
- 12. 【Android】はじめてのJetpack Composeで時計を表示するアプリを作ってみた
- 13. 【Android】Bluetoothパーミッションまとめ
- 14. IPアドレスを無限に自動で変更する【Android】
- 15. Android のログについて
- 16. Kover 登場前の JaCoCo による Android のローカル単体テストのカバレッジレポート出力は難しかった
- 17. Android 10から13までのメディアファイルへのアクセス
- 18. ElixirDesktopでスマホアプリを作る – Phoenix1.7のアプリを起動
- 19. Android、DatePickerDialogで日付、TimePickerDialogで時間の選択
- 20. FlowとStateFlowとstateIn()
Unity 2021.3.xでAndroid33をビルドできるようにする
## 環境
– Unity 2021.3.9f1(Appleシリコン版)
– Android Studio 2022.2.1 Patch 2
– macOS Ventura 13.4.1(22F82)## エラー
– Androidのリリースビルド(aab)を作成しようとすると、下記のエラーが発生する。
– エラーメッセージの通りで、android 33のSDKがないからインストールして、再起動してね、という内容。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/3129bab7-875f-4c30-9703-c0e7a43a4851.png)
“`
Target Android SDK not installedAndroid SDK does not include your Target SDK of 33.
Please use the Android SDK Manager to install your target SDK version. Re
APIのGET結果をキャッシュする (Room+Hilt)
# APIのGET結果をキャッシュしたい!
天気予報アプリも順調に育ってきました。
「画面を表示」 -> 「APIコール」 -> 「表示」はできましたので、APIコールの回数を減らすべく、10分以内のリクエストならDBを参照する様にしたいと思います。ということで、キャッシュ先をRoomにすべく、導入していきます。
## Room
### 1. gradleの定義
まずは、Roomの依存定義を行います。“`diff_gradle:app/build.gradle
plugins {
id ‘org.jetbrains.kotlin.android’
+ id ‘kotlin-kapt’
id ‘com.google.dagger.hilt.android’
}android {
defaultConfig {
+ kapt {
+ arguments {
+ // ① schema定義を出力しておくと、AutoMigrationできるようになるので
+
SkyWay×Androidでビデオ通話アプリを作成してみた
# はじめに
[Qiitaでイベント](https://qiita.com/official-events/93564ad363199fa7999c)をやっているので、参加するためにSkyWayを使ってみました?♂️
[前の記事](https://qiita.com/nakashimaakio/items/3fddc5b685f50dc48e63)ではJavaScriptで書きましたが、今回はAndroidアプリ化しました。
ドキュメントは[こちら](https://skyway.ntt.com/ja/docs/user-guide/android-sdk/quickstart/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_engineer_festa_2023)から。https://skyway.ntt.com/ja/docs/user-guide/android-sdk/quickstart/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_en
Android StudioでYour CPU dose not support VT-x.のエラーを解消する方法
Intel Macで動作していたAndroid StudioのシミュレーターがM1 Macに切り替えた後、Your CPU dose not support VT-x.というエラーが発生してシミュレーターを立ち上げられなくなった。
調べたところ解決できたのでまとめておこうと思います。### 環境
・ Apple M1 Pro/mac OS Ventura
・ Android Studio Flamingo 2022.2.1### 解決方法
Settings…>System Settings>AndroidSDKのSDK Toolsタブを開き、Android Emulatorのチェックボックスの中がーになっていたのでチェックマークを入れたどうやらAndroid Emulatorが古くなっていたようだったのでチェックを入れて最新版のをインストールしたらシミュレーターで起動できるようになりました
JetpackComposeでonTextLayoutを使わないAutoSizeTextを作る
# JetpackComposeでonTextLayoutを使わないAutoSizeTextを作る
JetpackComposeにautoSizeMaxTextSize,autoSizeMinTextSize,autoSizeStepGranularity,autoSizePresetSizesに対応したTextを作成します。AutoSizeTextの全ソースは[こちら](https://github.com/jozuko/ComposeTutorial/blob/main/app/src/main/java/com/jozu/jetpack/compose/tutorial/screen/composable/AutoSizeText.kt)です。
ご自由にどうぞ。もっと効率のいいやり方あったら、コメント or プルリクいただけると泣いて喜びます。:::note info
経緯
AutoSizeTextを作ってみたというサンプルに多いのが、「onTextLayout」を使用しているものです。
これは、「描画する」->「表示しきれなかったらフォントサイズを小さく
ElixirDesktopでスマホアプリを作る – LiveViewを使用してCRUDの機能を実装する
こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はElixirDesktop + Phoenix1.7のスマホアプリをWindows11 + WSL2で動かす手順をまとめたいと思います。———————————————
なお、本記事は2023/7/13開催[ElixirMobile#3:DBも内蔵したElixirDesktopスマホアプリ開発ハンズオン](https://fukuokaex.connpass.com/event/283648/)のイベントレポート(後半)を兼ねています。
——ハンズオンの様子(後半)はこちらから——
↓27:03~以前が前回の記事、以降が本記事のハンズオン動画です
↓「微調整」の部分以降の動画です。
——————————-
JetpackComposeでSpannableテキスト
# Spannable風のTextを作る
![text_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491965/ba2ba372-a14f-82ff-0983-48456b62c07a.png)
この画像の年月日の部分は、1つのTextに対して、複数のスタイルを適用する(Spannable風)ことで実現しています。
以下を参考にしています。:::note info
[1つのテキストに複数のスタイルを設定する(Google Developers)](https://developer.android.com/jetpack/compose/text?hl=ja#multiple-styles)
:::## 一部のフォントサイズを小さくする
“`kotlin
val smallSpanStyle = SpanStyle(fontSize = MaterialTheme.typography.bodySmall.fontSize)
Text(
text
TextInputLayoutのスタイル設定
TextInputLayoutのスタイル設定についてまとめようとしましたが途中で力尽きました。
https://github.com/material-components/material-components-android/blob/master/docs/components/TextField.md を読めばやろうとしていたことがだいたいまとまっていました。
やる気が出たら追記します。### TextInputLayoutを表示するためのレイアウト
|未入力|入力後|
|-|-|
|![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149856/49c276cd-1e04-14d9-209d-01a51d3634ef.png)|![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149856/80507389-7164-5861-8d59-8a262e1c9280.png)|“`xml
JetpackCompose+HorizontalPager+Indicator
# HorizontalPagerにIndicatorをつける
[前回](https://qiita.com/jozuko_dev/items/d025391e37351708a964)、HorizontalPagerを配置しました。これに、インジケーターをつけていきます。
完成イメージはこちらです。
![indicator_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491965/fc57bc90-8a89-9a91-8dc3-eb10335f736a.gif)## データ構造
前回と同じですが、天気予報は、以下のデータ構造をしています。
“`text
Forecast(天気予報)
└ List(地域データ一覧)
├ name(地域名)
├ code(地域コード)
└ overviews(今日と明日とあれば明後日の天気予報)
├ weatherCode(天
JetpackCompose + HorizontalPager
# Pagerを使って天気予報画像を表示しよう
JetpackComposeのPagerを使って、天気予報の画像を表示しようと思います。
## 依存関係の修正
JetpackComposeのPagerは、[バージョン 1.4.0-alpha03](https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=ja#1.4.0-alpha03)で、[accompanist](https://google.github.io/accompanist/pager/)から本家(androidx.compose.foundation:foundationライブラリ)に統合されました。
なので、まずは、依存関係を更新していきます。ただ、残念なことに、現時点ではJetpackComposeのBOMは、androidx.compose.foundation:foundationを1.3.1までしかサポートしていないので、BOMが使えないため手動で定義していきます。
[BOM とライブラリ バージョン
【Android】緯度経度から2点の距離を出す【Kotlin】
# 実践
Location.distanceBetweenを利用して2点の距離は出します。private fun getDistanceBetween(
latitude1: Double, longitude1: Double,
latitude2: Double, longitude2: Double
): Float {
val results = FloatArray(3)Location.distanceBetween(latitude1, longitude1, latitude2, longitude2, results)
// 0を指定することで2点の距離を返す
return results[0]
}Location.distanceBetweenの引数を上から順に 第一地点の緯度、経度、第二地点の緯度、経度、2点間の距離を詰めるresultsの順で指定します。
resultsではそれぞれ数字を指定して欲しい情報
【Android】はじめてのJetpack Composeで時計を表示するアプリを作ってみた
# はじめに
今回は、ずっと存在は知っていたが使ったことがなかったJetpack Composeでアプリを作ってみました!
余談ですが、自宅のAndroidStudioの開発環境を最近Flamingoに変えて「Empty Activity」で作成したらJetpack Composeのアプリでできることをちょっと前に知りました。(気付くのが遅いですね。。。)
今はまだxmlでの開発が私は多いのですが、今後を考えるとJetpack Composeでの開発も増えていくのではと言うことで触ってみることにしました。# アプリ説明
特別なことはしないでただ時間を表示するアプリです。
フォーマットとしては hh : mm : ss を表示しています。
以下が画像です!
# 実際のコード
次は実際のコードです。今回はFlamin
【Android】Bluetoothパーミッションまとめ
# はじめに
最近Bluetooth関連の機能を実装しているプロジェクトを触ったのですが、Bluetoothに関するパーミッションってたくさんありますよね。
上記に関するパーミッションがそれぞれどういう役割を担っているのか備忘録的に残しておこうと思います。# BLUETOOTH
Android12以下の端末でBluetooth機能を使用する場合はまずこのパーミッションを追加する必要があります。
このパーミッションは、接続のリクエスト、接続の受け入れ、データの転送など、Bluetooth通信を実行するために必要です。# BLUETOOTH_ADMIN
Android12以下の端末で機器の検出を開始したり Bluetooth設定を操作したりする場合はBLUETOOTHパーミッションと合わせて追加する必要があります。# BLUETOOTH_PRIVILEGED
アプリがユーザーの承諾なしにBluetoothデバイスをペアリングしたり、電話帳へのアクセスやメッセージへのアクセスを許可または禁止したりできるようにするパーミッションです。
※サードパーティ製のアプリケーションでは使用で
IPアドレスを無限に自動で変更する【Android】
# adbをインストール
https://developer.android.com/studio/command-line/adb?hl=ja
# USBデバッグを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/6b1e2d18-9228-8768-ddf5-32aa983a724b.png)
# USBテザリングでパソコンとスマホを接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/adf03f97-5a5b-a5c2-2be3-5ae27e47f999.png)
# IPアドレスを自動で変更する
シェルスクリプトで自動化できます
“`powershell
# wifiはオフにしておいてください
.\adb.exe shell svc wifi disable
# IPアドレスを自動で変更する
.\adb.exe shell
Android のログについて
Android の[ログ](https://developer.android.com/reference/android/util/Log)についての記事になります。
ログは、動作確認や不具合解析には有効ですが、セキュリティやパフォーマンスの観点からリリース時には出力内容を検討する必要があります。
私もリリース時は、DEBUG レベル以下のログは出力しないようにしています。
“`kotlin:Logger.kt
object Logger {
private const val TAG = “myApp”
private const val DEBUG = falsefun e(msg: String) { Log.e(TAG, msg) }
fun w(msg: String) { Log.w(TAG, msg) }
fun i(msg: String) { Log.i(TAG, msg) }
fun d(msg: String) { if (DEBUG) { Log.d(TAG, msg) } }
fun
Kover 登場前の JaCoCo による Android のローカル単体テストのカバレッジレポート出力は難しかった
この記事は「[Kover でらくらく! Android のカバレッジレポート出力](https://qiita.com/tfandkusu/items/a6cf3dd42bb699986245)」の補足となります。
> Gradle でカバレッジレポートを出力する設定方法は、Codecov 公式で JaCoCo Plugin を使う方法が紹介されています。しかし Android のローカル単体テストを対象とする場合の設定が難解です。近年、Kotlin 公式のプラグインである Kover がリリースされ、それを使用することで、 最短2行のシンプルな記述でカバレッジレポートの出力を設定できるようになりました。
と言いましたが、[JaCoCo Plugin](https://docs.gradle.org/current/userguide/jacoco_plugin.html) はどのくらい難解だったのかを解説します。
# 開発スタイルおよび環境
この記事では元の記事と同様の開発スタイルおよび環境を想定しています。
– Android プロジェクト
– マルチモジュールを
Android 10から13までのメディアファイルへのアクセス
# 経緯
Androidアプリで久しぶりに画像・動画・音声などのメディアファイルへのアクセスを実装する機会があり、かなり昔と変わったなと感じたので整理してみます。
主に[対象範囲別ストレージ](https://developer.android.com/training/data-storage?hl=ja#scoped-storage)が実装されたAndroid 10以降からが大きな変更かと思いますので、Android 10以降のお話をまとめます。結局今どうやって実装すれば良いのかを早く知りたい!という方は[こちら](#実装)からご覧ください。
# Android10から13までのメディアファイルアクセスに関する変更点
## Android 10 (APIレベル 29)
Android 10で[対象範囲別ストレージ](https://developer.android.com/training/data-storage?hl=ja#scoped-storage)が実装されました。
メディアファイルに限った話を端的にまとめると、**システム側でアプリと各メディアファイルが紐付け
ElixirDesktopでスマホアプリを作る – Phoenix1.7のアプリを起動
こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はElixirDesktop + Phoenix1.7のスマホアプリをWindows11 + WSL2で動かす手順をまとめたいと思います。———————————————
なお、本記事は2023/7/13開催[ElixirMobile#3:DBも内蔵したElixirDesktopスマホアプリ開発ハンズオン](https://fukuokaex.connpass.com/event/283648/)のイベントレポート(前半)を兼ねています。
——ハンズオンの様子(前半)はこちらから——
↓ ~27:03までが本記事のハンズオン動画です。
———————————————
■「ElixirDesktopでスマホアプリを作る」シリーズの
Android、DatePickerDialogで日付、TimePickerDialogで時間の選択
# Androidで日付の選択、時間の選択
アプリで日付を入力するEditTextを作成する機会があったって、手入力もダルいので、DatePickerDialogで日付、TimePickerDialogで時間の選択できるようなサンプルを作ってみました。よくある、こんなやつでね。
以下のQiita記事を参考にさせていただきました。ActivityからDatePickerDialog、TimePickerDialogが呼ばれる場合は、このサンプルの通りでよいですが、Fr
FlowとStateFlowとstateIn()
# Flow (-> MutableStateFlow) -> StateFlow
UseCaseでFlowを作って、ViewModelでStateFlowにして、Screenで表示する方法を学習しようと思います。結論は、「UseCaseのFlowをそのままstateIn()で流すのはよろしくない。」でした。
## 改造前のソース
APIリポジトリ
“`kotlin
fun getAreaFlow(): Flow> {
return flow> {
val response = forecastApi.getArea()
if (response.isSuccessful) {
emit(Future.Success(value = response.body()!!))
} else {
throw HttpException(response)
}
}.catch