非公開のAndroidアプリを開発しています。つまり、アプリはグローバルなAndroidマーケットでは利用できません。アプリは、たとえば、apkファイルを使用して、クライアントの数を制限します。このアプリで自動更新機能を有効にするにはどうすればよいですか。
さまざまな潜在的なオプションがあります(それらが技術的に難しいか、実装するのが不可能であるか、または再利用できる既存の機能があるかどうかはわかりません):
自動更新機能はアプリに含まれているため、開発作業が少なくて済むため、オプション1をお勧めします。
janjonas、私が働いている会社では、Windows Mobile 6.xでも同様の問題があり、EboMikeが指摘したのとほぼ同じソリューションを使用しています。
メインアプリは、WebServiceに対して更新されているかどうかを確認します。必要に応じて、現在のバージョンと、新しいバージョンをダウンロードするURLを受け取ります。次に、メインアプリはアップデータアプリを起動し、URLを渡して終了します。
アップデーターは、HTTP経由で新しいプログラムのダウンロードを行い、ダウンロードした%をユーザーに表示します。ユーザーは管理された方法でいつでもダウンロードをキャンセルでき、アップデーターはこのキャンセルを登録できます。
新しいアプリがダウンロードされたため、アップデーターは新しいアプリを実行して終了します。
オプション1はあなたにとって作業量が最小であり、実際には最もクリーンなものだと思います。なぜなら、ユーザー通知と、ユーザーがインストールを中止するオプションを含むAndroidの組み込みパッケージインストーラーを使用する適切なチャネルを通過するからです望ましい。
あなたはすでにそれをすべて概説しています-サーバー上で新しいバージョンを確認してください(ユーザーにそれをオフにするオプションを与えるといいでしょう)、そして新しいバージョンがある場合は、APKでURLにリンクすることができます(IIRCでは、ブラウザーのダウンロードマネージャーを使用してダウンロードします)、またはアプリでダウンロードしてから、ローカルファイルをインテントに向けることができます。 HTTPリンクの使用は、技術的には作業が少なくてすっきりしています-オペレーティングシステムに任せるほど、より良いです-理由がない限り。
Google Play以外のアプリケーションでは、「非マーケットアプリのインストール」を有効にする必要があります。有効になっていない場合、インストールプロセスはそれを要求し、ユーザーをアプリケーション設定にリダイレクトします。その後、ユーザーはアプリをインストールできます。
ニーズに応じて、サードパートライブラリに委任できます。
これを行うために使用する権限の一部は次のとおりです。
<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. :-(
}
これは非常に不完全な方法かもしれませんが、一部の企業では、適用できると信じている場合、これは非常に簡単に実装できます。
ソフトウェアはフラグ値をキャッシュするため、パスワードが変更されてもパスワード画面は表示されません。新規インストールの場合にのみ表示されるため、プロセスを繰り返す必要があります。
注:この方法は、何百人ものユーザーがアプリケーションを使用していない場合により適している可能性があります。また、この方法も安全ではないことを忘れないでください。要約すると、アプリケーションをプライベートに保ち、セキュリティ上の懸念がない方法を探している場合、これがお勧めです。
アプリを更新する場所に新しい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);
}