2019年3月28日木曜日

Google Play以外で配布したAndroidアプリに半自動アップデート機能をつける

Google Playを使わずに直接apkを端末に配布することがあるかと思いますが、アプリにアップデートがあった場合、Google Playならコンソールでapkをアップロードすれば自動的に各端末でアップデートが行われますが、直接配布した場合はそうはいきません。

新しいapkファイルをWebからダウンロードするかメールで受信するかなど、なんらかの方法で各端末に送って、ファイル管理アプリなどでそのapkを実行して、Androidシステムのインストーラを起動してアップデート、ということを行わなくてはいけません。
台数が多い場合は大変です。かといって各ユーザーにしてもらうのも負担をかけますし、確実にしてもらえるかもわかりません。

楽にするにはどうしたらいいでしょうか。

ざっくり大きく言うと、以下の2つの機能をアプリに入れれば、自動、、、とまではいかないですが、半自動でアップデートすることができます。
(システムのバージョンアップによりいずれできなくなる、あるいは機種によりできない可能性があります。Freetel Priori5 - Android7.1.2で確認しました)

1.新しいapkを端末にダウンロードする
2.IntentにそのapkのURIを入れてインストーラ(正式名称わかりません)を起動する

1は特に問題ないと思います。HTTP,FTPなんでも良いのでサーバーからapkをダウンロードして、端末に保存すればよいです。ただし保存場所は注意しなくてはいけません。ローカル領域(openFileOutput()で取得するパス)だと、インストーラがapkにアクセスできないため、external領域(Environment.getExternalStorageDirectory()で取得するパス)に置く必要があります。

2が肝心なところです。以下のようなコードで実行できます。
Uri uri = FileProvider.getUriForFile(
    context,
    authority,
    file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

FileProvider.getUriForFile()を使用してapkのUriを取得するのがポイントだと思います。
第3引数はapkのFileです。1のときexternal領域に保存しているので、パスは「/storage/emulated/0/○○○/myapp.apk」などとなると思います。

FileProviderを使用するには、manifestなどに定義を記述する必要があります。重要なところですが、詳細は本筋と外れる部分ですので省略します。

取得するUriは「content://<authority>/<privider_path>/myapp.apk」などとなると思います。<>で囲った部分はFileProviderに定義した値を入れます。

Uriができたら、あとは上記コードの通り、ACTION_VIEWのインテントに各パラメータを入れてstartActivityをすると、インストーラが起動します。(各パラメータについて、Androidバージョンによって要不要が違ったり書き方が違ったりするようですが、詳細は省略します)

注意点として、インストーラは「Google Play」アプリを使用している、あるいはそのもののようなので、端末のセキュリティソフトでアプリの実行を制限しているような場合は「Google Play」を許可するように設定しておく必要があります。

また、この処理をいつ実行するかですが、アップデートボタンをつける、APIを用意して最新版があるかチェックして必要なときのみ実行するなど、凝ればいくらでもできますが、要件に応じて検討する必要があるかと思います。

最後に、インストーラが起動してインストールが完了するまでの画像を貼って終わります。

手動でapkダウンロードしたときと同じ画面です。「インストール」を選びます。

これは機種によって?出たり出なかったりするかもしれません。「インストールする」を選びます。「OK」が目立つので、そっちが押されそうですね。。。 

「許可」します。 

無事新バージョンがインストールされました。

以上です。





0 件のコメント:

コメントを投稿