カスタム アプリ ストアに似たものを作成しようとしていますが、インストールの結果を聞くのに非常に苦労しています。
私はさまざまなことを試しましたが、どれも本来のように機能していません。
私のメイン アクティビティ クラスには、次のようなインストール コードがあります。
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 からメイン アクティビティに情報を送信するにはどうすればよいですか? または、メイン アクティビティ自体でインストールの結果を取得するにはどうすればよいですか?
それを刺すすべての人に感謝します。他のスタックオーバーフローの質問を確認しましたが、探している答えがないようです。