Android関連のことを調べてみた

Android関連のことを調べてみた

[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 /

元記事を表示

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に

元記事を表示

OTHERカテゴリの最新記事