- 1. Retrofit2で共通処理を行う
- 2. AndroidのPR作成前のチェックリスト
- 3. Android9アプリ検証中に、プッシュ通知で何でポップアップされない?ってなったときに
- 4. 【Android】 Broadcast Recieverでintentを受け取る
- 5. どこでもAndroidのリソースファイルを参照する方法
- 6. Kotlinで他のところタップでキーボードを引っ込める
- 7. Flutter:タブの内容に合わせてAppBarを切り替える
- 8. 【エラー】D8: Program type already present: android.support.v4.os.ResultReceiverの解決方法
- 9. Flutter gallery_saver Androidのみ保存でエラーになる問題の解決
- 10. Kotlin Coroutine 入門2: 並列実行と Structured Concurrency と例外
- 11. Androidのカスタムビューに2way-DataBindingを設定する
- 12. 【Android】Fragment間で値をやりとりする
- 13. Flutterでflutter_app_badgerを使い、アプリのホームアイコンにバッジを表示する
- 14. ExpoでAPKをビルド後にAndroidManifest.xmlをいじってみる
- 15. AsyncTaskが実行されない不具合の解析
- 16. Kotlin coroutine入門 ③~ViewModelの中でcoroutineを扱ってみる~
- 17. Android (Kotlin) でブロードキャスト送受信の仕方を理解する
- 18. checkSelfPermissionがPERMISSION_DENIEDしか返してくれない罠を踏み抜いた話
- 19. Android で Firebase In-App Messaging が表示されない問題の workaround
- 20. GoogleMapsAPI備忘録(2020年3月時点)
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 を呼び出し、取得開始と終了、エラーが出た時にログを出力します。
Androidのカスタムビューに2way-DataBindingを設定する
### BindingAdapterのソースコード
“`
@BindingAdapter(“frame”)
fun Ocha.setFrame(frame: Int) {
setFrame(frame)
}@InverseBindingAdapter(attribute = “frame”)
fun Ocha.getFrame() = getFrame()@BindingAdapter(“frameAttrChanged”)
fun Ocha.setListener(listener: InverseBindingListener?) {
findViewById(R.id.seekBar).setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
fi
【Android】Fragment間で値をやりとりする
# はじめに
あるFragmentで取得した値を、他のFragmentでも使いたい場面は多々あるかと思います。
この記事では、Fragment間で値をやりとりする方法をまとめました。# 方法一覧
Fragment間で値をやりとりする方法は、ざっくり分けて次のとおりです。– Bundleを使う
– 【応用】SafeArgsを使う
– ActivityのスコープでViewModelを使う
– navGraphViewModelsを使う抜けがあったら教えてください。
次に、それぞれのやり方について解説していきます。
※番外編としてViewPagerやBottomNavigationのページ間で値をやりとりする方法についても解説します。## Bundleを使う
一番オーソドックスなやり方です。遷移先のFragmentを生成する際に値をargumentsとして渡します。### やり方
以下のようにして遷移先のFragmentに値を渡します。
“`kotlin
val title = “タイトル”
// Bundleインスタンスを作成
val bundle = Bu
Flutterでflutter_app_badgerを使い、アプリのホームアイコンにバッジを表示する
Flutterでアプリ開発をしている[村松龍之介](https://twitter.com/riscait)と申します。
(仕事ではiOSアプリのネイティブアプリ開発を行っています)今回は、FlutterアプリにiPhoneやiPadではお馴染みのアイコンバッジを付けるためにパッケージを導入しましたので備忘録です。
## flutter_app_badgerパッケージを導入する
簡単にアイコンバッジを付けられるパッケージがありますので、導入します。
[flutter_app_badger | Flutter Package](https://pub.dev/packages/flutter_app_badger)### pubspec.yamlを編集
“`yaml
dependencies:
# 〜〜省略〜〜
flutter_app_badger: ^1.1.2 # 導入時点で最新のバージョンを指定でOKだと思います。
“`## iOS
iOSでバッジを表示するためには権限が必要なので以下を`info.plist`に追記します。
### Android Stud
ExpoでAPKをビルド後にAndroidManifest.xmlをいじってみる
## やりたいこと
ExpoのデフォルトのAndroidManifest.xmlではapplicationの`android:allowBackup`が`true`で、つまり自動バックアップが有効になっています。
訳あってこれを`false`にしたい。
しかしExpoのManaged WorkflowではiOSのinfoPlistのようにはAndroidManifest.xmlの詳細項目を直接設定することはできないようで、Feature requestsとしてもいくつか挙がっています。
https://expo.canny.io/feature-requests?search=allowbackupそのため、ビルド後のAPKファイルを展開してAndroidManifest.xmlを編集、再ビルドという手順で無理矢理いじってみることにしました。Javaのソースコードはともかく、マニフェストファイルくらいは簡単に書き換えられるだろうということで。
あまり聞こえのいい感じはしませんが、とりあえずできるかどうか試してみたという感じです。## まずは`allowBackup=”true”
AsyncTaskが実行されない不具合の解析
Androidのアプリ開発でAsyncTaskが実行されない不具合があり、解析した際の解析方法をメモします。
## AsyncTaskが実行されない不具合
原因は、AsyncTask(executeOnExecutor(THREAD_POOL_EXECUTOR))で実行した、タスクの処理が想定していたより多くの時間がかかったことで、poolのthreadが全て実行状態となり、新しいタスクが実行されていませんでした。## 解析方法
再現性の低い不具合だったため、発生時のBugreportで解析を行いました。
※やはり、不具合発生時は[バグレポート](https://developer.android.com/studio/debug/bug-report?hl=ja)を取っておいた方が良いですね。下記は、不具合が発生したコードを擬似的に再現したものです。
AsyncTaskのexecuteOnExecutor(THREAD_POOL_EXECUTOR)でタスクを実行していますが、sleepを入れて処理に時間がかかるようにしています。“`kotlin:Sample.kt
Kotlin coroutine入門 ③~ViewModelの中でcoroutineを扱ってみる~
[Kotlin coroutine入門 ②](https://qiita.com/ymkit/items/71dc7ddcbc6c24c26e83)の続きです。
前回の入門記事から、時間が経っていますが、今回は[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja)の中で、何らかのAPIと通信する体のcoroutineを実装しUIに反映して行きたいと思います!!
## 従来の構成 [MVVM](https://qiita.com/s_emoto/items/08e46b18f72c3b303b12) の[Rx](https://github.com/ReactiveX/RxJava)とcoroutine比較
#### Rx使用時
Android (Kotlin) でブロードキャスト送受信の仕方を理解する## きっかけ
最近、Android 開発を仕事で行っていますが、複数のアプリ間連携の方法を今まで知りませんでした。
最近知ったのですが、`Intent`と`BroadcastReceiver`を使用することで簡単にアプリ間連携が可能でした。しかし、まったくの初心者であった自分にとっては???でした。。
そこで今回は 2 つのアプリを連携させる`Intent`の使い方について学ぶことができたので、共有します。## 環境
– Android Studio 3.6.1
– Android 7.0 以降## 概要
1 つの Android 端末に 2 つのアプリケーションをインストールし、その 2 つのアプリ間の連携方法について記述します。
今回作成するアプリは以下になります。#### IntentBroadcast アプリ
– `Intent`を Android 端末アプリケーション内の全てのアプリにブロードキャストするアプリケーション#### IntentReceiver アプリ
– ブロードキャストされた`Intent`を受信するアプリケーション## 1.
checkSelfPermissionがPERMISSION_DENIEDしか返してくれない罠を踏み抜いた話
すでにリリース済みのアプリに対して某広告系ライブラリを入れた時に突如パーミッション関係が軒並みDENIEDを返すようになりパニックになったので自分のための備忘録として。
# 現象
“`
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
“`
もしくはその後、`requestPermission`をコールした後に`onRequestPermissionsResult`で戻ってきた後の第三引数が全部PERMISSION_DENIEDになる。
ちなみに勿論パーミッションは許可された状態で起きる。
今回の場合はすでにリリース済みのアプリで、このあたりは元々元気に動いていたのに急にスンッ・・・とおかしくなったので事態の把握は楽でした。# 原因と対応
“`
“``AndroidManifest.xml` で定義しているpermissionは上記のよ
Android で Firebase In-App Messaging が表示されない問題の workaround
# はじめに
Android で Firebase In-App Messaging を表示させてようとしても、アプリの作り次第では、 **表示されない or すぐに消えてしまう問題** が発生することが確認されました。
全てのケースで解決しないかも知れませんが、意図通りに表示できる workaround を見つけたので記しておきます。Firebase In-App Messaging 導入時の参考になれば幸いです。
※調査した技術内容が多めです
※キャンペーン情報の取得完了のタイミングや、メッセージを表示したい Activity の lifecycle の状態次第では上手く行かないケースが存在するかも知れません
→ 技術的背景を理解した上で、最適な workaround を使うことをオススメします。## 本記事での用語
| 用語 | 意味 |
| — | — |
| LaunchActivity | `AndroidManifest.xml` で `android.intent.category.LAUNCHER` が指定されている Activity |
| Ma
GoogleMapsAPI備忘録(2020年3月時点)
# はじめに
今までの案件で使ったGoogleMapsAPIについての備忘録です。
APIの仕様や制限が変わるので、忘れる前に備忘録を残します。# GoogleMapsAPI
[公式URL](https://developers.google.com/maps/documentation?hl=ja)## マップ
– **Maps SDK for Android**
地図を Android アプリに追加します。– **Maps SDK for iOS**
地図を iOS アプリに追加します。– **Maps Static API**
シンプルで埋め込み可能な地図画像を最小限のコードで追加します。– **Maps JavaScript API**
ウェブサイトにインタラクティブな地図を追加します。独自のコンテンツと画像でマップをカスタマイズできます。– **Street View API**
360 度のパノラマ画像を使用して実世界の画像を埋め込みます。– **マップ URL**
Google マップを起動し、クロスプラットフォームの