- 1. AndroidでOpenCVを使って疑似カラー変換する
- 2. DataStoreのInvalidProtocolBufferExceptionへの対処方法
- 3. OPPO Reno7A に気圧計がなかった話
- 4. Supabaseでローカル開発する際にAndroid Emulatorの通信エラーが発生した
- 5. PowermockがJava11以降動作しない
- 6. BroadcastReceiver では exported 動作を指定する必要がある
- 7. エミュレータの画面いっぱいにボタンが広がっていた原因
- 8. 【SwiftUI】@State を 単方向に流す ということ
- 9. android ndkで外部ライブラリを使用する方法
- 10. Flutter案件待ち間の冒険:アプリ模倣チャレンジの始まり!
- 11. AndroidでHTMLコードの変換時のあれこれのメモ
- 12. Android 版の Jetpack Compose に独自のテキスト選択メニューを実装する
- 13. jetpack composeでcameraxとmlkitをつかってバーコード読み取り画面を実装するPart1
- 14. 【Android】バージョン分岐が必要な実装はCompat系の機能を使おう
- 15. Flutter ドロップダウンメニューのテンプレート
- 16. 【Android】RecyclerViewのイベントの実装
- 17. Androidアプリサンプルにおける単体テストのテストスコープについて調べてみた
- 18. Hilt の kapt を ksp にする
- 19. Androidでちょっとした動画を再生したいと言われたので10分で対応してみる
- 20. a-5-1-6.Realm DBの暗号化と暗号化キーの作成
AndroidでOpenCVを使って疑似カラー変換する
# 疑似カラー変換とは
モノクロの画像を画素の濃淡で色を当てはめてカラーにする変換する処理
カラーの画像をモノクロ画像に変換するなどして使うと写真の加工フィルターとしても使えますイメージとしてはこちらのサイトのグレースケールと色の関係を示すカラーバーがわかりやすいかもしれません
http://home.u08.itscom.net/makoigkn/pseudo_color.html# 実装
AndroidへのOpenCVの入れ方については省略
下記がコードになります。“`kotlin
// BitmapをMatに変換
val mat = Mat()
Utils.bitmapToMat(bitmap, mat) // 対象となるbitmapを入力// グレースケールに変換
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_BGR2GRAY)// 疑似カラー変換
val colorMap = Mat()
Imgproc.applyColorMap(mat, colorMap, Imgproc.COLORMAP_JET)// Mat
DataStoreのInvalidProtocolBufferExceptionへの対処方法
Preference DataStoreを使っているアプリで、レアケースながら、`InvalidProtocolBufferException`によるクラッシュがCrashlyticsに記録されていました。どうやらファイルが破損してしまい、読み出せなくなっているようです。
再現はできないので推測になりますが、ファイルが破損しているため、再起動しても復帰することができず、繰り返しクラッシュして起動不可に陥っているようです。スタックトレースは以下のようになっていて、アプリのコードを経由していないのでcatchすることはできません。
“`
CodedInputStream$StreamDecoder.readTag
androidx.datastore.preferences.protobuf.InvalidProtocolBufferException
– Protocol message contained an invalid tag (zero).Fatal Exception: androidx.datastore.core.CorruptionException
Un
OPPO Reno7A に気圧計がなかった話
https://dailyportalz.jp/kiji/love-atmospheric-pressure
これで紹介されていた気圧計が3万円と高く、気軽には買えないなーと。
以前、iPhoneを使っていたときはWidgetで気圧を測るものがあり、最近のスマホにはだいたいついているという話を聞いたので、termuxでセンサーの値を取ってきてゴニョゴニョすればいいと思いつく。
“`
termux-sensor -l
“`
“`
{
“sensors”: [
“bmi26x Accelerometer Non-wakeup”,
“mmc56x3x Magnetometer Non-wakeup”,
“Rotation Vector Non-wakeup”,
“bmi26x Gyroscope Non-wakeup”,
“stk32600 Proximity Sensor Wakeup”,
“gravity Non-wakeup”,
Supabaseでローカル開発する際にAndroid Emulatorの通信エラーが発生した
# はじめに
Supabaseとは、Firebaseの代替を謳っていてモバイル・Webなどのアプリ開発に伴う充実したサービスを提供してくれるSaasとなります。
また、本筋からずれてしまうため省略しますが、Supabaseの優れた機能の中の1つとしてLocal環境が簡単に構築できる機能があります。
https://supabase.com/docs/guides/cli/local-development
# 今回の問題
Supabaseはクライアントで利用する際、以下のような初期化処理を行います。
“`dart
await Supabase.initialize(
url: ‘https://domain.com:54321,
anonKey: ‘xxxxxxxxxx,
);
“`今回、このローカル開発をする中でiOSでは正常にSupabaseにアクセスできるのにAndroidだとアクセスできない事象が発生していました。
もちろん、Androidのネットワーク設定は完了しています。
https://qiita.com/y-matsum
PowermockがJava11以降動作しない
# 概要
UniteTestでpowermockを用いて静的クラスなどのモックを行っているところがJDKを上げるとエラーで失敗する。
> llegal reflective access by org.powermock.reflect.internal.XXXX(file:…) to method java.lang.Object.clone()Java9+でリフレクションの規制が強くなったためリフレクションのアクセスでエラーになっている。
# 対応
アクセスを許可するコマンドをテスト時のみ実行させる。@build.gradle
“`
android {
testOptions {
unitTests.returnDefaultValues = true
all {
jvmArgs = [“–illegal-access=debug”,
“–add-opens”,”java.logging/java.util.logging=ALL-UNNAM
BroadcastReceiver では exported 動作を指定する必要がある
# 概要
[実行時に登録されるブロードキャスト レシーバでは、エクスポート動作を指定する必要がある](https://developer.android.com/about/versions/14/behavior-changes-14?hl=ja#runtime-receivers-exported)
> Android 14(API レベル 34)以降をターゲットとし、コンテキスト登録されたレシーバを使用するアプリとサービスでは、レシーバをデバイス上のすべてのアプリにエクスポートするかどうかを示すフラグ(それぞれ RECEIVER_EXPORTED または RECEIVER_NOT_EXPORTED)を指定する必要があります。この要件は、Android 13 で導入されたこれらのレシーバー用の機能を利用して、アプリをセキュリティの脆弱性から保護するのに役立ちます。
# 対応
殆どの場合、他のアプリからのBroadcastを受けとって何か処理を実行するような連携動作を行うことはないので、`RECEIVER_NOT_EXPORTED` で問題はない。A
エミュレータの画面いっぱいにボタンが広がっていた原因
### きっかけ
Androidアプリを作っていて、ふと見ると配置したボタンがエミュレーターの画面いっぱいに広がっていてびっくりしたので原因を調べた。
### 原因
res/layout/activity_main.xmlのButtonタグに、android:layout_weight=”1″が実装されていたため
### android:layout_weightとは
UIの構造を定義するレイアウトの1つであるLinearLayoutで使える。
Viewを配置した際残っているスペースを埋めることができる
layout_weightを指定していない場合は0として扱われる。### ボタンが広がらないように修正した方法
android:layout_weight=”1″を削除しエミュレータで確認するとイメージしたボタンの大きさになったため削除しておく方法をとった
【SwiftUI】@State を 単方向に流す ということ
SwiftUI での基本的なこれ。
![sc 2024-06-11 at 16.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/016794a5-656b-0410-ecd1-050c7d849a96.png)
“`swift
@State var text = “”TextField(“text”, text: $text)
“`一方、Android JetpackCompose では、単方向にデータを流します。
「View では複雑なことをせず、受け取った値を表示して終わり」
という これが JetpackCompose のポリシーの中心となっています。
https://developer.android.com/develop/ui/compose/architecture
というかんじで、単方向に流す。
![sc 2024-06-11 at 16.51.13.png](https://qiita-image-store.s3.ap-northea
android ndkで外部ライブラリを使用する方法
多分もっと良い方法があると思うが、とりあえず動いた方法
# ライブラリの準備
– ソースコードを取ってきて
“`shell
git clone https://github.com/ARMmbed/mbedtls.git
“`– ビルド
“`shell
cd mbedtls
export NDK_HOME=${HOME}/Android/Sdk/ndk/26.1.10909125
for a in arm64-v8a armeabi-v7a x86 x86_64
do mkdir build_${a}; cd build_${a}
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_ABI=${a} -DANDROID_PLATFORM=android-31 ..
make
cd ..
done
“`– コピー
“`shell
for a in arm64-v8a armeabi-v7a x86 x86_64
do mkdir -p
Flutter案件待ち間の冒険:アプリ模倣チャレンジの始まり!
## はじめに
こんにちは、Flutterファンの皆さん!アプリ開発の魔法使いを目指して、今、私が取り組んでいるのはちょっと変わったチャレンジです。それは、既存のアプリをFlutterで再現してみるというもの。これは単なる時間つぶしではなく、Flutterの可能性を探求し、その過程を共有するための冒険です。どのようにアプリが構築されているかを探り、それを自分の手で再現してみる。面白そうじゃないですか?## チャレンジの背景
新しいプロジェクトのオファーを心待ちにしながら、技術の磨きをかけるのに最適な方法として、この「アプリ模倣チャレンジ」を始めました。選んだアプリはiPhoneの定番から、皆さんがお勧めするアプリまで様々。Flutterでどこまで再現できるか試してみます。## このチャレンジで期待すること
– **新しいトリックの発見**: 既存のアプリから新しいプログラミングの技術やアイディアを学び取ります。
– **コミュニティとの交流**: GitHubにコードをアップすることで、世界中のFlutter愛好家と知識を共有し、彼らからのインサイトを得ます。
– **創造的
AndroidでHTMLコードの変換時のあれこれのメモ
# HTMLコードの変換(装飾)
androidのAPI Lvevl が23以下なら
“`
Html.FromHtml(text)
“`
androidのAPI Lvevl が24からは ↑の方法は非推奨とされているので、 **HtmlCompat**を使う“`
HtmlCompat.FromHtml(text, HtmlCompat.FromHtmlModeCompact)
“`# 正規表現で一部のHTMLタグを非表示にする
imageタグを非表示にする
“`
text.replaceAll(“]*>”, “”)
“`# 正規表現で一部のHTMLタグを他の文字に変換する
“`
text.replaceAll(““, “”)
“`# 正規表現で特定のタグがいくつあるか数える
“`
private fun countTags(string: String): Int {
val pattern = “]*>”
Android 版の Jetpack Compose に独自のテキスト選択メニューを実装する
# 概要
Jetpack Compose を使って UI を実装すると、テキスト選択時のメニューが基本的なものしか使えないので追加したくなります。![Screenshot (2024_06_09 19 59 07).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102004/b94b3262-e6dd-2a67-995e-38b94300d453.png)
EditText のようにテキストを選択して何かしらの操作をするメニューを実装したい場合、
Android 版の Jetpack Compose では Desktop 版のようなインターフェイスは用意されていないので、別の方法で実装する必要があります。調べたところ、TextToolbar を継承したクラスに ComposableView を渡し、従来の View の startActionMode を呼び出すことで実現できそうでした。
表示するメニューの項目は XML で定義します。
なお、これをやるとデフォルトの cut / copy /
jetpack composeでcameraxとmlkitをつかってバーコード読み取り画面を実装するPart1
# はじめに
今回からJetpackComposeでのバーコード読み取り機能を実装していきます。
### 本文
今回は、まず必要なライブラリたちを追加するところからです
最近はtomlでバージョン管理をするのが流行なのでそれにのってってやっていきます
“`kotlin
code-scanner = “18.3.0”
camerax = “1.4.0-beta01”codescanner = {module = “com.google.android.gms:play-services-mlkit-barcode-scanning”, version.ref = “code-scanner”}
camera = { module = “androidx.camera:camera-camera2”, version.ref = “camerax” }
camera-lifecycle = { module = “androidx.camera:camera-lifecycle”, version.ref = “camerax” }
camera-view = { module =
【Android】バージョン分岐が必要な実装はCompat系の機能を使おう
# はじめに
対応範囲は広いプロジェクトなどは、そのバージョンに合わせて分岐するのが面倒ですよね。
そういったケースで便利なのがCoreKtxライブラリが提供するCompat系の機能ですが、実はかなりの種類が定義されていて、バージョンの分岐が必要な実装には大体Compat系の実装が用意されていたりします。
そこで今回はCompat系の実装を使うことでバージョン分岐を省略可能な実装をいくつかご紹介したいと思います。# 準備
まず、Compat系の実装を使うには、以下ライブラリを導入する必要があります。“`app/build.gradle
dependencies {
implementation ‘androidx.core:core-ktx:1.13.1’
}
“`上記ライブラリは最新のプラットフォーム機能とAPIをターゲットにしつつ、古いデバイスもサポート可能となるライブラリです。
まさにバージョン分岐が必要なケースの為に用意されているようなライブラリですね。# その1:ServiceCompat
サービス周りは最近特に厳しくてバージョン分岐も激しくなりが
Flutter ドロップダウンメニューのテンプレート
# ドロップダウンメニュー (PopupMenuButton)のテンプレート
「…」を押すと出てくるメニュー
これです↓
コード
“`dart
PopupMenuButton(
onSelected: (String s){
switch(s){
case “del”:
break;case “edit”:
break;
}
【Android】RecyclerViewのイベントの実装
## はじめに
RecyclerViewで表示しているリストのタップイベントを実装しようとした時に、イベントの実装をどこに置くのがいいのか迷うことがありました。
今まではViewModelに処理を持たせてListAdapterにViewModelを渡し、ListAdapter→ViewModelにアクセスするように作っていたのですが、[公式サイト](https://developer.android.com/topic/architecture/ui-layer/events?hl=ja&_gl=1*8i836n*_up*MQ..*_ga*MTI2NTI1MjQxMC4xNzE3NTg2NjE4*_ga_6HH9YJMN9M*MTcxNzY3MTI0MS40LjAuMTcxNzY3MTI0MS4wLjAuMA..)(UI イベント)を見てみると、その方法は推奨されないとのこと。
>警告: ViewModel を RecyclerView アダプターに渡すことは、アダプターと ViewModel クラスを密結合させることになるため、おすすめしません。公式では、ListAdapterに
Androidアプリサンプルにおける単体テストのテストスコープについて調べてみた
[単体テストの考え方/使い方](https://www.amazon.co.jp/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E4%BD%BF%E3%81%84%E6%96%B9-Vladimir-Khorikov/dp/4839981728/ref=sr_1_1?adgrpid=146552030392&dib=eyJ2IjoiMSJ9.DwAMKN29hHMmZWAvUlEn2A3QQK1nnfD3KmHUkW3juAQ_ko6ILz9DBpmcn0ixQ2dfiBbmX0ZazRUq5oLHyFTvS_wKTCY5Jv43bFltrJUsbQ59eF3_BuWZK1d0xsq5AGgSSB1jngr9nXYSL6QSwTleRavEbTzlgXYngUMLtI4wn_UlndTJrNc2hn0gSqzDfzrjKaqerPTtlLgx6EeeSY8vOWTEnJ-gfi_GeFeBiUODeJ5iqH9wIvoZo3ycGUJGBoXV.equosaUSpav
Hilt の kapt を ksp にする
## はじめに
kapt 、ksp って何? みたいな話は他者様の記事に任せるとして、本記事には Hilt + kapt の環境を Hilt + ksp に移行した作業のみを簡潔に記載する。
### 移行の方針
Hilt + ksp にする方針は [kapt から KSP に移行する](https://developer.android.com/build/migrate-to-ksp?hl=ja) と [Dagger KSP](https://dagger.dev/dev-guide/ksp.html) の Requirements に基づく。
> Dagger 2.48 (or above)
> Kotlin 1.9.0 (or above)
> KSP 1.9.0-1.0.12 (or above)### 環境
AGP(Android Gradle plugin) は `8.4.1`。
“` Groovy: gradle/wrapper/gradle-wrapper.properties
plugins {
id ‘com.andr
Androidでちょっとした動画を再生したいと言われたので10分で対応してみる
# はじめに
Androidアプリにてふとした要件で動画を再生してほしいと言われたことはありませんか。
ビルトインで動画ファイル内包するのもなぁという思いもありつつあまり手間もかけたくない…
そんな時にあまり手間をかけずに実現するソリューションをご紹介しようと思います!フォーカスしませんがその他の手段もまとめていますのでご活用いただければ嬉しいです。
今回作るアプリ
(みんな大好きbig buck bunnyです)
# 全体の流れ
1. 動画ファイルをgoogle driveにアップロードする
2. google driveからリンクを取得
3. composeとexoplayerでgoogle driveの動画を再生する## 動画リンクの用意
今回はサクッと試したいということで動画ストレージとしてgoo
a-5-1-6.Realm DBの暗号化と暗号化キーの作成
### a-5-1-2(3).Realm DBのデータ保存と更新、削除(配列以外、配列)
#### 目標設定
[一覧に戻る](https://qiita.com/ryouta33/items/57f5e51a26086151a0da)#### Github
https://github.com/wakizaka24/AndroidTest
#### テスト実装
“`kotlin:RealmTestService.kt
package com.example.androidtestimport android.text.TextUtils.concat
import android.util.Base64
import android.util.Log
import io.realm.kotlin.Realm
import io.realm.kotlin.RealmConfiguration
import io.realm.kotlin.ext.realmListOf
import io.realm.kotlin.types.EmbeddedRealmObject
im