- 1. THETA新機能バースト撮影方法
- 2. TWRPでError: 7が出るときに試してみる事
- 3. rememberLazyListState の仕組み
- 4. Jetpack Composeで、Mutable系統をStateに登録したらあかん
- 5. JUnit5の@ParameterizedTestがAndroidStudioで認識されない
- 6. Flipper の導入
- 7. Jetpack Compose でログインフォームを作る
- 8. 【Kotlin】冗長的なレイアウトファイルからの脱却
- 9. プログラムでOSはHarmony(HarmonyOS)かAndroidか判断する方法
- 10. Universal Android Music Player(UAMP)のカスタマイズ (メニューの変更 2)
- 11. Flutterで手書きを実装する
- 12. [Mockk]SystemClockをモックする
- 13. Android + Kotlin での HTTP リクエストの方法
- 14. 【Android】Looper を持つスレッドの CoroutineDispatcher を作る
- 15. [Coil]キャッシュサイズを変更する方法
- 16. 【Android】ViewPager2+FragmentStateAdapterでFragmentを置き換える
- 17. 孫から祖父へテレビ電話(LINEのできるタブレット)をプレゼントした話
- 18. Application を ViewModelStoreOwner にする方法
- 19. AlertDialogのカスタマイズその1:引数を渡そう
- 20. フォアグラウンドサービスの作り方
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.
孫から祖父へテレビ電話(LINEのできるタブレット)をプレゼントした話
# この記事では
齢80を超えた祖父に孫(筆者)から初めてのスマホ(タブレット)をプレゼントしてLINEでおしゃべりするようになるまでを振り返ります。
なお「孫」の発音は「**ま**ご」。##発端
新型コロナの流行拡大が止まらない2020年。田舎の祖父(農家。パソコンはワープロ、ネット環境はない)が高熱で入院。
ごく小さいながら年相応に前立腺がんがあり、その治療でトイレが近くなっていたらしい祖父は水分を控えて結果膀胱炎か何かになったらしい。## 何が起こった
コロナ時代の入院といえば面会制限。
面会できるのは1人だけ、1日30分。洗濯物を引き取らなければならないし、日々の細かな対応も必要というので面会者になったのは祖母(パソコンもワープロも知らない、電話は固定電話のみ)。
車で1時間のところに住んでいる叔父が駆けつけるも、面会制限に引っかかって門前払い。会話はできる状態らしいと聞けば、声が聞きたいし聞かせたいのが心情というものでしょう。
この時点で入院は1か月くらい?と言われていた。そんなこと言われたら叔父も母も(もちろん私も)余計に声が聞きたくなるじゃないか。
そこで叔父、
Application を ViewModelStoreOwner にする方法
## はじめに
気軽に Activity 間でデータを共有する場合は、Application を継承したクラスを ViewModelStoreOwner にすると良いです。このように設計することで、Application を継承したクラスが肥大化することなく、Application にグローバルな値を持たせることができます。
## 実装
“`kotlin
class MyApplication : Application(), ViewModelStoreOwner {
private val store = ViewModelStore()
override fun getViewModelStore(): ViewModelStore {
return store
}
}
“`Application の実装はこれだけです。今後グローバルな状態が増えたとしても、Application が肥大化することはありません。代わりに ViewModel の数が増えます。
## 使用例
次のコードは、`SubActivity` で加算した値が `MainAc
AlertDialogのカスタマイズその1:引数を渡そう
何かと便利な`AlertDialog`ですが、引数を渡してその内容を表示させることも簡単にできます。
ViewBindingを使い柔軟にカスタマイズすることもできますが、今回はシンプルにテキストのみを呼び出し元から渡すサンプルを実装してみたいと思います。# AlertDialogについて
基本的にAndroidのDialogは`タイトル`、`コンテンツエリア`、`PositiveButton`、`NegativeButton`、`NeutralButton`といった部品で構成されています(ボタンの総称を`ActionButton`とも言います)。
Dialogとしては`AlertDialog`が最もよく使われ、Alertとはありますが別に警告に限らず様々な用途で使うことができます。
フォアグラウンドサービスの作り方
## はじめに
通常のサービスには制限がありますが、フォアグラウンドサービスにすることにより制限を緩和できます。
## 実装
次のコードは通常のサービスの実装です。
“`kotlin
class MyService : Service() {
override fun onBind(intent: Intent): IBinder? {
return null
}override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return START_STICKY
}
}
“`それに対して次のコードはフォアグラウンドサービスの実装です。
“`kotlin
class MyService : Service() {
override fun onBind(intent: Intent): IBinder? {
return null
}override fun onStartCommand(intent: Intent