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

Android, iOSアプリ開発に関する調査メモ置き場。ほとんどAndroid。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

R8でNullPointerException

課題 Android Stuio 3.5からはProguardよりもR8推奨ってことでR8を有効にした状態で リリースビルドをしようとしたらビルド中にNullPointerExceptionが発生してビルドできなかった。 対応 ググった感じだとOkHTTPを入れているとバージョンによっては発生する…

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の場合のみ処理されるよう…

AdMobメディエーションリワード動画広告調査メモ

onRewardedイベントでは リワード typeとamountのみ。IDやどのリワード動画サービスかは分からない カスタムリワード動画以外はSDKが提供されているので基本設定で使う分には特殊な実装は不要 テスト時にはテスト端末登録が必要 テスト端末登録を行うとAdMob…

Firebase AnalyticsでBigQueryを使った場合の調査メモ

挙動に関して不明な箇所があったので実際にやってみたメモ DebugViewはユーザープロパティの削除が反映されない(BigQueryには反映されている) DebugViewはユーザープロパティの追加が反映されないことがある(BigQueryには反映されている) 連続して2つセ…

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; こうすると 2.…

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で現在は問題ない。 以下の記…

LayoutInflatorのattachToRootについてのメモ

infrate時の引数 attachToRoot は常にfalseにしとけばOKという おまじないでこれまで問題なくやってきたが trueにするケースに遭遇したのでメモ 遭遇ケース LinearLayoutにViewを繰り返しaddしたい 対象のViewはmergeタグを使用している val tagsLayout: Lin…

Kotlin ラムダ周りの標準関数について(let, also, with, apply, run)

ラムダ周りで似たような関数が多くて使い分けがさっぱり... というかletしか使わずにいたのでこれではいかんと一念発起して整理。 結論 こちらのスタイルガイドラインを参考 Coding Conventions - Kotlin Programming Language ブロックの中身で判断 ブロッ…

先頭にスクロールさせる

お題 選択中のタブをもう一度タップした場合などに先頭にスクロールさせたい。 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…

プログラム上からSelectorを設定する

課題 同じレイアウトファイルを使うが色が異なる2つのパーツがあり、 プログラム上からselectorを設定し、isSelectedを使ったがsetTextColorとsetBackgroundColorが機能しない。どうすればいいか。 対応 TextColorの場合 プログラム上からsetTextColorでSel…

4系端末にSVG画像を適用する方法と注意点

一応自分で試して対応は確認できたが採用はしていない。以下は必要になった場合に備えての記録。 課題 4系端末でもSVG画像を使いたいが上手く表示されなかったりアプリが落ちたりする。 どうすればよいか。 対応 参考URLの記事を読めば全て書いてあるが、 い…

Andoid6.0でVector画像のdrawableStart, drawableEndのSelectorが機能しない

課題 Selectorを使用したdrawableを作成し、それをTextViewのdrawableStartに設定したが、 Android6.0系の端末だけ初期表示時に有効にならない。 リロードすると正しく表示される。 対応 おそらくバグ。とりあえず主な対処方法は2つ drawableStart、drawable…

前画面に戻った際にAppBarLayoutのスクロール状態が元に戻ってしまう

課題 CoordinatorLayoutを使っている画面で、画面遷移後にバックボタンを押下すると 端末によってはスクロール位置が保持されずにAppBarLayoutが全て開いた状態になってしまっている。 どうすればいいか。 対応 CoordinatorLayoutにidを付与する。 バックボ…