- 1. GooglePlayのアプリ提出仕様変更に伴いUnity2020でGradleビルドエラー
- 2. 【Firebase×BigQuery】ユーザー毎に最適なUI表示や通知を叶えるFirebaseのImport segments
- 3. 【Flutter】VSCodeでAndroid開発「cmdline-tools component is missing」をやっつける
- 4. 【Flutter】ListViewでD&Dソートに対応しつつ並び順を保存する
- 5. THETA新機能バースト撮影方法
- 6. TWRPでError: 7が出るときに試してみる事
- 7. rememberLazyListState の仕組み
- 8. Jetpack Composeで、Mutable系統をStateに登録したらあかん
- 9. JUnit5の@ParameterizedTestがAndroidStudioで認識されない
- 10. Flipper の導入
- 11. Jetpack Compose でログインフォームを作る
- 12. 【Kotlin】冗長的なレイアウトファイルからの脱却
- 13. プログラムでOSはHarmony(HarmonyOS)かAndroidか判断する方法
- 14. Universal Android Music Player(UAMP)のカスタマイズ (メニューの変更 2)
- 15. Flutterで手書きを実装する
- 16. [Mockk]SystemClockをモックする
- 17. Android + Kotlin での HTTP リクエストの方法
- 18. 【Android】Looper を持つスレッドの CoroutineDispatcher を作る
- 19. [Coil]キャッシュサイズを変更する方法
- 20. 【Android】ViewPager2+FragmentStateAdapterでFragmentを置き換える
GooglePlayのアプリ提出仕様変更に伴いUnity2020でGradleビルドエラー
# はじまり
Androidアプリ申請の仕様が変わりaab形式のビルドを提出する必要ができました。apk形式からaab形式の切り替えは問題なく行えたのですがTargetAPILevelを30以上にする必要があるとストア側に言われ30に設定したところGradleビルドエラーが発生して積みました、、、
“`
FAILURE: Build failed with an exception.* What went wrong:
Execution failed for task ‘:launcher:processReleaseResources’.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> Android resource linking failed
“`“`
CommandInvokationFailure: Gradle build failed.
/${OpenJDK_PATH}/bin/java –
【Firebase×BigQuery】ユーザー毎に最適なUI表示や通知を叶えるFirebaseのImport segments
『特定のユーザーに向けて通知を配信する』
という事をやりたくて初めてImport segmentsというFirebaseの機能を使いました。現在2021年9月18日時点で、まだβの機能。情報が少なくて困ったところもあったので、自分の備忘録のためにメモ。:writing_hand_tone1:
#Import segmentsとは
Firebaseの**Import segments**を活用すれば、Remote Config、 Cloud Messaging、In-App Messagingなどで、ユーザーのグループをターゲットにすることができるようになる。
ユーザー体験を、各ユーザーの特徴に合わせて、簡単にFirebaseコンソール上から調整することが可能になるということ:thumbsup:#Segmentを利用してやってみたこと
Cloud MessagingでSegmentを条件に通知を配信する事をやってみた。流れとしては以下の通り。1. BigQueryに存在するSegmentをFirebaseに取り込む(インポートする)
2. FCM(Firebase Clou
【Flutter】VSCodeでAndroid開発「cmdline-tools component is missing」をやっつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/1b60631f-6526-0e66-3e3f-f39d92836fca.png)
## やりたいこと
VSCodeで、Flutter開発をしていました。
Androidアプリも開発してみたくなったため、[こちら](https://www.casleyconsulting.co.jp/blog/engineer/4587/)の記事などに勉強させていただきながら、– VScode
– Android Studio
– Flutterの環境構築をしました。
ゴールは、flutter doctorしてAndroidに関して何のエラーも出ないようにすることです。## やったこと
まず、“`
flutter doctor
“`
します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/d537d1a9-
【Flutter】ListViewでD&Dソートに対応しつつ並び順を保存する
###はじめに
Flutterだとドラッグアンドドロップで並べ替え可能なListView自体はかなり楽に実装できるのですが、ネイティブ同様(?)並び順の保存に関しては自前で作る必要があります(たぶん)。
もし適当に保存しようものなら並べ替えやアイテムの追加・削除でごちゃごちゃになってしまいます(経験済み)。
なんとなく一番簡単そうな方法を書き綴っておきますので良ければ参考にしてみてください(もっといい方法があればコメント頂けると嬉しいです)。
因みにFlutterは始めたばかりなのでおかしなところがあるかも知れません。それとListView自体の実装とSQL関連の詳細説明は省略しますので適宜調べて貰えると幸いです。
###前提
ListViewに並べるアイテムはDBに実装済みのものとします。
今回は以下のアイテムを用意して進めます。“`dart:item.dart
class Item {
var id;
var title;
var sort;
//その他省略
}
“`###実装
#####ListViewの実装
先ずはD&Dソート可能なListV
THETA新機能バースト撮影方法
こんにちは。 @mShiiina です。
今回は、[RICOH THETA Z1のファームェア V2.00.1](https://support.theta360.com/ja/download/firmware/z1/) から搭載された新機能、バースト撮影について解説します。## バースト撮影とは
まず、バースト撮影について説明します。
THETAにはもともとインターバル撮影という、連続して写真を撮影する機能があります。
インターバル撮影は一定間隔(2秒間隔以上)で撮影する機能であり、タイムラプス動画を撮影したいときなどに使える機能です。
バースト撮影は連続して写真を撮影するというところはインターバル撮影と同じですが、撮影間隔が最短で数十ミリ秒で可能な撮影です。
さて、バースト撮影はどんなときに有効な撮影方法なのでしょうか?
よく使われるのは小さい子どもや動物など自由に動いてしまう被写体を撮影するときに、ベストショットを逃さないために撮影します。短い間隔でたくさん撮影することで、そのうちのどれかはいい写真になるはず!という心意気で撮影します。
![MicrosoftTeams-
TWRPでError: 7が出るときに試してみる事
#ERROR: 7
先ほど出たエラー名でググってみたものの情報が少なかったので(基本すぎて?)共有しようと思いました。“`
mkdir “/cache/recovery/2bdde85…./”
failed: No space left on device
E1001: Failed to update system image.
Updater process ended with ERROR: 7
Error installing zip file ‘/sdcard/TWRP/lineage17.zip’
“`
上記のエラーがlineageをtwrpでインストールしようとしたところ出ました。
ストレージに十分スペースは空いています。#解決策
cacheとdalvik-cacheをwipeしたのち再度インストールを試みたらエラーは出なくなりました。
#環境
– Lenovo Z5ProGT
– Lineage-17.1
– TWRP-3.3.1-1004#最後に
今後同じエラーに遭遇した方の解決時間短縮に貢献できれば幸いです。
rememberLazyListState の仕組み
## 疑問
次のコードは、表示されている要素のインデックスの中で最も小さいものをログに出力するコードです。出力されるタイミングは値が変わったとき、つまり一方向にゆっくりと `64dp` スクロールしたときです。私の環境では `1dp = 2.75px` であるため、`176px` 毎に出力されることになります。
“`kotlin
data class Data(val id: Int)
val data = (1..1000).map { Data(it) }@Composable
fun MainScreen() {
val state = rememberLazyListState()
Log.e(“TAG”, state.firstVisibleItemIndex.toString())LazyColumn(Modifier.fillMaxSize(), state = state) {
items(data, key = { it.id }) {
Box(Modifier.border(1.dp, Color.Black).fill
Jetpack Composeで、Mutable系統をStateに登録したらあかん
Mutable系統をStateに入れていて、数日ドツボにはまったのでメモしておきます。
# 問題
Jetpack Composeの勉強のために、以下のようなアプリを作成しました。
![スクリーンショット 2021-09-16 221859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674896/0da3bc47-e6fa-a1e2-6e7e-b7a70b453272.png)
ソースコードは以下の通りです。
“`kotlin:List.kt
@Composable
fun List(){//表示するStateを作成
val list by remember { mutableStateOf((0..3).toMutableList()) }LazyColumn(Modifier.fillMaxSize()){
//カラムを表示する部分
item{
for(i in list)
JUnit5の@ParameterizedTestがAndroidStudioで認識されない
複数の引数を入れて期待値が得られるかをテストするには、
JUnit5のParameterizedTestが便利らしいので導入しようとしました。## gradleに導入
“`gradle
testImplementation ‘org.junit.jupiter:junit-jupiter:5.5.2’
testImplementation ‘org.junit.jupiter:junit-jupiter-api:5.5.2’
testImplementation ‘org.junit.jupiter:junit-jupiter-params:5.5.2’
testRuntimeOnly ‘org.junit.jupiter:junit-jupiter-engine:5.5.2’
“`## Testは認識されるがParameterizedTestが認識されない
unresolvedになってしまう
![Screenshot 2021-09-16 194455.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws
Flipper の導入
### Flipper
Androidで、デバッグする際、logcatを確認することは多いと思いますが、DBの中身だったりレイアウトのチェックなどは出来ません。
そこで、プラグインを導入することで、デバッグすることが可能な Flipper を紹介したいと思います。
Flipperは、Facebook製のデバッグツールです。
Androidからの通知をPCのデスクトップアプリにGUIツールです。* [Flipper](https://fbflipper.com/)
* [Github](https://github.com/facebook/flipper)### Flipper の導入
* Gradleに定義
“`gradle:build.gradle.kts
debugImplementation(“com.facebook.flipper:flipper:0.104.0”)
debugImplementation(“com.facebook.soloader:soloader:0.10.1”)releaseImplementation(“
Jetpack Compose でログインフォームを作る
## はじめに
Jetpack Compose で入力フォームを作成する方法を記載します。画面に配置する要素は3つで、メールアドレス入力欄、パスワード入力欄、ボタンです。
Empty Compose Activity から作り始めた場合、おそらく追加のパッケージは必要ありません。
## 実装
まずはメールアドレス入力欄の実装です。
“`kotlin
@Composable
fun EmailTextField(
value: String,
modifier: Modifier = Modifier,
onValueChange: (String) -> Unit,
) {
val focusManager = LocalFocusManager.current
OutlinedTextField(
value = value,
onValueChange = onValueChange,
modifier = modifier,
keyboardOptions = KeyboardOptions(
keybo
【Kotlin】冗長的なレイアウトファイルからの脱却
アンケート画面などで複数のTextViewやCheckBoxが繰り返し表示される画面を作成するときレイアウトファイル(.xml)が冗長的になってしまうことがあるかと思います。
以下の画像のようなチェックボックスが複数個並んだViewを作成するとします。この時のレイアウトファイルとして真っ先に考えられるのはこんな感じかなっと思います。
“`.xml
プログラムでOSはHarmony(HarmonyOS)かAndroidか判断する方法 ファーウェイは2021年7月23日に[HUAWEI MatePad 11](https://consumer.huawei.com/jp/press/news/2021/news-210713/)をリリースしました。このタブレットはHarmonyOSを搭載しています。AndroidのアプリもHarmonyOSのアプリも正常動作します。
アプリの中でOSがHarmonyOSかAndroidか判断する場面があるかもしれないので、その方法を公開します。
“`java
public boolean isHarmonyOS() {
try {
Class classType = Class.forName(“com.huawei.system.BuildEx”);
Method method = classType.getMethod(“getOsBrand”);
ClassLoader classLoader = classType.getClassLoader();
if (classLoader != null
Universal Android Music Player(UAMP)のカスタマイズ (メニューの変更 2)
#はじめに
Android用アプリのプログラミングを学ぶため、Googleが公開しているサンプルコード **Universal Android Music Player(UAMP)**をカスタマイズしてみます。メニューをカスタマイズするために、オリジナルのコードの動作を確認します。
今回は、メニュー画面で項目がタップされてから下位のメニューを表示するまでの動作を確認します。#環境
####PC
MacBook Pro 16
2.3 GHz 8コアIntel Core i9
16 GB 2667 MHz DDR4
macOS Big Sur ver.11.5.2####開発用SW
Android Studio 4.2.1####Target Device (Virtual Device)
Category: Phone
Name: Pixcel 2
Resolution: 1080×1920 420bpi
API Level: 28
Android: 9.0
CPU: x86#コードの確認
###メニュー項目の選択(下位のメニューが存在する場合)
メニュー画面で項目が
Flutterで手書きを実装する
# 実装する機能
今回実装する機能は、
– 自由に画面をなぞると特定の範囲内で手書きで絵が描けるようにする
– ひとつ戻る(undo)ひとつ進む(redo)ボタンの実装
– 全部消すボタンの実装になります。類似した機能が入ったアプリだと消しゴムが入っていますが、今回のアプリではそこまで必要性を感じなかったため実装しません。
# パッケージ・バージョン
Flutterのバージョンは`2.2.0`です。
使用するパッケージは状態管理のために`hooks_riverpod`と`statenotifier`、`freezed`を使います。
特にそれ以外のパッケージは使用しません。
バージョンは以下の通りです。“`yaml:pubspec.yaml
dependencies:
flutter_hooks: ^0.17.0
freezed_annotation:
hooks_riverpod: ^0.14.0+4dev_dependencies:
build_runner:
freezed:
“`# 手書きの実装
## 土台の作成
本題の実装に
[Mockk]SystemClockをモックする
`mockkStatic()`を使います。
“` Test.kt
class Test {
@Test
fun systemClockTest() {
mockkStatic(SystemClock::class)
every { SystemClock.elapsedRealtime() } returns 100L
assertThat(SystemClock.elapsedRealtime()).isEqualTo(100L)
}
}
“`
Android + Kotlin での HTTP リクエストの方法
## はじめに
Firebase Authentication の ID トークンを HTTP ヘッダに付与したり、独自データと JSON 文字列間の変換を行ったりすることはよくあるのですが、頻繁に使う割に忘れるので記事として残します。
## 環境
build.gradle は次のような内容になっています。
“`groove
plugins {
…
id ‘org.jetbrains.kotlin.plugin.serialization’ version ‘1.5.21’
id ‘com.google.gms.google-services’
}dependencies {
…
implementation “androidx.navigation:navigation-compose:2.4.0-alpha06”
implementation platform(‘com.google.firebase:firebase-bom:28.4.0’)
implementation ‘com.google.fir
【Android】Looper を持つスレッドの CoroutineDispatcher を作る
関連記事:[【Kotlin/JVM】CoroutineDispatcher を作る](https://qiita.com/sdkei/items/a056a1275b05b11ddcd4)
次のようにすることで `Looper` を持つスレッドの `CoroutineDispatcher` を作ることができる。
“`Kotlin
import android.os.Handler
import android.os.HandlerThread
import kotlinx.coroutines.*
import kotlinx.coroutines.android.HandlerDispatcher
import kotlinx.coroutines.android.asCoroutineDispatcherval handlerDispatcher: HandlerDispatcher =
HandlerThread(“HandlerThreadDispatcher”)
.apply { start() }
.looper
[Coil]キャッシュサイズを変更する方法
Androidの画像ローディングライブラリ[Coil](https://coil-kt.github.io/coil/)でディスクキャッシュのサイズを変更する方法を調べたのでメモがてら記事にします。
###方法
Coilは[OkHttp](https://square.github.io/okhttp/)のディスクキャッシュ機構を利用しています。
したがって、キャッシュのサイズを変更するにはOkHttpClientを置き換えます。“` Coil.kt
val cache = Cache(
directory = File(context.cacheDir, “image_cache”),
maxSize = 500L * 1024L * 1024L // 500 MB
)
val imageLoader = ImageLoader.Builder(context)
.okHttpClient {
OkHttpClient.Builder()
.cache(cache)
.build()
【Android】ViewPager2+FragmentStateAdapterでFragmentを置き換える
ViewPager2 + FragmentStateAdapterでFragmentを追加・削除しようとしてハマった時のまとめ。
##やりたいこと
* ViewPagerにセットしたFragmentを別のFragmentに置換したい
##方針Android Developersに以下のような記載がありました。
>ViewPager2 は、編集可能なフラグメント コレクションのページングをサポートしています。基盤コレクションが変更されたときに、notifyDatasetChanged() を呼び出して UI を更新します。
これにより、アプリは、実行時にフラグメント コレクションを動的に編集できるようになり、編集されたコレクションを ViewPager2 が正確に表示します。https://developer.