読者です 読者をやめる 読者になる 読者になる

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

【Android】リリースしました(和歌山トイレマップで遊んでみる 8)

Android

はじめに

以前から取り組んできた和歌山トイレマップを利用したアプリですが、Google Playで配信してみました。
和歌山でトイレを探したい方はどうぞ。

SearchWakayamaToilet - Google Play

今回はリリースにあたって引っかかったKeystoreの作成と、画面を回転させたときにデータを保存する方法について。

Keystore

Mapが表示されない

アプリをStoreに登録するため、まずはAPKファイルを作成します。 
Android Studioでは Build > Generate Signed APK から作成できます。

ここで、何も考えず「Create new」を選択して新しいKeystore(jks)ファイルを作成してAPKファイルを作成したところ、インストールはできるもののGoogle Mapが表示されない問題がorz

冷静に考えればGoogle Map APIで登録しているものと異なるKeystoreを指定していることが原因なわけですが。

Debugでエラー

Google Map APIのフィンガープリントも、上記のKeystoreファイルを使って取得したものに設定してAPKファイルを書き出せば、正しくMapが表示されました。

で、別件で修正があり、その確認のためいつも通りDebugボタンを押して実行すると、何やらエラーが表示されてまたもMapが表示されずorz

特に指定がない場合、 .android/debug.keystore を使用するようで、またもGoogle Map APIに設定しているKeystoreファイルと異なっている、というのが原因です。

これを変更するため、Android Studioの設定項目を探ってみるもよくわからず。

結局、プロジェクトディレクトリの直下に使用したいKeystoreファイルを置くことで勝手にそちらを使ってくれる、ということのようです。

画面回転後もデータを保持する

これはリリースとは関係ないのですが、個人的に普段デバイスをPortraitモード固定で表示しているため、画面を回転させたときの挙動を確認し忘れていました。

Androidには画面を回転させるとActivityなどが初期化される(OnCreateから実行しなおし)という仕様があります。

今回のアプリでは、デフォルト状態では問題が(あまり)ないものの、データを検索した状態だと、SearchViewに入力したクエリは残っているのにすべてのデータが表示されてしまう、という問題が起こります。
(SearchView.getQuery().toString()の結果も常に「""」になってしまう)

画面回転時のデータのリセットを防ぐには、該当のオブジェクトを「final static」にする、という方法があります。

クラスなど実行途中で値を変更しないオブジェクトの場合は問題がありませんが、今回は検索のたびに該当オブジェクトの値は更新されるため、この方法は使うことができません。
そこで「savedInstanceState」を使います。

値のセット

~省略~
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("キー", 保存する値);
    }
}
  • 今回は画面を回転してデータを初期化するタイミングで実行されるので、検索窓に入力されたクエリを保存します。

値の取得

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ~省略~

    if(savedInstanceState == null){
        strLastQuery = "";
    }
    else {
        strLastQuery = savedInstanceState.getString("キー");
    }
~省略~
  • 値をセットするとき指定したキーを引数に渡すことで、保存された値を取得できます。
  • 値がセットされていない場合は「savedInstanceState」がNullになるため、値が含まれる場合のみQueryが入力されているとして扱うようにしました。

参考

APKファイルの作成

画面回転時の値の保存