web-dev-qa-db-ja.com

(プライベート)Androidアプリの自動更新

非公開のAndroidアプリを開発しています。つまり、アプリはグローバルなAndroidマーケットでは利用できません。アプリは、たとえば、apkファイルを使用して、クライアントの数を制限します。このアプリで自動更新機能を有効にするにはどうすればよいですか。

さまざまな潜在的なオプションがあります(それらが技術的に難しいか、実装するのが不可能であるか、または再利用できる既存の機能があるかどうかはわかりません):

  • 起動するたびに、アプリは(サーバーを要求することにより)新しいバージョンが存在するかどうかをテストし、存在する場合は新しいapkをダウンロードし、それ自体を新しいバージョンに置き換えます。
  • 更新チェックと交換プロセスを行う別個のアプリまたはサービスを使用(または開発?)します。
  • 自動更新オプションがあるプライベートマーケットアプリを使用(または開発)します。このオプションは2番目のオプションに似ていますが、より一般的です:マーケットアプリはリポジトリに接続されます。つまり、任意の数の(プライベート)アプリを処理します。

自動更新機能はアプリに含まれているため、開発作業が少なくて済むため、オプション1をお勧めします。

50
janjonas

janjonas、私が働いている会社では、Windows Mobile 6.xでも同様の問題があり、EboMikeが指摘したのとほぼ同じソリューションを使用しています。

enter image description here

メインアプリは、WebServiceに対して更新されているかどうかを確認します。必要に応じて、現在のバージョンと、新しいバージョンをダウンロードするURLを受け取ります。次に、メインアプリはアップデータアプリを起動し、URLを渡して終了します。

アップデーターは、HTTP経由で新しいプログラムのダウンロードを行い、ダウンロードした%をユーザーに表示します。ユーザーは管理された方法でいつでもダウンロードをキャンセルでき、アップデーターはこのキャンセルを登録できます。

新しいアプリがダウンロードされたため、アップデーターは新しいアプリを実行して終了します。

18
tcbrazil

オプション1はあなたにとって作業量が最小であり、実際には最もクリーンなものだと思います。なぜなら、ユーザー通知と、ユーザーがインストールを中止するオプションを含むAndroidの組み込みパッケージインストーラーを使用する適切なチャネルを通過するからです望ましい。

あなたはすでにそれをすべて概説しています-サーバー上で新しいバージョンを確認してください(ユーザーにそれをオフにするオプションを与えるといいでしょう)、そして新しいバージョンがある場合は、APKでURLにリンクすることができます(IIRCでは、ブラウザーのダウンロードマネージャーを使用してダウンロードします)、またはアプリでダウンロードしてから、ローカルファイルをインテントに向けることができます。 HTTPリンクの使用は、技術的には作業が少なくてすっきりしています-オペレーティングシステムに任せるほど、より良いです-理由がない限り。

6
EboMike

Google Play以外のアプリケーションでは、「非マーケットアプリのインストール」を有効にする必要があります。有効になっていない場合、インストールプロセスはそれを要求し、ユーザーをアプリケーション設定にリダイレクトします。その後、ユーザーはアプリをインストールできます。

ニーズに応じて、サードパートライブラリに委任できます。

3
CelinHC

これを行うために使用する権限の一部は次のとおりです。

<uses-permission Android:name="Android.permission.ACCESS_SUPERUSER" />
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

少し説明しましょう...最後のWRITE_EXTERNAL_STORAGEは、一目瞭然です。 ACCESS_SUPERUSERを使用して、ルート権限を使用するつもりであることをシステムに伝えます。 READ_EXTERNAL_STORAGEは、アプリがSDカードのファイルを読み取るために将来必要になります。

ファイルをダウンロードし、それらのすべてのデバイスをルート化できると仮定すると(Playなどではなく、クライアントの数に制限がある場合)、これを行うことができます。

String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk";
Process installProcess = null;
int installResult = -1337;

try {
    installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath);
} catch (IOException e) {
    // Handle IOException the way you like.
}

if (installProcess != null) {
    try {
        installResult = installProcess.waitFor();
    } catch(InterruptedException e) {
        // Handle InterruptedException the way you like.
    }

    if (installResult == 0) {
        // Success!
    } else {
        // Failure. :-/
    }
} else {
    // Failure 2. :-(
}
2

これは非常に不完全な方法かもしれませんが、一部の企業では、適用できると信じている場合、これは非常に簡単に実装できます。

  • アプリケーションにアクセスするためのパスワードを要求するパスワード画面(passwordActivity)を作成します。
  • パスワードを入力したら、フラグを立てます(sharedpreferencesを使用してブール値をfalseからtrueに設定します)
  • .apkファイルをGoogleストアに配置します。
  • 全員がアプリをインストールしたらパスワードを変更し、Google Playストアで新しいアップデートをリリースします。

ソフトウェアはフラグ値をキャッシュするため、パスワードが変更されてもパスワード画面は表示されません。新規インストールの場合にのみ表示されるため、プロセスを繰り返す必要があります。

注:この方法は、何百人ものユーザーがアプリケーションを使用していない場合により適している可能性があります。また、この方法も安全ではないことを忘れないでください。要約すると、アプリケーションをプライベートに保ち、セキュリティ上の懸念がない方法を探している場合、これがお勧めです。

0
0014

アプリを更新する場所に新しいapkが既にダウンロードされていることを確認してください

void installNewVersion(String location) {

 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")),
            "application/vnd.Android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

}
0
wizmeaaaa