web-dev-qa-db-ja.com

androidプログラムでapkを更新し、インストールの結果を確認する

アプリのアプリアップデーターを書いています。デバイスにapkがあることを確認した後、これは更新しようとしているアプリ内から実行することです。

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
File f = new File(apkLocation);    
promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.Android.package-archive");
_context.startActivity(promptInstall);

これにより、アプリの権限を表示するインストーラーが起動し、[インストール]をクリックできます。しかし、ここからアプリが閉じるだけで、メッセージはまったく表示されません(インストールが成功したことを通知するダイアログボックスで、[閉じる]または[開く]を押すオプションが表示されると思っていました)。それは単に通知なしでデバイスのメイン画面に移動します。

余談ですが、手動で開いたときに、アプリは確かに更新されています。インストーラを期待どおりに最後まで動かすにはどうすればよいですか?インテントに設定するものはありますか?

これを書いている間、これが発生する理由は、現在のアプリがデバイス上で単に上書きされ、それによってそれが閉じられ、ソースが殺されたためにインテントの結果を得られないのではないかと思いますか?

17
Florin Bombeanu

レシーバーをAndroid.intent.action.PACKAGE_INSTALLAndroid.intent.action.PACKAGE_REPLACEDなどのインテントフィルターに登録するだけで、アプリケーションを再起動できます。

<receiver Android:enabled="true" Android:exported="true" Android:label="BootService" Android:name="com.project.services.BootService">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <data Android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_ADDED"/>
            <data Android:scheme="package"/>
        </intent-filter>
        <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_INSTALL"/>
            <data Android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_CHANGED"/>
            <data Android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_REPLACED"/>
            <data Android:scheme="package"/>
        </intent-filter>
    </receiver>
</application>

そして

public class BootService extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(context,Controller.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(serviceIntent);
    } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(context, Controller.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(serviceIntent);
    }
  }
}
16
Bishwash

正常に更新するには、更新タスクを新しいタスクとして示すURIでインテントを起動する必要があります。

 final Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK));
 "application/vnd.Android.package-archive");
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);

以下の私の投稿:

Androidアプリケーションの更新の問題

3
dawid gdanski

まず、root権限を持っているか、システム権限がない限り、プロンプトなしではインストールできません。私はあなたがそれを求めていたとは思いませんが、段落の1つが明確ではありません。

次に、実行中のアプリの更新バージョンをインストールする場合、表示される動作が予想されます。アプリは強制的に閉じられ、更新されます。インプレースで更新することはできません。インストーラーを呼び出すアクティビティが再開されるため、インストールがいつ中止されたかを検出できます。

実行中のアプリを更新して実行し続けるには、インストールを監視してアプリを再起動する別のプロセス(アプリ)が必要です。

1
323go