- 1. 今あるサイトを手軽にアプリ化
- 2. 日本初の英語Flutterイベント、FlutterNinjas Tokyo2024に参加してきました!
- 3. gradleのファイル多すぎて訳わからん【Android】アプリ開発【Flutter】
- 4. あなたのアプリは大丈夫?! 今すぐプッシュ通知のチャンネルを見直そう!!
- 5. [Flutter] 環境変数の確認方法とAPKファイル生成時に沼った話 AAPT: error: resource android:attr/lStar not found.
- 6. 複数の SARIF ファイルを統合する
- 7. android.database.sqlite.SQLiteCantOpenDatabaseException への対処方法
- 8. 学園アイドルマスターのバックグラウンド再生が凄い という話
- 9. AndroidでOpenCVを使って疑似カラー変換する
- 10. DataStoreのInvalidProtocolBufferExceptionへの対処方法
- 11. OPPO Reno7A に気圧計がなかった話
- 12. Supabaseでローカル開発する際にAndroid Emulatorの通信エラーが発生した
- 13. PowermockがJava11以降動作しない
- 14. BroadcastReceiver では exported 動作を指定する必要がある
- 15. エミュレータの画面いっぱいにボタンが広がっていた原因
- 16. 【SwiftUI】@State を 単方向に流す ということ
- 17. android ndkで外部ライブラリを使用する方法
- 18. Flutter案件待ち間の冒険:アプリ模倣チャレンジの始まり!
- 19. AndroidでHTMLコードの変換時のあれこれのメモ
- 20. Android 版の Jetpack Compose に独自のテキスト選択メニューを実装する
今あるサイトを手軽にアプリ化
## 既存のサイトをアプリのように見せたい、そんな時にPWAは強力
– すでにサイトはあるが、アプリはない。
– アプリを作るまでではないが、あったらあったでうれしい。## PWAを使えば、ほぼ工数をかけずアプリ化することができる
– 前提条件
– HTTPSが使える。
– 簡単にお試ししたいのであれば、[Netlify](https://app.netlify.com)がおすすめ。
– 手順
1. マニフェストを作成。
– アプリの説明などを記述 。
1. サービスワーカーを作成。
– 既存のサイトをアプリのようにみせるだけであれば、最低限の実装で十分。
– 作りこむことで、オフラインでの使用・プッシュ通知などが行えるようになる。
1. アプリ化させたいページで、マニフェストとサービスワーカーを読み込む。
– サンプル
– https://github.com/skanno/sample_pwa## アプリとしてインストールするには?
– ブラウザで該当ページを読み込み、「ホーム画面に追加」を行う。
日本初の英語Flutterイベント、FlutterNinjas Tokyo2024に参加してきました!
# はじめに
2024/6/13~2024/6/14にお台場で開催された「**FlutterNinjas Tokyo 2024**」に参加してきました。英語で実施されるFlutterイベントは**日本初**とのことで、かなり豪華なメンバーでした!
Flutterアプリ開発には欠かせない「Riverpod」、「Provider」などのライブラリの作者である「**Remi Rousselet**」さんも登壇されていました。
# セッションの感想
どのセッションも素晴らしかったですが、とても語りきれないので特に印象に残ったセッションについて感想を書きます!:::note warn
拙い英語力で理解した内容なので間違っていたらすみません!
:::## Riverpod 3.0, the preview
スピー
gradleのファイル多すぎて訳わからん【Android】アプリ開発【Flutter】
いっぱいある gradle ファイルをまとめてみました。
– gradle/wrapper/gradle-wrapper.properties
– gradle.properties
– settings.gradle
– build.gradle
– app/build.gradle# そもそも gradle とは?
元々は Java 言語向けに作られたツールで、書いたコードをまとめたり、足りないライブラリをダウンロードしてきて製品を作り上げてくれます(ビルドツール)。最近よく使われる Kotlin 言語も Java 言語と同じ仕組みの上で動いているので Android 開発では公式に採用されています。
# それぞれのイメージ
Gradle をサンタさん、プロジェクトを家、アプリをその家の子供だとしましょう。
Gradle は必要なものを子供に届けてくれる役割をします。![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/87045c8e-35e7-419
あなたのアプリは大丈夫?! 今すぐプッシュ通知のチャンネルを見直そう!!
# この記事を書いたきっかけ
ある日何気なく某アイスクリーム屋のアプリの通知の設定を確認したら、衝撃的なものを目にした!
**31club_channel_name**
channel_nameってなんだよ! クラス名を 31ClassName みたいにしているようなものじゃん!!
# そもそもプッシュ通知チャンネルって?
プッシュ通知チャンネルは、Android 8.0(API レベル 26)で割り当てるようになったもので、通知をグループ化するためのもの。
この機能によってユーザーは「このアプリの大事な通知は受け取りたいな でも広告はいいや」といった設定が可能になる。[参考: https://developer.android.com/develop/ui/views/notifications/chan
[Flutter] 環境変数の確認方法とAPKファイル生成時に沼った話 AAPT: error: resource android:attr/lStar not found.
# 環境変数の確認方法とAPKファイル生成時のエラー対応
プロジェクト内で環境変数が適切に暗号化されているかどうかを確認する方法の一つとして、生成されたAPKファイルをデコンパイルしてその内容を確認することができます。
今回はその実装手順とエラーで沼った内容について書きたいと思います。## 手順解説
### APKファイルの生成
まずは、以下のコマンドを実行してAPKファイルを生成します。
“`bash
flutter build apk
“`
このコマンドは、デフォルトでリリースモードのAPKファイルを生成します。デバッグモードやプロファイルモードのAPKを生成したい場合は、それぞれ以下のコマンドを使用します。デバッグモードのAPKを生成する場合:
“`bash
flutter build apk –debug
“`プロファイルモードのAPKを生成する場合:
“`bash
flutter build apk –profile
“`また、特定のABI(Application Binary Interface)向けのAPKを生成する場合は、以下のように
複数の SARIF ファイルを統合する
# 経緯
Kotlin 言語で Android アプリ開発をしています。こちらの文献を参考に静的解析ツールの [detekt](https://detekt.dev/) を導入しました。
https://medium.com/@emrekoc/detekt-static-code-analyzer-for-android-c4c9bfd42a8c
これにより Gradle のタスク実行だけで静的解析ができて、レポートも出力できるようにしました。
“`sh
./gradlew deteKt
“`[レポート形式](https://detekt.dev/docs/introduction/reporting/)は HTML や XML がありますが、今回は標準フォーマットと称される [SARIF](https://sarifweb.azurewebsites.net/) を使うことにしました。
さらに検出された Issue を GitHub のプルリクページにコメントするために、[reviewdog](https://github.com/reviewdog/reviewd
android.database.sqlite.SQLiteCantOpenDatabaseException への対処方法
roomを使っているアプリでCrashlyticsに`SQLiteCantOpenDatabaseException`によるクラッシュが記録されていました。
原因はいろいろあるようで、ストレージがいっぱいになってしまっていたり、ファイルの破損のようなものだったり、ストレージそのものが破損しているのではと思われるものだったり。
いずれも繰り返し発生し、アプリの起動すらままならない状況になっていそうですが、モバイル端末で動いている以上、アプリとして完全に回避するのは難しそうな問題です。しかし、ファイルの破損であれば、DBファイルを作り直させれば復帰できる可能性があります。DBに重要なデータが格納されている場合は安易に削除できないですが、キャッシュとして使っているなど、データが消失しても大きな問題にならないなら、復帰を優先しても良さそうです。前置きが長くなりましたが、データが消えてもいいからクラッシュを回避したい。ということで調査してみました。
スタックトレースは以下のようになっています。
“`
android.database.sqlite.SQLiteConnection.op
学園アイドルマスターのバックグラウンド再生が凄い という話
## TL;DL
– ゲームアプリ「学園アイドルマスター」にはAndroid/iOS端末で楽曲のバックグラウンド再生機能がある
– Unity+CRIWareでバックグラウンド再生を行うのは障害がある
– バックグラウンド再生用にネイティブPluginを実装しないと多分実現できない、凄く手間がかかっている## この記事の目的
学園アイドルマスターには楽曲のバックグラウンド再生機能があります。
この記事は、バックグラウンド再生の何が凄いのか、実装する上で何が障害になるかを考察する事を目的としています。## 免責事項
筆者は株式会社バンダイナムコエンターテインメント及び株式会社QualiArtsとは無関係です。
また、筆者はスマートフォン用ゲームアプリ「学園アイドルマスター」の開発に一切関わっていません。
この記事では、「学園アイドルマスター」のゲーム内画面をスクリーンショットで引用しています。## 学園アイドルマスターとは
https://gakuen.idolmaster-official.jp/QualiArtsとバンダイナムコエンターテインメントが2024年5月16
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 /