自作のAndroidアプリにGoogle Play In-App Review APIを導入してみた

# Kotlinで作ったAndroid用アプリを、初めてリリースしました。

こんにちは、りゃんごです。
普段私は、会社の業務で、複数のAndroidアプリを作成し、リリースやメンテナンスを行っています。
使っているフレームワークはQtです。
同一のソースコードで、Windowss/Mac/iOS/Androidの4つのOSのアプリをリリースできるので、職場で重宝しています。

しかし、QtのAPIを使ってできるアプリは、各OSの最大公約数的なアプリです。
もっとOSの機能を使ったアプリを作ってみたいと思い、Kotlinを初使用して、個人でAndroidアプリを作ってみました。

できた個人製作アプリの第一弾が、Androidの「年齢表示」アプリです。
https://play.google.com/store/apps/details?id=com.lyangostar.birthdaywidget

最近、歳のせいか自分の年齢が把握できなくて…。
常にスマホに表示させておきたくて、作ったアプリです。
登録した内容を、ウィジェットにしてホーム画面に表示できるのが特徴です。
趣味と実益を兼ねて、作成してみました。

作ってる間は必死だったのですが、試行錯誤しまくった拙いソースコードです。
特に、AppWidgetの更新にAlarmManagerを使いたいのに、updatePeriodMillisを使ってる、とか。
早期リリースを優先した結果、妥協した点です。
もし後日AlarmManagerを使って実装出来たら、記事にしたいと思います。

# Google Play In-App Review APIを導入

で、リリースまでは（会社業務の知識を流用したこともあって）順調にできたものの。
誰もアプリを使ってくれない。
GooglePlayConsoleの「訪問者数」も「インストール数」も、個人的にリリースを伝えた人数だけ。
おそらく、誰の目にも届いていないんだと思います。
趣味で作った個人製作アプリと言えど、誰にも使ってもらえないのは悲しい。
ということで、これから色々と対策をしていようと思います。
第一弾として、「Google Play In-App Review API」の導入をしました。

# In-App Reviewを表示するタイミング
「年齢表示」アプリは、（誕生日に限らず）ある日付を入力すると、入力日付から本日までの日数を表示する、というものです。
5項目の入力までは無料、6項目目以降は30項目につき300円の課金を実装しています。
無料の範囲で使ってる人に評価をしてもらいたかったので、「4項目の入力を終わった時点でIn-App Reviewを表示する」という仕様にしました。

Googleのガイドラインにも合致していると思います。
https://developer.android.com/guide/playcore/in-app-review?hl=ja#when-to-request

# 実際の導入手順

既存のアプリに、以下の手順で修正を加えました。


##build.gradle
appのbuild.gradleに、com.google.android.play:core-ktx:1.8.1を追加しました。
```build.gradle
dependencies {
    implementation 'com.google.android.play:core-ktx:1.8.1'
}
```


## 項目を追加ボタン
In-App Reviewを表示させたい「項目を追加」ボタンは、MakeItemFragmentにあります。
MakeItemFragment.ktに、以下をimportしました。
import com.google.android.play.core.review.ReviewManagerFactory


## setOnClickListener
okButton.setOnClickListenerに以下を追加しました。
```kotlin
    if(i == 3 && number == -1) {//4個目を新規追加なら
        val manager = ReviewManagerFactory.create(requireContext())
//        val manager = FakeReviewManager(requireContext())//これは動かなかった
        val request = manager.requestReviewFlow()
        request.addOnCompleteListener { request ->
            if (request.isSuccessful) {
                println("成功")
                val reviewInfo = request.result
                val flow = manager.launchReviewFlow(requireActivity(), reviewInfo)
                flow.addOnCompleteListener { _ ->
                    parentFragmentManager.popBackStack()
                }
            }
            else {
                println("失敗")
                parentFragmentManager.popBackStack()
            }
        }
    }
    else {
        parentFragmentManager.popBackStack()
    }
```

なお、私の環境では以下は動作しませんでした。
//    val manager = FakeReviewManager(requireContext())
下記のエラーが出てましたが、私の現在のスキルではこれ以上追えないため、FakeReviewManagerは使わないことにしました。
>Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
>    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.


# 結果
以下のように、In-App Previewが表示されるようになりました。
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409794/5a6f1168-2ef9-4c43-bdd7-b2f882f14eff.png">
内部テスターのアカウントでスクショを撮ったので、一般ユーザーとは違う表示になっています。


# 参考文献
以下を参考にしました。
ありがとうございました。
https://qiita.com/HaSuzuki/items/ec27a12c3969a51ac409