前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Android

Fragmentから親ActivityのonActivityResultを呼ぶ

課題 Fragmentから親ActivityのonActivityResultを呼びたい。どうすればよいか。 対応 昔の実装見たら解決済みだったのだけど、あれ、どうやるんだっけ?となったのでメモ。 onActivityResultをpublicでoverrideする onActivityResultはprotectedで定義され…

Play Install Referrerをアップデートすると追加のパーミッションが要求されることがある

追記 この問題はInstall Referrerの 1.1.2 で解消されたらしい。まだ未確認だけどもう上げても大丈夫そう。 stackoverflow.com 課題 アプリをリリースしようとしたところ、 READ_PHONE_STATE が追加パーミッションとして要求されますと警告が出た。 原因 Pla…

WorkManager.getInstanceでIllegalStateException

課題 一部の端末(例えば Zenfone 3など) でアプリが起動しないという事象が発生している。スタックトレースを見るとWokrManagerのgetInstanceするところでクラッシュしていた。 Caused by: java.lang.IllegalStateException: at androidx.work.impl.WorkMan…

View Binding : includeしたファイルのViewが見つからない

課題 View Bindingを使ってみたが、include タグ以下のVIewの情報が取得できない。 原因 Includeファイルに対してidを指定していない。View Bindingはidを付与したものに対してしかコードを生成しない。 対応 includeファイルにidを付与すると、そのファイル…

setProguardSeedsConsumerメソッドが見つからない

問題 Android Studioから端末にアプリをインストールしようとしたところ以下のエラーが発生。 Unable to find method 'com.android.tools.r8.CompatProguardCommandBuilder.setProguardSeedsConsumer 原因 build.gradle にあるcom.android.tools.r8の設定が…

Android 3.6でビルドエラー

課題 Android3.6がβ版に昇格していたのでアップデートして起動したところ、Gradleのアップデート案内が通知されたので更新したらビルドが通らなくなった。 Gradle Pluginのバージョンを上げたのが原因らしい。 対応 とりあえず app/build.gradle の設定を順…

FragmentStatePagerAdapter

FragmentStatePagerAdapter(fm: FragmentManager)がdeprecatedになってた。 第2引数に BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT か BEHAVIOR_SET_USER_VISIBLE_HINT を 指定するらしいんだけれども BEHAVIOR_SET_USER_VISIBLE_HINT もdeprecatedになってる。…

Android 10 AppTask.moveToFrontが機能しない?

課題 ActivityManager.AppTask.moveToFront()メソッドは現在とは起動中のTaskをForegroundに持ってくるためのメソッド。 これがAndroid 10で機能しなくなっているかもしれない。 全くだめというよりは、うまく前に来ないような。すでに先頭にいるという扱い…

エミュレータにAPKをドラッグ&ドロップでインストールする

タイトルの通りなんだけど、Android Emulatorにapkがドラッグ&ドロップでインストールできるように なってた。PCからapkをエミュレータの画面上にドラッグするだけ あんまり使うことないかと思ってたけど偶然必要な機会があってやってみたら超簡単に入って…

onActivityResultの呼ばれるタイミングとFragmentについて

課題 Fragment.onCreateViewでViewを生成しているが、onActivityResult内でそのViewを使用しようとした際にエラーになるケースがある。 原因 通常Fragment.onActivityResultはActivity.onStart前に実行され、それまでにはFragment.onCreateViewは既に実行さ…

dpに対応する実際のピクセルサイズを得る

課題 指定したdpサイズに対応する、端末の解像度に応じた実際のピクセルサイズが知りたい。 対応 dimens.xmlを使う。 <resources> <dimen name="user_icon">40dp</dimen> </resources> var size = context.resources.getDimensionPixelSize(R.dimen.user_icon) 関連 takerpg.hatenablog.jp

PicassoでWebP画像を表示する

課題 PicassoでWebP画像を表示したいが、WebPを表示するにはAcceptヘッダーにimage/webpが必要となる。どうすればよいか。 対応 OkHttpClientを作成し、Picasso.Builderを使ってdownloaderにセットする addHeaderの内容はChromeのデフォルト値に合わせてみた…

StethoでPicassoのデバッグを可能にする

課題 Picassoのリクエストヘッダーの内容をStethoで確認したい。 どうすればよいか。 対応 以下のような感じでPicassoの初期化メソッドを用意し、Applicationクラスなどから一度だけ呼んであげれば良い。 BuildConfig.DEBUG がtrueの場合のみ処理されるよう…

RecyclerView内のアイテムが表示されたタイミングを取得する

課題 RecyclerView内のあるViewTypeのアイテムが表示されたタイミングでImpressionイベントを計測したい。 対応 RecyclerView.Adapter.onViewAttachedToWindow() メソッドをオーバーライドする。 override fun onViewAttachedToWindow(holder: RecyclerView.…

自前でRipple Effectを呼ぶ

課題 Viewに android:foreground="?android:attr/selectableItemBackground" を定義しているが、プログラム上から呼び出して使用したい。 対応 RippleDrawableのstateを変更することでエフェクトが発生するのでstateを変更してあげれば良い。 以下のサンプル…

ブロードキャストされるアクション一覧

課題 ブロードキャストされるActionにどのようなものがあるのかを知りたい。 対応 $ANDROID_HOME/platforms/android-28/data に broadcast_actions.txt というテキストがある。 気になるものを見つけたらググろう。 ただここに com.android.vending.INSTALL_…

アプリチューザーからどのアプリが選択されたかを知る

課題 アプリのシェア機能を実装するにあたり、どのアプリが選択されたかをGoogle Analyticsに送信したい。 対応 あるIntentのActionに対応するアプリチューザー を表示するには Intent.createChooser を使用するが、 Android API Level 22 (LOLLIPOP_MR1) か…

AppBarLayout内のViewのVisibilityを変更したらlayout_scrollFlags="snap" が無視された話

タイトルがイケてないが他に短い表現も思いつかなかったのでとりあえず。 課題 AppBarLayout内に3つのViewを配置。それぞれのapp:layout_scrollFlagsは上から順に以下の通り app:layout_scrollFlags="scroll" app:layout_scrollFlags="scroll" app:layout_sc…

Firebase Invitesを使う [Android]

そしてDeprecatedへ Firebaseのサポートからメールが来ていたので報告していたバグが直ったかなーと思ったら Deprecated の案内だった。 https://firebase.google.com/docs/invites/deprecation 今後は普通のACTION_SENDのシェアと Dynamic Link 使えとのこ…

Target API levelを28にした際に遭遇したエラー

Target API level 28にしたところ、Essential Phoneで2つのエラーに遭遇した。 Google Mapが落ちる NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion; inside of com.google.android.gms 対応 AndroidManifest.xmlに以下の記…

FLAG_ACTIVITY_REORDER_TO_FRONTのバグについて

BackStack上にあるActivityを再作成することなく再利用したい場合に、FLAG_ACTIVITY_REORDER_TO_FRONT を使うことで可能となるが、2つのバグがあって採用できずにいる。1つは解決済みだがもう一方は現在も発生する。 RootViewではないのにバックボタン押下…

Android 端末DPIの取得

お題 端末ごとにAPIから取得する画像サイズを決定するため、端末のDPIを取得したい。なお対象は XHDPI , XXHDPI , XXXHDPI とする 対応 密度自体はDisplayMetrics.densityで取得できる。 val density = context.resources.displayMetrics.density こちらの方…

App Bundle対応

App Bundleが登場したので対応してみる。 App Bundle で何が変わるのか アプリで対応する端末ごとに最適なAPKをPlay Store側で生成、 個別にインストールしてくれる。 何が嬉しいのか これまではAPKに対応する端末ごとの全てのモジュールを1つにまとめて、あ…

Gradle 4.10とFirebaseについて

2018/11/12追記 Android Studiio 3.3 beta3 firebase-core:16.0.5 firebase-perf:16.2.0 distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip の組み合わせで上手く動いた。なのでgradle-4.10.2で現在は問題ない。 以下の記…

先頭にスクロールさせる

お題 選択中のタブをもう一度タップした場合などに先頭にスクロールさせたい。 RecyclerViewにはアニメーション無しのscrollToPositionとアニメーション付きのsmoothScrollToPositionが あるのでスクロール状態に応じて使い分けたい。 対応 対象の画面が縦ス…

ライブラリバージョンの最新化

アプリをリリースしたら次のリリースの前にライブラリのアップデートを行いたい。ある程度はAndroidStudioが教えてくれるが自分で更新したいときに。 gradle-versions-pluginを使う build.gradleを参照して更新してくれるPluginがあるのでそれを使う https:/…

Firebase Cloud Messagingのバックグラウンド状態でのデータメッセージの受信方法について

Firebaseの通知タイプには通知メッセージとデータメッセージの2種類があり、 どちらか一方だけを送信することも、両方送信することもできる。それぞれのメッセージの処理のされ方はアプリがフォアグラウンドにいるかバックグラウンドにいるかによって異なる…

AndroidX Refactor to AndroidX...

Android StudioのAndroidX対応の置換機能を使ったら ConstraintLayoutのところでClassNotFoundExceptionが発生した。 Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.ConstraintLayout"正しくは androi…

開発者オプション:アクティビティを保持しない

開発者オプション:アクティビティを保持しないをONにすると Activity遷移時に付与したIntentパラメータが遷移先のActivityで受け取れないっぽい。端末 or OSバージョン依存かも。

AndroidX対応

プロジェクトをAndroidX に対応させようかと下記URL参考にやってみたが一筋縄ではいかない感じであった。 https://android-developers.googleblog.com/2018/05/hello-world-androidx.html最終的に成功してないのでこの記事は途中経過の記録である。 対応 app…