- 1. Androidアプリの審査に時間がかかるらしいが…@GooglePlayConsole
- 2. Navigation Componentの注意点
- 3. Flutter で外部ストレージにアクセスするアプリを作るときは Android バージョンを考慮して『ひと手間』いるから注意してくれよな!
- 4. Roomのリレーションで悩んでいたら、リレーション実現しなくても実装出来た
- 5. FlutterでWidgetの位置とサイズを取得する
- 6. 【Android】Android 11から始めるIME Transitions
- 7. FlutterでSplashスクリーンを設定する
- 8. 【初心者向け】スマホでPCの画面を見る方法【iPhone/Android】
- 9. 【Android】画面の表示サイズ(dpi)変更に耐えられるLayoutを定義する その2
- 10. Scratch filesで気軽にコードの実行結果を確認する
- 11. Retrofit2で共通処理を行う
- 12. AndroidのPR作成前のチェックリスト
- 13. Android9アプリ検証中に、プッシュ通知で何でポップアップされない?ってなったときに
- 14. 【Android】 Broadcast Recieverでintentを受け取る
- 15. どこでもAndroidのリソースファイルを参照する方法
- 16. Kotlinで他のところタップでキーボードを引っ込める
- 17. Flutter:タブの内容に合わせてAppBarを切り替える
- 18. 【エラー】D8: Program type already present: android.support.v4.os.ResultReceiverの解決方法
- 19. Flutter gallery_saver Androidのみ保存でエラーになる問題の解決
- 20. Kotlin Coroutine 入門2: 並列実行と Structured Concurrency と例外
Androidアプリの審査に時間がかかるらしいが…@GooglePlayConsole
現在、流行りのコロ助の影響で時間がかかるのだろうか。。
![GooglePlayConsole_longer_than_usual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152641/0de7a657-b3a3-3cf4-d4d8-29c96b39b2cb.png)7日以上って、、まあ仕方がないと思いつつリリースしてみると普段通りだった。
内部テストに一日前に上げてから製品版にプロモートする手順でいつも通りリリースしたが、プロモート後、20分ぐらいで公開されたみたい。Androidアプリってほんとうに審査しているんですかね。
Navigation Componentの注意点
Navigation Componentを使っていて嵌ったポイント
# ハマったこと
Navigation Componentを使って、ToolbarをActivityに持たせていたら、該当のViewを表示する時に“`
java.lang.IllegalStateException: Activity Caused by: java.lang.IllegalStateException: Activity {Activity} does not have a NavController set on {nav_host_fragmentのid}
“`が出た。
# 原因
FragmentContainerViewを使って、“`xml
Flutter で外部ストレージにアクセスするアプリを作るときは Android バージョンを考慮して『ひと手間』いるから注意してくれよな!
## TL;DR
`READ_EXTERNAL_STORAGE` パーミッションや `WRITE_EXTERNAL_STORAGE` パーミッションを必要としているアプリは、 `AndroidManifest.xml` に `android:requestLegacyExternalStorage=”true”` を設定すれば OK です。
“`xml:app/src/main/AndroidManifest.xml
“`## 事の発端
開発中のアプリで [image_picker](https://pub.dev/packages/image_picker) を使っていました。
エミュレーターでは問題
Roomのリレーションで悩んでいたら、リレーション実現しなくても実装出来た
## Roomで1対1対応のリレーションを実現したい
Roomを使ったアプリケーションで、別々のテーブルの情報が両方必要なので、昔Railsを触った自分としては、
「ついにAndroidのRoomでもリレーションを実現しなければならない時が来た」
と思いました。
そこでドキュメントなど、色々見ていたのですがRoomで1対1対応のリレーションは、ズバリこう実装すれば良いというのがイマイチ分からないでいました。
ActiveRecordでいうhas_oneのような物は無いのでしょうか。ところが「参照するだけなら、そもそもRoomでリレーション組まなくても実装できる」という話を聞いて、自分は最初よく理解出来ませんでした。
## DBでリレーション使わず、実現した方法
今回はサンプルとして、仮にゲームのQuestionテーブルとScoreテーブルとします。
“`
// データモデルQuestion
id: Int
level: Int
number: Int
question: String
created_at: String
“`“`
// データモデルScore
FlutterでWidgetの位置とサイズを取得する
#FlutterでWidgetの位置やサイズを取得したい
検索しても地図上の位置を取得するのばっかヒットしてつらい###GlobalKeyを使ってRenderBoxを取得する
[参考サイト:https://medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407](https://medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407)“`dart:TestState.dart
//class TestWidgetは省略GlobaleKey globaleKey = GlobalKey(); //←これが重要
class _TestState extends State
{
@override
Widget build(BuildContext context) {
return Column(
children:[
E
【Android】Android 11から始めるIME Transitions
## IME Transitionsとは
Android 11 DP2から追加されたWindowInsets APIの一つです。
https://android-developers.googleblog.com/2020/03/android-11-developer-preview-2.html### さっくり作ってみた
“`kotlin:MainActivity.kt
import android.graphics.Insets
import android.os.Bundle
import android.view.*
import androidx.appcompat.app.AppCompatActivity
import androidx.core
FlutterでSplashスクリーンを設定する
# SplashScreenとは?
アプリを起動させた時にアイコンが中央に表示される画面のことです。
これがあるだけで、大分アプリっぽくなりますよね?
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247084/fa4695d4-3440-e042-c182-d8f544b0da10.gif)
実装にはiOSとAndroidで異なる手順を踏まなくてはいけなくなるので、
それぞれについて説明していきます。# iOS
iOSは比較的簡単な手順で済みます。
1. project/ios/Runner/Assets.xcassets/LaunchImage.imageset/配下に画像を保存
2. project/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.jsonを編集
以上の2つのみです。
### 画像を保存
この時、画像は1x, 2x, 3xの3つの倍率を用意しなければいけません。
カスタムで4xの倍率を用意し
【初心者向け】スマホでPCの画面を見る方法【iPhone/Android】
#パソコン画面をiPhone/Androidに表示する最適な方法
iPhone/Androidの画面をパソコンにミラーリングして表示させる方法を知っている人が多いようですが、
**パソコンをスマホにミラーリングする方法**を知る人は多くではありません。では、この記事はパソコン画面をiPhone/Androidに表示する最適な方法について、ご紹介します。
##事前準備
iPhone/Androidスマホ(この記事ではiPhoneを例として説明します。)
Windows PC(Windows7/8/8.1/10)
画面ミラーリングアプリ(この記事では[LetsView](https://letsview.com/jp/) という無料のアプリを例として操作します。[ApowerMirror](https://www.apowersoft.jp/phone-mirror)というミラーリングアプリもおすすめです。)
##操作手順
1.スマホとパソコンを同じWi-Fiネットワークに接続しておきます。
2.スマホとパソコンに[LetsView](https://letsview.com/jp
【Android】画面の表示サイズ(dpi)変更に耐えられるLayoutを定義する その2
# AutosizingTextView について
AutosizingTextView の詳細については以前投稿したもを参考にしてください
[画面の表示サイズ(dpi)変更に耐えられるLayoutを定義する – Qiita](https://qiita.com/HanaleiMoon/items/ae2c89294abfa69935b7)# AutosizingTextView を APIレベル 26 未満で使う
AutosizingTextView は Android 8.0(API レベル 26)以降で使用できるようになった機能である
今回の目的は APIレベル 26 未満でも AutosizingTextView の自動サイズが適用される Layout を投稿することである
APIレベル 26 未満でも簡単に使用できたのでメモしておく# 普通の TextView でのレイアウト崩れの例
・3行に改行されてしまうTextViewがあったとする
・ここの文字列は可変であり何がくるかわからないとする(3文字くらいの単語が入ることも想定)
・短い単語では表示に問題はない
・横幅
Scratch filesで気軽にコードの実行結果を確認する
# Scratch filesとは
手軽にKotlinやJavaなどを実行できるファイルだよ。
用途的に近いものとしてpaiza.io等のオンラインエディタだけど、モジュール内で定義したクラスやコード補完を使えるといった違いがあるよ。# Scratch filesの特徴
– モジュール内で定義したクラスを使用できる
– Interactive modeでコードを書き換えても即反映してくれる
– コード補完がある
– プロジェクトフォルダと違う場所にファイルが作成されるのでGitに追加されない# Scratch Fileの作成
1. `New` -> `Scratch File`を選択
2. `Kotlin`を選択作成すると以下の画面
Retrofit2で共通処理を行う
AndroidアプリでAPIを叩きたい時、定番のライブラリと言えばRetrofitです。
このRetrofitを使って、APIからのレスポンスによって同じ様な処理を行う場合、毎回同じコードを書くのは面倒ですよね!
同じ様な処理は共通化しちゃいましょう!# 通常のAPI呼び出し
例えば、エラー時に下記のようなToastを表示する仕組みがあったとします。
様々な箇所でAPIを呼び出す度、全てに同じ様な処理を書くのは効率が悪いです。
ここを上手く解決しましょう!“`kotlin
Api.getUser().enqueue(object: Callback{
override fun onResponse(call: Call, response: Response ) {
if(!response.isSuccessful) {
// エラー時の処理
Toast.makeText(context, “error!”, Toast.LENGTH_SHORT).show()
AndroidのPR作成前のチェックリスト
## PR作成の際に
PRを作成する際に最近自分が自分がやりがちなミスを列挙します。
深い設計や効率の良いコードは難しくとも単純ミスを減らすためにのチェックリストです。PR作成前の動作確認と、せめてこのチェックリストは見返すようにしています。
## チェックリスト
– [x] レイアウトファイルやManifestファイルはなるべく閉じタグをなくす
中に他のタグを挟む必要が無い場合は、
として、コンパクトにタグを記述する。 – [x] Log.dなどデバッグ用のコードの削除
– [x] 日本語文字列やURLはリソースファイルを使って表記
– [x] アップロードキーなど、コミットに含めるべきで無いファイルをGit管理に含めていないか?
– [x] 変数名、メソッド名はUpperSnakeCaseで命名する
– [x] レイアウトファイルのインデント幅は統一されているか?
– [x] 変数やメソッドでprivate宣言に変更すべきところが残っていないか?
– [x] プロジェクトでktlintフォーマッターを導入している場合は、フォーマットコマン
Android9アプリ検証中に、プッシュ通知で何でポップアップされない?ってなったときに
アプリの動作検証担当になってここ数ヶ月、個人的には信じられない(単に直感的でない)ことにはまって数時間困った件を残します。
同じことで悩んでいる人の助けになれば幸いです。
## 事象
Android 9端末(Galaxy A20 SCV46とALLDOCUBE iPlay10 Pro U1006H)にて、
Javaで開発されたアプリの通知機能を検証するために、
インストール直後、通知は受け取れる(ステータスバーにはアイコンは出ている)が、場合によってポップアップされたりされなかったりする???
という悩ましい現象が発生。## 原因
Androidのアプリ設定にて、検証中のアプリの設定画面を開いていた。
という至極シンプルなことだった。## 対処方法
通知動作を確認するときは、アプリの設定画面を開いているプロセスを立ち上げっぱなしになっていないことを確認すること。
立ち上げているなら、落とすこと。## 最後に
Androidのアプリ設定周りの内部仕様をわかっていないので、挙動だけで判断するに、
本来なら初回通知受診時に送信元が設定したパラメータを元に通知設定が作
【Android】 Broadcast Recieverでintentを受け取る
# Broadcast Recieverとは?
– BroadcastReceiver(ブロードキャストレシーバー)とは、ブロードキャストしたインテントを受け取る仕組みのこと
– OSのAndroidシステム側でブロードキャストされるイベント(スクリーンのON/OFFなど)以外でも、自分で作成したアプリでも独自のインテントを生成してブロードキャストできる# intentとは?
– intentとは、アプリケーションの中の1つ1つの機能のこと。たとえばアプリケーション同士や、アプリケーションとウィジェット、アプリケーションとシステムを橋渡しする仕組みのこと
– BroadcastRecieverを使わずとも、intentだけでも利用が可能で、例えば電話をかけたりカメラを起動することもできる
– BroadcastRecieverでは、例えばアプリをインストールした際などに発生するintentを検知することができます。例えば…
– スクリーンのON/OFFを検知する
– 電池の状態を検知する
– アプリのインストールを検知する
– 振動を検知する 等#
どこでもAndroidのリソースファイルを参照する方法
## Androidのリソースファイルが参照できない
Androidのアプリ開発をしていて、変数に文字列を入れる時、なるべくリソースファイルを参照した方が良いと思うけれどもgetStringメソッドが使えたり使えなかったり、リソースファイルのように@string/textなど色々試してみるけれども、参照できないと思ったことが多かったのでメモ。
## いつリソースがファイルが参照できていないのか
「getStringが使えたり使えなかったりするけれども、いつ使えていつ使えないのか?」と思い試してみたところ、
– ActivityやFragmentではgetStringメソッドを使える。
– ViewModelファイルやActivityやFragment内でもcompanion object内だと参照出来ない
ということが分かりました。Fragmentファイルでも大体companion object内こそリソース参照したいことが多いのに困りました。
### 解決法
解決策として、これで良いのかは分かりませんが、
– ViewModelの場合
ViewModel内からだ
Kotlinで他のところタップでキーボードを引っ込める
# キーボードがいい感じに引っ込んでくれない
これだとログインボタンを押すことができません…
# 他の領域にクリックイベントをつけることで解決する
“`xml
Flutter:タブの内容に合わせてAppBarを切り替える
# はじめに
最近Flutterを始めました。
その際、tab(見ているページ)に合わせてAppBarを切り替えたくなったので、実装してみました。間違い等ありましたら、ご指摘お願いします。# 開発環境 (flutter version)
“`
Flutter (Channel master, v1.15.19-pre.8, on Microsoft Windows [Version 10.0.19041.153], locale en-US)
“`#ソースコード
コピペでも動きます。
tabcontrollerを使用して今どのタブを開いているかを確認し、どのAppBarを出すか決めています。“`dart:main.dart
import ‘package:flutter/material.dart’;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return
【エラー】D8: Program type already present: android.support.v4.os.ResultReceiverの解決方法
#はじめに
いつも通りionic5で開発したアプリを`ionic cordova run android`でビルドしてAndroid端末にインストールしようとしたのですが、`D8: Program type already present: android.support.v4.os.ResultReceiver`というエラーが発生しました。
解決方法を記載します。#解決方法
1. `ionic cordova plugin add cordova-plugin-androidx`を実行
2. `ionic cordova plugin add cordova-plugin-androidx-adapter`を実行#cordova-plugin-androidxとは
CordovaプロジェクトでAndroidサポートライブラリの後継であるAndroidXを有効にします。
https://github.com/dpa99c/cordova-plugin-androidx#cordova-plugin-androidx-adapterとは
CordovaプロジェクトにAndro
Flutter gallery_saver Androidのみ保存でエラーになる問題の解決
[gallery_saver](https://pub.dev/packages/gallery_saver) は、写真・画像をカメラロール、ギャラリーに保存するライブラリ。
※ 使用バージョン gallery_saver 1.0.7Androidのみ、同一ファイル名で保存をかけた場合、エラーとなる問題がある。
発生するエラー。
“`kotlin
E/AndroidRuntime(21661): FATAL EXCEPTION: DefaultDispatcher-worker-1
E/AndroidRuntime(21661): Process: com.example.myapp, PID: 21661
E/AndroidRuntime(21661): java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String android.net.Uri.getLastPathSegment()’ on a null object reference
E/AndroidRunti
Kotlin Coroutine 入門2: 並列実行と Structured Concurrency と例外
[前回](https://qiita.com/wm3/items/48b5b5c878561ff4761a)は Kotlin の coroutine の基本として、起動と suspend 関数の解説をしました。今回は coroutine を並列で起動する場合に必要になってくる概念を解説していきます。
### シナリオ: 最安値を見つけろ!
今回は「二つの販売店の API を使って商品の価格を比較し、最安値を取得する」というシナリオを考えます。動作を見やすくするために `Store` という抽象クラスを用意しました。
“`kotlin
/** お店の商品情報を提供する抽象クラス */
abstract class Store(private val name: String) {
/** 価格取得の実装。サブクラスが実装する。 */
protected abstract suspend fun doGetPrice(itemCode: String): Int/** doGetPrice を呼び出し、取得開始と終了、エラーが出た時にログを出力します。