- 1. minify R8 で GSON でクラス変換をする場合の注意点
- 2. Android 初心者が Room を使おうとしてハマったこと
- 3. The project is using an incompatible version (AGP 8.0.0) of the Android Gradle plugin. Latest supported version is AGP 7.3.1 の解決法
- 4. 【Flutter】showDialogを使ってを全画面で表示させる方法
- 5. androidのテストコードでassetsにアクセスする
- 6. value class をデフォルト引数にするとNullPointerExceptionが投げられる場合がある
- 7. FlutterでAndroid端末のmulti-windowモードを検知したい
- 8. hostsを使用したローカルサーバにiPhone,Androidからアクセスする
- 9. 【Flutter】ContainerにImageを載せた時にRadiusが効かず闘った話
- 10. 【Flutter】Dartの非同期処理(Future・then)
- 11. 【Android】文字入力時のキーボード操作のメモ【Kotlin】
- 12. Android Kotlin Timberを別モジュールに導入してみた
- 13. ネイティブエンジニアがFlutterでアプリをリリースした時の流れ(公開まで14日間)について
- 14. Android java GoogleMAP API を使用した、アプリ制作(ゴミ処理業者 検索アプリ)
- 15. CameraXでAndroidのカメラを起動してみる
- 16. ComposeのNavigationを使ってShareTargetアプリ(他アプリから共有情報を受信するアプリ)にする
- 17. 階層型アーキテクチャ – ドメインレイヤについて
- 18. Karteでのカスタムイベント送信方法
- 19. 【Flutter】1年間頼ってきたサイト3選
- 20. 【Flutter】Listを操るメソッド3選
minify R8 で GSON でクラス変換をする場合の注意点
# 症状
Android アプリを 1年ぶりぐらいにアップデートしようとしたところ、Release ビルドで実行した時に json 形式のデータが正常にパースされなくなる症状に見舞われました。
# 原因
アプリのビルドタスクに、
“`
> Task :app:minifyReleaseWithR8
“`という見慣れないタスクがあり、コレ(R8 での minify)が原因でした。
Android Gradle プラグイン 3.4.0 以上を使用したプロジェクトのビルドでは、ProGuard によるコンパイル時のコード最適化が行われず、R8 コンパイラとの連携により、minifyReleaseWithR8 タスクが実行されるようです。
https://developer.android.com/studio/build/shrink-code?hl=ja
# 必要な対策
Gson や OkHttp など、minifyの影響を受けるライブラリを使用している場合、R8 対応の proguard-rules.pro の記述内容が公開されているので、基本的にそれらを更新すれ
Android 初心者が Room を使おうとしてハマったこと
※ この記事は 2023/08/14 時点の情報を元に作成しています。
Android アプリで DB 操作を行うために、Room というライブラリを利用しました。
以下の公式を参考に取り組んだのですが、一筋縄ではいかなかったので、遭遇したエラーと解消方法について本記事に記録しておきます。[Room を使用してローカル データベースにデータを保存する | セットアップ](https://developer.android.com/training/data-storage/room?hl=ja#kotlin)
## 環境
– Android Studio Flamingo | 2022.2.1 Patch 2
– macOS 13.4.1
– compileSdk = targetSdk = 34## 結論
`build.gradle (Project :…)`に追記する内容は、以下のとおりです。
“`gradle
plugins {
…
id ‘com.google.devtools.ksp’ version ‘1.9.0-1.0.13’
The project is using an incompatible version (AGP 8.0.0) of the Android Gradle plugin. Latest supported version is AGP 7.3.1 の解決法
# はじめに
ある日、Anroid Studioでプロジェクトを開くとビルドエラーが発生した。。。“`
The project is using an incompatible version (AGP 8.0.0) of the Android Gradle plugin. Latest supported version is AGP 7.3.1
“`https://developer.android.com/studio/releases?hl=ja#android_gradle_plugin_and_android_studio_compatibility
何やらバージョンの互換性に問題があるようだ。。
# 指定されたバージョンにしてみる
`File > Project Structure > Project`を開く
Android Gradle Pluginを**7.3.1**に変更したところ、無事ビルド成功しました!
![Screenshot 2023-08-23 at 22.37.45.png](https://qiita-image-store.s3.a
【Flutter】showDialogを使ってを全画面で表示させる方法
showDialogを使って全画面にDialogを表示させたい。
そもそも、showDialog自体、私たWidgetをダイアログとして表示してくれちゃうので、
ContainerのheightとwidthにMediaQueryを渡せばできると思い、やってみました。“`dart
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(‘画像表示’),
backgroundColor: Colors.red,
),
body: Center(
child: ElevatedButton(
child: const Text(‘モーダル表示’),
onPressed: () {
showDialog(
context: context,
androidのテストコードでassetsにアクセスする
# この記事の内容
AndroidTestとUniteTestの両方で、assetsにあるファイルにアクセスする方法です。
AndroidTestは、androidx.testを、UnitTestは、Robolectricをそれぞれ使用します。androidx.testのセットアップに関しては公式をご覧ください。
https://developer.android.com/training/testing/instrumented-tests/androidx-test-libraries/test-setup
## dependencies
テストの依存関係は以下の通りです。
“`gradle:app/build.gradle
dependencies {
// For test
testImplementation(“junit:junit:4.13.2”)
testImplementation(“org.robolectric:robolectric:4.9”)// For android test
androidTestIm
value class をデフォルト引数にするとNullPointerExceptionが投げられる場合がある
## 概要と結論
Jetpack Composeでvalue classをデフォルト引数ありで引数にした場合、引数指定なし(デフォルト引数を利用)で呼び出すと`NullPointerException`が投げられます。
### 解決法
`value class` でないようにすればよいです。(当たり前といえば当たり前)
* typealiasを利用する。
* data classにする。
* 等々## 詳しく
### 経緯
[DroidKaigi2023](https://2023.droidkaigi.jp/)が今年も行われます。
contribute大歓迎ということで、私も何かしてみようと思い、挙がっていたissueを解決するPull Requestを作りました。https://github.com/DroidKaigi/conference-app-2023/pull/756/
その際に拡張関数を用意したかったのでvalue classを使いました。
さくっと作って、PullRequestを送ったところPullRequestのUnitTestで失敗していることがわかった
FlutterでAndroid端末のmulti-windowモードを検知したい
暫くQiitaを書いてませんでした。
最近のあるFlutterアプリ開発案件ですが、Androidがマルチスクリーンモードを入ると、画面の部品が崩れる事象が発生してました。
一応、Flutter側はマルチスクリーンを検知できることはない感じ…
ぐぐって見たが、
一応、Android端末のマルチスクリーンを検知できることは可能であるようですが、詳しい説明がなくてこちらで、詳細な解決案と、実装を紹介したいと思います。Qiitaには、昔以下のような紹介がありました。
https://qiita.com/Shiozawa/items/24755e0a0eab9756a79f
但し、記事の作成時間が古くて、あんまりの助けにならない感じ???
以下のAndrodi開発者公式サイトでは、詳しく説明したようが、実装例がないぽい
https://developer.android.com/guide/topics/ui/multi-window?hl=ja一応、実機環境では
minSDKVersion 21
targetSDKVersion 33
ではサポートされなかったので
hostsを使用したローカルサーバにiPhone,Androidからアクセスする
# はじめに
この記事はMacでhostsを使用しドメインからアクセスできるようにしているローカルサーバにiPhone,Androidからアクセスする方法を記事にしています。# 今回使用したもの
Mac OS Ventura 13.3.1
squid 5.9
iPhone,Androidなどアクセスする端末# やりかた
方法としては、`squid`でMac上にプロキシサーバを構築し、それを経由してローカルサーバにアクセスする。## IPの固定
各端末からアクセスできるようにMacのIPアドレスは固定にしておく。## hostsの設定
hostsに固定したIPアドレスとドメインを追加する。
hostsは`/private/etc/hosts`にある。
“`
192.168.x.x hogehoge.com
“`## squidのインストール
“`
$brew install squid
“`## squidの設定
squidの設定の設定を行う。`/opt/homebrew/etc/squid.conf`を編集する。
(`/usr/local
【Flutter】ContainerにImageを載せた時にRadiusが効かず闘った話
Flutterの書き方をだいぶ覚えてきた頃のことです。
画像にRadiusをつけた状態で表示したかったため、BorderRadiusをつけたContaierに画像を載せました。
その時に実装したコードはこちらです。“`dart
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(‘画像表示’),
),
body: Center(
child: Container(
height: 300,
width: 180,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
),
child: Image.asset(
‘assets/im
【Flutter】Dartの非同期処理(Future・then)
## はじめに
Flutterでアプリ開発を行うには、Dart言語の使い方を理解しておく必要があります。今回は、Dart言語の非同期処理について説明します。非同期処理は、WebAPIを叩いたり、DBやファイルの読み書き等、時間のかかる処理を行う際に使用します。
## 動作環境
Flutterで新規プロジェクトを作成し、以下の`ここに処理を書いていく`と書かれた2箇所に追加でコードを記述して動作確認していきます。画面にボタンを表示する単純なプログラムです。
“`diff
import ‘dart:io’;import ‘package:flutter/material.dart’;
void main() {
runApp(const MyApp());
}class MyApp extends StatefulWidget {
const MyApp({super.key});@override
StatecreateState() => _MyAppState();
}class _MyAppState extends S
【Android】文字入力時のキーボード操作のメモ【Kotlin】
# はじめに
Editテキスト入力時のキーボードの操作でエンターキーやバックキーなどのアクションキーが押された時の処理を完全に覚えきれず、何度も調べながら実装するのが面倒になったので 特に使いそうなものを自分の記事に残しておこうと思いました。
# 実装
自分用なのでかなり簡単にではありますが、以下が実装内容です。editText.setOnKeyListener(View.OnKeyListener { _, action, event ->
if (event.action == KeyEvent.ACTION_DOWN) {
if (action == EditorInfo.IME_ACTION_DONE) {
// Enterが押された
}if (action == KeyEvent.KEYCODE_DEL) {
// バックスペースが押された
Android Kotlin Timberを別モジュールに導入してみた
# 初めに
Timberとはなんやら、みたいな話は既に様々な方が書いてくれてます。
そのため、割愛します。# きっかけ
元々、僕が作っている個人アプリは、appモジュールのみで構成されてました。
ただ、今後Jetpack Composeを導入した際のプレビュー表示までの時間やビルド時間、今後仕事でマルチモジュール化の知見が求められるのでは?と考えて、マルチモジュールの学習を始めました。とりあえず、お試しでログ機能を別モジュールに分けることにしたんですね。
# モジュール構成
とりあえず、いろんなサイト見て考えたモジュール構成。(これが良いのかよくわかってない)
水色の部分は全てサブモジュールになってて、狙いとしてはビルド時間を早めたい!ということくらい。![名称未設定ファイル.drawio(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/c8cfc845-3176-e06b-0da9-d73037547024.png)
# 手順1. 別モジュールを用意する
1.
ネイティブエンジニアがFlutterでアプリをリリースした時の流れ(公開まで14日間)について
## はじめに
iOS/Androidともに個人アプリを10本程度作成してリリースした経験(androidはリリースしたアプリは全部Googleにアップデートしていないので削除された。。)があります。
しかしFlutterは3年ほど前から知見はありましたがリリースは初めてしたのでその時の流れを備忘録含め残しておきます。業務でもネイティブ開発経験が長いです。クロスプラットフォームは昔にXamarinを少し触りましたが、いまいち良さを感じずに深く手を出しませんでした。
すでに5万とあるQRコードアプリはFlutterの練習兼ねて簡単なアプリなので作成をしました。QRコード読み込みはもはやネイティブの標準カメラでもできますが、読み込みのみで、他の同類アプリは広告が多くて邪魔なイメージがあったので作ってみました。
iPhoneデフォでQRのカメラ読み込みだと履歴残らないのと、アプリだと広告邪魔なので、練習でアプリ作ろうかな。QRだと差別化要素ないよなー
— y-matsumoto(Flutter開発推し) (@mycb750) August 2, 2023
仕事でFlutterを教えているため、リリースの一連フローは経験しないとよろしくないという理由もありました
https://twitter.com/my
Android java GoogleMAP API を使用した、アプリ制作(ゴミ処理業者 検索アプリ)
### ■ UI
・郵便番号を入力
・入力された郵便番号の【5km】圏内で、CSVファイルで取得した業者の経度・緯度を計算して表示する。
・入力された郵便番号の【10km】圏内で、CSVファイルで取得した業者の経度・緯度を計算して表示する。
CameraXでAndroidのカメラを起動してみる備忘録として、cameraXを用いてandroid端末のカメラを起動してみる。
最終的に画像認識エンジンを走らせてみたい!
以下を参考にしてみる。
[cameraXスタートガイド](https://developer.android.com/codelabs/camerax-getting-started?hl=ja#0 “cameraXスタートガイド”)詰まった箇所
**「CameraXApp.app モジュールの build.gradle ファイルを開き、CameraX の依存関係を追加します。 」**
以下のコードをbundle.gradle.ktsに追加するのだが、エラーが出る。
“`
dependencies {
def camerax_version = “1.1.0-beta01”
implementation “androidx.camera:camera-core:${camerax_version}”
implementation “androidx.camera:camera-camera2:${camerax_version}”
ComposeのNavigationを使ってShareTargetアプリ(他アプリから共有情報を受信するアプリ)にする
# この記事の内容
他のアプリ(Chromeとかマップとか)で共有を選んだときに、自分のアプリでその情報を受信するアプリを作ります。
Compose, Navigationを使っていきます。## 前提
NavigationとComposeの依存関係を抜粋しました。
“`gradle:app/build.gradle
// compose
val composeVersion = “1.4.3”
implementation(“androidx.activity:activity-compose:1.7.2”)
implementation(“androidx.compose.ui:ui:$composeVersion”)
implementation(“androidx.compose.ui:ui-graphics:$composeVersion”)
implementation(“androidx.compose.ui:ui-tooling-preview:$composeVersion”)
implementation(
階層型アーキテクチャ – ドメインレイヤについて
# はじめに
Googleが推奨する階層型アーキテクチャの中にはドメインレイヤというものがあるので調べてみた。
# 階層型アーキテクチャ
ドメインレイヤを除いたアーキテクチャは
View (Fragment, Activity) → ViewModel → Data Layer
の構造になっている場合が多い。
![arch.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914937/84573431-57a9-0dae-7403-77d3dd1dc7b6.png)ドメインレイヤを入れる場合はRepositoryとViewModelの間に挟まってくる。
![arch.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914937/84573431-57a9-0dae-7403-77d3dd1dc7b6.png)# ドメインレイヤ
命名規則は ○○UseCase
ドメインレイヤは基本的にViewModelのビ
Karteでのカスタムイベント送信方法
# はじめに
今回はイベント収集サービスであるKarteでのカスタムイベント送信方法を紹介していきます
### 本文
`eventType`には送信したいイベントの種別を、`key`にはパラメータ名を渡します
“`kotlin
fun sendKarteCustomEvent(
eventType: String,
params: Map? = null,
) {
Tracker.track(eventType, params?.mapKeys { it.key })
}
“`
### 最後に
最近Karteを使い始めたので備忘録用に記事にしました
どなたかのお役に立てれば幸いです
【Flutter】1年間頼ってきたサイト3選
Flutterを学び始めたエンジニアにとって、1番ネックなのが参考サイトが少ないことですよね。。。
かといって、公式を見ても解決できないし。
そこで、自分がFlutterを学び始めてから1年間の中で、めちゃくちゃお世話になったサイトを3つご紹介します。# 1\. ちょげぶろぐ
Flutter初心者は絶対に見るべきサイトだと思います。https://www.choge-blog.com/
【対象目安】
初心者・中級者【概要】
Widgetの基本的な使い方だったり、汎用性の高いUIの実装方法をこれでもかというくらいわかりやすく教えてくれます。
あまり多くのWidgetを触ったことがない初心者の方が取説として使うもよし、中級者の方が簡単なWidgetを組み合わせて作るUIの参考にしてもよし。
1年経った今でも、あまり触れることのないWidgetの用途を知りたいときや、このWidgetでこんなことできないかな??と思いついた時などにお世話になっています。# 2\. stack overflow
知識豊富なエンジニアたちのナレッジ交換を覗き見してきました。
https://
【Flutter】Listを操るメソッド3選
未経験にとって、List自体は理解していても、そのListを表示させるために操ろうとすると結構詰まりません??
そこで、1年間Flutterの開発をしてきて、「このメソッド知ってたらなんとなく行けるだろ」ってメソッドを3つ紹介します!# 1\.`map`
Iterableを返却してくれます。 ← Iterableってなんやねん。ってなりますよね最初は。簡単にいうと、forEach文と同じ動きをしてくれていると思ってください。
mapの処理を通ることで、Listのひとつ分の要素を返却する処理を繰り返してくれます。`list.map((e) => e)`にあたるところで、listひとつ分の要素が「e」に入り、
それをTextWidgetで利用することで表示しています。“`dart
Widget build(BuildContext context) {
final Listlist = [‘apple’, ‘orange’, ‘greape’]; return Scaffold(
appBar: AppBar(