- 1. setContentViewのエラー
- 1.0.1. [Android]脳死で使っていたcontextを少し掘り下げる
- 1.0.2. androidでapkファイルをインストールできない
- 1.0.3. AlertDialogのmessageのViewを取得したい
- 1.0.4. 【Kotlin】Firestoreで複数のタスクが成功したときにリスナーを呼ぶ
- 1.0.5. 【Android】ViewModel内でUiModelを使おう(その2)[UiModel編]
- 1.0.6. 【Android】SDKバージョンごとのUNITテストを書く
- 1.0.7. Androidでtcpdumpを取得する
- 1.0.8. React NativeでNavigationを使っていい感じに画面遷移する
- 1.0.9. android:id以外に@+idが使われている問題を正規表現で解決する
- 1.0.10. Flutterを知らない人がFlutterでアプリを公開するまでにどのような情報が必要でどのようなエラーを解消したか
- 1.0.11. KMMに対応したRealmを使ってみた!
- 1.0.12. いつもぶつかって何となく調べて解決してきたAndroid周りの対応
- 1.0.13. 【Kotlin 初学者】setの使い方
- 1.0.14. 【Android】Android Sleep APIことはじめ
Android アプリが否承認されたときにやったことメモ
# 0. 概要
Android アプリの審査で「否承認」にされたときにやったことをメモとして残しておきます。
# 1. 審査提出したら否承認のメールがきた
既にストアに公開している Android アプリを更新しようと思い、いつもどおり aab ファイルを作り
Google Play Console からポチポチと審査提出したところ、`ご対応のお願い: Google Play のポリシーをアプリが遵守していません`
こんな件名のメールがきました。
以下はメールのスクリーンショットです。
画面のサイズを取得するために以下の実装をしていたのですが、Android 6.0(Marshmallow)でクラッシュしていました。(Android 7.0ではクラッシュしなかった)
“`kotlin
val displayMetrics = DisplayMetrics().apply {
// ここでクラッシュ
context.display?.getRealMetrics(this)
}
“`[developers](https://developer.android.com/reference/android/view/WindowManager?authuser=1#getDefaultDisplay()) によると、API Level 30(Android10)から`Context#getDisplay`を使って下さいとのことだったので、API Level 30未満の処理を追加しました。
“`kotlin
// API Level 30未満の処理
val windowManager = context.getSystemService(Cont
Kotlin, LiveData, coroutine なんかを使って初めてのAndroidアプリを作る(15)ライブラリバージョンアップ2021春(1)
# 概要
[前回](https://qiita.com/kasa_le/items/404085e5a15c1c2c4467)のつづきです。前回はtargetSDKのみあげて、他のライブラリのバージョンを上げなかったので、上げてみようと思います。
今回は以下を対象にします。– Crashlytics
– Kotlin
– Room
– KoinCrashlyticsは去年からずっと「更新せよ」とFirebaseから通知メールが来ていましてね。リリースしていないアプリだからと無視していましたが、前回の記事でプログラム動作中にクラッシュし続けていたのでようやく対応します(汗)
また、前回Android Gradle Pluginのバージョンも上げましたが、それで出るようになった警告などにも未対応なので、一緒にやっていきます。
なお、AndroidX(Jetpack)のアップデートは、やっていたら記事が長くなったので次回に分けます。
ということで、今回はライブラリバージョンアップ2021春(1)となっています。# 環境
|ツールなど|バージョンなど|
|:–|:–|
やってみようZoomSDKチュートリアル(Android)
ZoomのSDKを使うことで日々のテレビ会議に何かしらの付加価値を見出せるか検証すべく、初めの一歩としてZoomSDKのチュートリアルをやってみました。
## SDKアプリを作成する
以下のURLからマーケットプレイスにアクセスし、ログインします。
アカウントが必要となりますので、未作成の方はサインアップを実施する必要があります。
https://marketplace.zoom.us/ログインすると画面右上の「発展させる」を選択し、「アプリをビルドする」をクリック。
![スクリーンショット 2021-03-23 21.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1153679/766b48a0-6f61-9c88-1749-1aab5a1697a9.png)アプリの種類一覧から「SDK」を選択。
![スクリーンショット 2021-03-24 13.04.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c
WindowManagerで追加したviewをアニメーションで移動させる。
オーバーレイアプリで詰まったのでメモ
全画面にViewを配置してその上で動かすとイベントが取られて操作ができなくなる。
しかし、今度は動かしたいViewを配置すると、アニメーションで範囲外に出ると表示できなくなる状態だった。
なので、windowManagerへ追加したView自体を移動させたかった“`Kotlin
// windowManager でViewを追加
val params = WindowManager.LayoutParams(
100, 100,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT)view = inflater.inflate(
[Android]setContentViewのエラー
setContentViewのエラー
何かの弾みで出てきたsetContentViewのエラー
![1FA7A903-A340-4B06-A118-3C263638BAF2_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663065/c53c34c3-65dd-b3f0-bfbd-2bfb708cdc45.jpeg)
いつからエラーなっていた
どうやって直したか
![C511D71C-F03C-44DC-95FC-BBD2127E4F99_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663065/cea8f185-10a9-6d0c-a990-3c006b0292bd.jpeg)
ここの import android.R を消したら治りました
自分の場合だったらjavaの記事をコピペし、
[Android]脳死で使っていたcontextを少し掘り下げる
# Contextってよく使うけども…
今まで、ダイアログ等の引数にcontextを要求されると、条件反射でcontextを打ち込んでいましたが、少しだけ掘り下げてみようかなと思います。前提としてcontextは、奥が深いみたいなので完全な理解は難しそうなので、ここでは、Activityで用いるContextとApplicationContextの違いについて触れてみたいと思います。
# ApplicationContextとActivityContextの違い
ApplicationContextは、文字通りでアプリ間のライフサイクルと関係していてアプリを起動してから、ずっと生き残って欲しいときに使います。
その為、アプリ間で共有されるローカルデータベースのアクセス等で使われますね。そして、ActivityContextは流れで分かるかもしれませんが、Activityのライフサイクルと関係しています。その為、ActivityがonDestroy()されると、死にます。
Intentの時に使いますね。ちなみに、thisもよく使われますが、thisはクラス自体を指します。
androidでapkファイルをインストールできない
androidでアプリをアンインストールし、そのアプリのapkファイルをダウンロードしてインストールすると、「アプリはインストールされていません」エラーが出てインストールできませんでした。なお、アプリはplayストアにないものです。
* 機種:huawei nova lite
* Androidバージョン:8.0.0ネットで調べると、次のような方法が出ましたが、どれを試してもダメ。
* 「不明なアプリをインストールする」設定をONにする
* PlayストアでPlayプロテクトをoffにする
* [設定]→[アプリ]で、アンインストールしたアプリが残っていないか?残っていたら消す「端末管理」でクリーンアップを行い、更に同画面にある「ディープクリーンアップ」で「インストールパッケージのクリーンアップ」をした後apkをインストールすると正常に行えました。
AlertDialogのmessageのViewを取得したい
## はじめに
AndroidのAlertDialogを使っていると、messageのViewを取得したいことがあります。
検索すると、AlertDialogをそのまま使っているパターンで、messageのTextViewを取得する方法が出てきます。
こんな感じで↓“`kotlin:
val builder = AlertDialog.Builder(context).apply {
setMessage(message)
}
val dialog = builder.show()
val messageView = dialog.findViewById(android.R.id.message)
“`しかし、[ダイアログ](https://developer.android.com/guide/topics/ui/dialogs?hl=ja)によるとAlertDialogはDialogFragmentで包んであげることが推奨されており、AlertDialogをそのままshow()する場面はあまり多くないと思います(少なくとも私の所属するプロ
【Kotlin】Firestoreで複数のタスクが成功したときにリスナーを呼ぶ
#FirestoreやFirestrageで同時に複数の処理を行う
【taskA】 FirestoreからドキュメントAを取得する
【taskB】 FirestoreからドキュメントBを取得する
といった2つのタスクを同時に行うとします。
このタスクAとBの両方が成功したときに、printlnします。##タスクの取得
データを取得するときにタスクが返されます。“`Kotlin
val taskA = db.collection(“user”).document(“A”).get()
val taskB = db.collection(“user”).document(“B”).get()
“`##両方のタスクが成功した時に呼ばれるリスナー
“`Kotlin
Tasks.whenAllSuccess(taskA, taskB)
.addOnSuccessListener{
println(“両方のタスクが成功しました”)
}
“`これで両方のタスクが成功するとプリントされます。
.addOnFailureListene
【Android】ViewModel内でUiModelを使おう(その2)[UiModel編]
# はじめに
[前回](https://qiita.com/saitoyusuke/items/baef4f93f4a052b9639b)でsealed classを使ってViewModelをすっきり書けるようになりました。今回はさらにすっきり書けるようにUiModelについて説明します。# 対象
– [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja)を利用している方
– MediatorLiveDataを利用している方
– kotlinが読める方ViewModel、MediatorLiveDataについてはドキュメントがネット上に多くありますので、ここでは説明しません。
# LiveDataが複数必要になった
[前回](https://qiita.com/saitoyusuke/items/baef4f93f4a052b9639b)はうまくsealed classを使って1つのLiveDataに複数の意味を持たせて、まとめることができました。しかしこれ
【Android】SDKバージョンごとのUNITテストを書く
#はじめに
Androidを開発しているとSDKバージョン(OSバージョン)によって処理を分岐させる必要が出てきます。
そういった処理はネット上に多く見つけることができます。
その場合のテストもしっかり考えるべきと思います。
今回はSDKバージョン別のUNITテストを紹介していきます。
#OSごとに分岐が必要な処理例
早速、SDKバージョンごとに分岐させるような実装を考えてみます。
テストを書くことが目的なので、インスタンス化するパターンと静的(companionObject、static)なパターン2つを用意します(処理は同じにします)
今回は実際に判定が処理の例としてネットワーク判定処理を実装します。trueでWIFI
に接続されている判定になる処理です。
判定を返す処理をしますが、その際、AndroidM(SDKバージョン23以上)と未満で使用するAPIを変えます。詳しくは公式サイトを見てください。
https://developer.android.com/reference/android/net/ConnectivityManager
“`kotlin:Conne
Androidでtcpdumpを取得する
パケットログを取得する必要があったので、パケットログを取得するためのメモ。
パケットログを取得させるには、emulatorでtcpdumpすると取得することができます。“`bash
$ emulator -tcpdump <出力先ファイルパス> -avd
“`emulator名は下記のコマンドで確認することができます。
“`bash
$ emulator -list-avds
“`
React NativeでNavigationを使っていい感じに画面遷移する
## やりたいこと
– React NativeでReact Navigationというライブラリを使って画面遷移をしたい
– 画面が多くなっても管理しやすい形でまとめたい## 前提条件
– React Nativeの環境構築が終わっている
– 何かしらプロジェクトが作成されている(initされていればOK)## ライブラリのインストール
[公式ドキュメント](https://reactnavigation.org/docs/getting-started)にしたがって必要なライブラリをインストールします“`
yarn add @react-navigation/native
yarn add @react-navigation/stack
“`
@react-navigation/stackと依存関係にあるライブラリもインストールします。“`
yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-cont
android:id以外に@+idが使われている問題を正規表現で解決する
# 内容
Androidでidを定義する場所ではないのに@+idを用いている場所を正規表現でぱっと置換えちゃおうって内容です。# 使う場面
Androidでxmlを用いてレイアウトを作成している時、idを定義したい場所以外でidを使う場面がよくあると思います(ConstraintLayoutで位置を指定したい時など)。
そこで@+idを指定してしまうと思わぬエラーに遭遇する可能性がある [詳しくはこちらを参照](https://qiita.com/kamedon39/items/71986649f1a884e912cb)一度書いてしまったコードを手作業で直すのはめんどくさいので正規表現で直しましょう。
# 使う正規表現
“`
^(?=(.*)@\+id(.*))(?!.*android:id).*$
“`
これで@+idを含む かつ android:idではないものを抜き出せます。
そして、“`
$1@id$2
“`
で置換を行えば目的が達成できます!# 例
たとえばこんな感じです。
![スクリーンショット 2021-03-30 12.27.15.png](h
Flutterを知らない人がFlutterでアプリを公開するまでにどのような情報が必要でどのようなエラーを解消したか
## 記事の趣旨
普段iOSで開発をしておりAndroidはほぼ経験がない者が、Flutterでアプリを作り公開するまで、どのようなことを調べなければいけなかったかを記載します。
## アプリ
うつとか診断
iOS https://apps.apple.com/jp/app/うつとか診断/id1559362485
Android (2021/3/30現在 審査待ち 審査に提出したのは24日)リポジトリ GitHub https://github.com/Satoru-PriChan/Depression_Diagnosis
CI/CD CodeMagic https://blog.codemagic.io/getting-started-japanese/必要時間 測ってませんが50~150時間の間?(1日平均30分~1時間半ほど作業して3ヶ月強かかったため)
全体的な参考 [flutter create してから5日で iPhone / Androidアプリを公開した話](https://qiita.com/chooyan_eng/items/4ab2af269e1
KMMに対応したRealmを使ってみた!
# はじめに
主は今回Kotlin, SwiftUIを初めて触ったので間違ってたら申し訳ないです。現時点では動くのでヨシッ!
あと今はまだx86_64アーティファクトのみの対応なので、エミュで試す場合は注意←ハマった。
AndroidStudioにKMMのプラグインとかもろもろ入ってる前提で話します。
Githubに上げてるのでよかったらどうぞ!
https://github.com/hirossan4049/KMMRealmSample# #1 NewProject
![](https://i.imgur.com/6XweeNS.png)
KMM Applicationを選ぶ
![](https://i.imgur.com/hoR8SKe.png)
Android Application NameとiOS Application Nameは好きな名前でも大丈夫ですが、この記事は`androidApp` `iosApp` として進めます。
# #2 Gradleの設定
“`kotlin:/build.gradle.kts
buildscript {
いつもぶつかって何となく調べて解決してきたAndroid周りの対応
# 前置き
– いつも同じようなエラーが発生する……
– 多分Unityのversion upしたタイミングな気がしている……
– でもその度調べて解決してるが、結局いつも原因忘れてしまっている……# 環境
– Unity2019.4.18f1
– GoogleMobileAds-v5.4.0
– Android Studio 4.1.3# 結論
– JDKのバージョンをテキトーなやつ指定してるとUnityでエラーになる場合がある# 事象
– GoogleMobileAdsを更新したので、Android Force Resolveを再度実施しようとした
– そうしたら以下のようにエラーが発生……“`sh
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
at org.codehaus.groovy.vmplugin.VMPluginFactory.(VMPluginFactory.java:43)
at
【Kotlin 初学者】setの使い方
# setについて
KotlinではSetter,Getterを省略してくれますすが、今回はカスタムして書いてみます。“`
var text: String = “”
set(value) {
field = value
if(field == “name”){
binding.text = “”
} else {
“”
}
}fun test(){
type = “name”
// typeの中に文字列が入ってるのでsetが実行される
}
“`
【Android】Android Sleep APIことはじめ
# Sleep API
以下抄訳↓– Sleep APIを活用すると、アプリでユーザーがいつ寝て、いつ起きているかを判断することができます。
– 周囲の明るさ、デバイスの動きなどに関連する情報を収集して、ユーザーが眠りに落ちて目を覚ます時間を推測します。
– 情報の更新を購読することができます。https://developers.google.com/location-context/sleep
様々な機能に組み合わせることで効力を発揮しそうなAPIですね。
# 実際に試してみる
## 下準備
#### 1. target sdkを29以上に設定する
※29以下だと取得ができないので、minsSDKは29に設定してます
“`gradle:build.gradle
android {
compileSdkVersion 30
buildToolsVersion “30.0.3”defaultConfig {
applicationId “xxx”
minSdkVersion 29
targ