0

カスタム アプリ ストアに似たものを作成しようとしていますが、インストールの結果を聞くのに非常に苦労しています。

私はさまざまなことを試しましたが、どれも本来のように機能していません。

私のメイン アクティビティ クラスには、次のようなインストール コードがあります。

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(Uri.fromFile(apkFile),
"application/vnd.android.package-archive");
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, getApplicationInfo().packageName);
startActivityForResult(intent, resultIndex);

それはとても簡単です。結果を取得しようとした最初のことは、メイン アクティビティで onActivityResult 関数をオーバーライドすることです。その関数は呼び出されません (最初の行の logger ステートメントは出力されません)。

したがって、マニフェストにレシーバーを作成してみました。

<receiver android:name=".PackageReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

そして、PackageReceiver クラスで、onReceive 関数をオーバーライドしました。これは、PackageReceiver の関数が呼び出されたという意味では機能しましたが、何かが発生したことをメイン アクティビティに通知する方法の問題に行き詰まりました (私のプロジェクトの目的のために、知る必要があります)。PackageReciever をインスタンス化できません。それはマニフェストにあるので、Androidは私のためにそれを行います。

新しいブロードキャストを作成しようとしたので、PackageReceiver の onReceive 関数は次のようになります。

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equals(Intent.ACTION_INSTALL_PACKAGE) ||
            action.equals(Intent.ACTION_PACKAGE_ADDED) ||
            action.equals(Intent.ACTION_PACKAGE_CHANGED) ){
        logger.debug("Caught action of type " + action);

        Intent i2 = new Intent();
        i2.setAction("MY.CUSTOM.ACTION");
        context.sendBroadcast(i2);
    }

}

次に、メインのアクティビティで、新しい BroadcastReceiver を作成しました。

BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        logger.warn("I made it!!!! HOORAY!!");
    }
};

そして、次のように、そのレシーバーを onResume 関数に登録 (および onPause で登録解除) します。

@Override
protected void onResume() {
    IntentFilter filter = new IntentFilter();
    filter.addAction("MY.CUSTOM.ACTION");
    registerReceiver(myReceiver, filter);
    logger.debug("Registering receiver in onResume.");
    super.onResume();
}

素晴らしい解決策のように聞こえますが、「myReceiver」には onRecieve 関数が呼び出されません。単に登録解除を削除し、登録をアクティビティの onCreate メソッドに移動するだけで、したくないときに登録解除しないようにしようとしましたが、どれも機能しません。最終的な結果として、ロガーで例外がスローされ、IntentFilter がリークされたというメッセージが表示されます。「登録を解除するのを忘れましたか?」(いいえ、私は非常に意図的に登録を解除しませんでした...しかし...気にしないでください)。

このギャップを埋める方法についてのアイデアが不足しています。また、インストールされているアプリケーションをポーリングしてバージョン番号を確認することもできません。ここに入ることができない理由により、バージョン番号は使用しません。私が開始したインストールをユーザーが完了したかどうかを知る必要があります。

PackageReceiver からメイン アクティビティに情報を送信するにはどうすればよいですか? または、メイン アクティビティ自体でインストールの結果を取得するにはどうすればよいですか?

それを刺すすべての人に感謝します。他のスタックオーバーフローの質問を確認しましたが、探している答えがないようです。

4

1 に答える 1