- 1. 【個人開発】Android アプリ開発初心者が Google Play に 14 回リジェクトされた話
- 2. 暗号化SharedPrefarenceの書き方
- 3. Flutter で Android と iOS のスワイプして戻る画面遷移機能を無効化する
- 4. JetpackComposeでアニメーションを使った表示・非表示の切り替え
- 5. JetpackCompose の OutlinedTextFieldの色を調整したいとき備忘録
- 6. Flutter の BottomNavigationBar で4つのアイテムを設定するとテキストが表示されない問題の解決方法
- 7. Kotlin 2.0.0でKMPのSwiftPM export機能が入る(のかもしれない)
- 8. Source of truthを確保するためにRoom databaseを使うメモ(いいね問題)
- 9. AndroidStudioのエミュレータの画面サイズを確認する方法
- 10. Androidスマートフォンを工場出荷時に初期化。しかし、思わぬ落とし穴が。。。
- 11. [Android] ViewModelインスタンスの共有と管理
- 12. Settingsに定義されているActionで呼び出せるシステム設定画面一覧
- 13. Androidで円形のリアルタイムBlur効果を付ける(RealtimeBlurView)
- 14. osmdroid(OpenStreetMapのAndroid向けライブラリ)のMapViewを鳥瞰図に対応させる
- 15. Google Pixel シリーズの SoC と GPU のメモ
- 16. androidでYOLOv8物体検出モデルを使う
- 17. AndroidアプリでGoogle Mapの使えそうな処理
- 18. Roborazziで最初にスクリーンショットを撮る時、詰まったポイント
- 19. 1つのRetrofitでGsonとKotlinSerializationのレスポンスモデルを共存させる
- 20. Jetpack ComposeでenableEdgeToEdgeが効かないですよ
【個人開発】Android アプリ開発初心者が Google Play に 14 回リジェクトされた話
# はじめに
初めまして、まみめです。
私は 2023 年の 9 月に Android アプリ開発を始めて今日まで 3 回リリースを行ってきました。
初めてのアプリ開発は大変難しく試行錯誤しながらなんとかリリースを行ってきました。
しかし、3 個目のアプリのリリースでなんと Google Play に 10 回以上のリジェクトを受けてしまい、かなり解決に苦しみました。
多くは私の知識・技術・注意力の不足によるものです。Android アプリ開発に慣れている人であれば当たり前の内容ですが、始めたばかりの人にとって少しでも助けになればと思い、この記事を書きました。皆様の助けになれば幸いです。# リリースしたアプリの概要
### リリースしたアプリ
『カラオケ楽曲ガチャ』https://play.google.com/store/apps/details?id=com.karaoke19.karaokegacha&hl=ja&gl=US
![スクリーンショット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.
暗号化SharedPrefarenceの書き方
# はじめに
今回はローカルでデータを持っておく時に使うSharedPrefarenceの暗号化バージョンの書き方を紹介していきます
### 本文
早速コードですが下記になります。
実際に保存するときは`sharedPreferences.edit().putString()`で保存することができ、読み込むときは`sharedPreferences.getString()`でアクセスすることができます
“`kotlin
private val sharedPreferences: SharedPreferencesinit {
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
sharedPreferences = EncryptedSharedPreferences.create(
context,
Flutter で Android と iOS のスワイプして戻る画面遷移機能を無効化する
# なにこれ
この戻る機能を無くしたいので、それを実装した時のメモを書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/82a1a37c-2c3f-7b0d-1883-297374b3cf65.png)# 解決方法
`PopScope` を利用して `canPop: false` を実装するだけで大丈夫でした。### Before
“`dart
class _HomeViewState extends State{
int selectedIndex;_HomeViewState({Key? key, required this.selectedIndex});
@override
Widget build(BuildContext context) {
return Scaffold(
// コードが続く
“`### After
“`dart
class _HomeViewState ex
JetpackComposeでアニメーションを使った表示・非表示の切り替え
# 実践
“`
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White)
.padding(40.dp)
) {var isVisible by remember {
mutableStateOf(true)
}
val animation by animateFloatAsState(
targetValue = if (isVisible) 1.0f else 0f,
)
Box(
modifier = Modifier
.size(200.dp)
.graphicsLayer {
alpha = animation
JetpackCompose の OutlinedTextFieldの色を調整したいとき備忘録
JetpackComposeの`TextField`や`OutlinedTextField`を使用している時に、各場所の色をデフォルトから変更したいことがあると思います。
そういう場合に、` OutlinedTextFieldDefaults.colors`のどこを変更したらどの色が変わるのかというのを記録したメモです。# 環境
`androidx.compose.material3:material3:1.2.1″`
です。# デフォルト(何も調整しない時)
– コード
“`kotlin
@Composable
fun SampleScreen() {
val str = remember {
mutableStateOf(“”)
}Box(modifier = Modifier.padding(16.dp)) {
OutlinedTextField(
value = str.value,
onValueChange = {
st
Flutter の BottomNavigationBar で4つのアイテムを設定するとテキストが表示されない問題の解決方法
# なにこれ
Flutter で BottomNavigationBar を使ってメニューを作成しようと思ったらテキストが表示されなくて困ったので、その時の解消方法をメモ# 事象
3つまでだとこのように良い感じに表示されるが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/6a92eb77-dde2-29ad-04f8-fae74b6e81b6.png)4つ以上になるとテキストが見えなくなった!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/4d66dc22-557e-87a3-bbd9-922a527f0d45.png)# 解決方法
`type: BottomNavigationBarType.fixed` で固定にしないといけないらしい。
“`
bottomNavigationBar: BottomNavigationBar(
typ
Kotlin 2.0.0でKMPのSwiftPM export機能が入る(のかもしれない)
# Kotlin Multiplatform Gradle Plugin supports SwiftPM Export
– 今までFramework or XCFrameworkのDilectLink, CocoaPodsしかサポートされていなかったがSwiftPMのexportも公式にサポートされることになった
– 2.0.0-Beta5で彗星の如く機能が追加されてRC-1にも入っている
– RC-1で確認したhttps://github.com/JetBrains/kotlin/commit/d76a6d6a9c0dce00b00cf69b26de921884b2b189
https://youtrack.jetbrains.com/issue/KT-65741
– YouTrackもinternalなものなようで記事執筆時点ではみれない
– まだ2.0.0時点でもExperimentalな機能なのでgradle.propertiesでフラグを有効にしないと使えない
“`properties
kotlin.swift-export.enabled=true
“`
Source of truthを確保するためにRoom databaseを使うメモ(いいね問題)
Androidアプリを開発するにあたって「いいね問題」は課題としてよくあがります。例えば記事を表示するアプリで、記事一覧と記事詳細画面があるとします。記事詳細でいいねを押したあと、記事一覧に戻ったときにいいねをどう反映させるか、という問題です。
良いね問題への対処としては[flowのようなイベントを一覧画面でもサブスクライブしてイベントを受け取れるようにするという方法](https://at-sushi.work/blog/7/)もあるようです。こちらは変更が少ないと機能すると思ます。しかし扱う変更が増えてくるとコードを追いかけるのも難しくなるでしょう。
一方Googleのアーキテキチャガイドやnow in androidのようなサンプルではroomのようなdatabaseを使う方法があります。droidkaigiの公式アプリでも使われていたらしく、この方法を使うことが推奨されます。
## Source of truth(信頼できる唯一の情報源)
[Google Developerのアーキテキチャガイド](https://developer.android.com/topic/a
AndroidStudioのエミュレータの画面サイズを確認する方法
Androidは画面サイズによってデザインが崩れてしまう事があると思います。
エミュレータの画面サイズを確認する方法です。
Device Managerを開き画像のようにViewDetailsをクリックします。
![スクリーンショット 2024-04-28 2.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/7f852382-5bb4-c59b-ac79-20c694eeac63.png)
このような表示が現れるので確認することが出来ます。
![スクリーンショット 2024-04-28 2.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/f2af109a-1c76-36fd-1107-51b3b5c986af.png)
Androidスマートフォンを工場出荷時に初期化。しかし、思わぬ落とし穴が。。。
# 事の起こり
3月と言えば新生活応援セールがあちこちで行われますが、Google StoreでもGoogle Pixelなどの製品を大幅値引きして販売するセールが行われました。筆者はPixel 7aを昨年の5月に購入したのですが、画面内指紋センサーの感度がいまいちで大変不満でした。ネットで検索してみても同様の不満の声が書き込まれているレビューを時々見掛けるので、筆者の端末だけが初期不良ということでもなさそうです。よって、このセールでPixel 8を狙うことにしました。セール値引きに加えてPixel 7aを購入した時に貰ったストアクレジットを加えて、更に旧端末を下取りに出せば更に大幅な値引きが期待出来ます。幸いPixel 7aの前に利用していたPixel 5(筆者にとっては初めてのPixel)も綺麗な状態で残っています。さあ下取りに出そうと勇んだのですが。。。危うく下取りが受けられないことになる所でした。。。:scream: :scream_cat: そんな思わぬ落とし穴を回避する方法を備忘録として残しておこうと思います。# 下取りの準備
Googleが公式に行っている下取りサービ
[Android] ViewModelインスタンスの共有と管理
![](https://velog.velcdn.com/images/rmsxo5678/post/ed46c62a-8daf-48e2-953c-c59547e7bf3b/image.jpg)
Androidアプリ開発において、複数のFragment間でViewModelを共有することは、一貫した状態管理とデータフローを維持するために非常に重要です。
このポストでは、ViewModelのインスタンスを管理し、データを共有する方法について記述しました。### ViewModelインスタンスの作成と共有
> **ViewModel**
> – ViewModelを使用してデータを管理する際、Fragmentが同じActivityに属していればViewModelインスタンスを共有することができます。
これにより、Fragment間でデータの同期と状態の共有が可能です。## 📌 ViewModelインスタンスの共有例
#### ViewModel
“`kotlin
class InViewModel : ViewModel() {
Settingsに定義されているActionで呼び出せるシステム設定画面一覧
Androidアプリからシステム設定画面を呼び出すにはSettingsに定義されているActionを使用します。
https://developer.android.com/reference/android/provider/Settings
以下のようにIntentにActionを設定するだけです。
そのままだと同一タスクになってしまうので、`Intent.FLAG_ACTIVITY_NEW_TASK`を追加する場合が多いかと思います。“`kotlin
startActivity(
Intent(Settings.ACTION_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
“`アプリの詳細設定など、システム全体では無く、特定のアプリの設定を開く場合、必ず、でないのがややこしいところですが、多くの場合、以下のように`package:`スキームでアプリのパッケージを指定します。
“`kotlin
startActivity(
Intent(Settings.ACTION_AP
Androidで円形のリアルタイムBlur効果を付ける(RealtimeBlurView)
# 概要
リアルタイムに円形のViewでBlur効果を実現したので、備忘録としてまとめておきます。# 完成イメージ
![Screenshot_20240427-181653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55941/3d57b68f-7e84-d2cb-032e-9e34ec5eb2b9.png)
速度・回転数メータの背景が、黒い円形でBlur効果が付いている事が分かります。# ベースとなるライブラリ
mmin18氏の「[RealtimeBlurView](https://github.com/mmin18/RealtimeBlurView)」を改造します。
※jcenterがEOLとなり、READMEの通りに導入しようとするとインポート出来ないので[jitpack](https://jitpack.io/#mmin18/RealtimeBlurView/master-SNAPSHOT)から取ります。
“`
dependencies {
impl
osmdroid(OpenStreetMapのAndroid向けライブラリ)のMapViewを鳥瞰図に対応させる
# 概要
osmdroidのMapViewでは真上からの表示にしか対応してません。
そこで、MapViewを改造して鳥瞰図表示に対応しました。(マリオカートのような疑似3Dです)
また地図の回転にも対応しています。
あくまで個人の備忘録としてまとめているので至らない点があったらすみません。# 注意
計算負荷や各種リソースなどは考慮してないのでそこは注意!# 完成イメージ
## 真上からの表示
![Screenshot_20240427-181419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55941/e77f5ac8-fb87-5205-420d-e787df5ca853.png)
## 鳥瞰図としての表示
![Screenshot_20240427-181425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55941/3f076437-8294-ccad-d297-2d14b0fe5ae5.png)
Google Pixel シリーズの SoC と GPU のメモ
ずっと Qualcomm 製の SoC と GPU だったが,
Pixel 6 からは Google 製の SoC (Google Tensor シリーズ) になり, GPU も Arm の Mali になっている.|発売日 |デバイス |SoC |プロセス|GPU |
|———-|————-|—————————————–|——-|———–|
|2016-10-20|Pixel |Snapdragon 821 (MSM8996 Pro) [^sdm_821] |14nm |Adreno 530 |
|2017-10-19|Pixel 2 |Snapdragon 835 (MSM8998) [^sdm_835] |10nm |Adreno 540 |
|2018-10-18|Pixel 3 |Snapdragon 845
androidでYOLOv8物体検出モデルを使う
# Androidで物体検出
**物体検出AIをandroidデバイスで動かせると、サーバー通信なしで便利な物体検出機能を世界中のユーザーに使ってもらえます。**Yolov8はポピュラーな物体検出AIです。
androidは世界一ユーザーの多いモバイルOSです。
本記事はandroidデバイス上でyolov8物体検出を行う方法です。以下のリポジトリのコードを参考にしています。
https://github.com/surendramaran/YOLOv8-TfLite-Object-Detector
↑ androidデバイスのカメラでリアルタイム検出を行うコードです。
僕もシンプルなサンプルを作りましたので、よかったら参照してください。
カメラ機能などを省いた検出部分のみのサンプルです。https://githu
AndroidアプリでGoogle Mapの使えそうな処理
前回の記事でGoogle Mapを表示するまでの手順を書いたので、今回はGoogle Mapで使えそうな処理について紹介します。
https://qiita.com/ssc-ksakamaki/items/7fe03fab5f7b74382753
## 目次
* [レイアウトファイルとマップの紐付け](#レイアウトファイルとマップの紐付け)
* [初期表示の中心地の設定](#初期表示の中心地の設定)
* [初期表示のマーカーの設置](#初期表示のマーカーの設置)
* [タップ時のマーカーの設置](#タップ時のマーカーの設置)
* [マーカーの吹き出しをタップした時の処理の設定](#マーカーの吹き出しをタップした時の処理の設定)
* [ポリラインの設定](#ポリラインの設定)
* [まとめ](#まとめ)## レイアウトファイルとマップの紐付け
マップを操作するためにレイアウトファイルのマップと紐付けます。“`MapsActivity.java
// 継承とインターフェースを変更
public class MapsActivity extends FragmentActiv
Roborazziで最初にスクリーンショットを撮る時、詰まったポイント
# Roborazziとは
スクリーンショットテストを行うライブラリです。Robolectricと互換性があり、画面変更差分の出力や、gif画像の生成なども行うことができます。
https://github.com/takahirom/roborazzi# 環境設定
この記事で扱う環境は以下の通りです:
– Android Studio: Android Studio Iguana 2023.2.1
– Android Gradle Plugin: 8.3.0
– Gradle: 8.4
– Robolectric: 4.11.1
– Roborazzi: 1.11.0
– Junit4: 1.6.6# 導入
モジュールのGradleにrobolectricとroborazziのimplementationを追加します// roboletric
testImplementation(libs.robolectric)// roborazzi
testImplementation(libs.roborazzi)
testImpl
1つのRetrofitでGsonとKotlinSerializationのレスポンスモデルを共存させる
## 前置き
Kotlin/JVMやAndroid界隈ではJsonパーサーとして古くは[Gson](https://github.com/google/gson)が主流でしたが、最近では[KotlinSerialization](https://github.com/Kotlin/kotlinx.serialization)が採用されることが多くなってきたと思います。
それ以外にも[Jackson](https://github.com/FasterXML/jackson)や[Moshi](https://github.com/square/moshi)など数多くのパーサーが存在します。そして最もJsonパーサーが活用される場面といったらAPIレスポンスのモデルマッピングではないでしょうか?
API通信用のクライアントライブラリでは今も昔も[Retrofit](https://github.com/square/retrofit)が採用されることが多いかと思います。
そこで今回はRetrofitを用いたJsonパーサーを少しずつ移行する方法を紹介します。## よくある話
よ
Jetpack ComposeでenableEdgeToEdgeが効かないですよ
# enableEdgeToEdgeが効かない
“`Kotlin
/**
* onCreate
* アクティビティの生成
* @param savedInstanceState Bundle?
*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge(statusBarStyle = SystemBarStyle.dark(
Color.Red.toArgb())
)setContent {
Link22Theme {
// A surface container using the ‘background’ color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
col