8

インストール状況に関する情報を取得するために、apkファイルをインストールしてブロードキャストレシーバーを設定したいと思います。

BroadcastReceiverクラスを用意しました:

public class newPackageReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("DEBUG"," test for application install/uninstall");
    }

}

メインアクティビティでは、最初に新しいレシーバーオブジェクトを登録し、次にアプリケーションインストール用のボタンをインスタンス化します。

public void onCreate(Bundle savedInstanceState) {
...
IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        filter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
        filter.addAction(Intent.ACTION_PACKAGE_INSTALL);
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
        filter.addAction(Intent.ACTION_PACKAGE_RESTARTED);

        receiver = new newPackageReceiver();
        registerReceiver(receiver, filter);
        ...

dlButton.setText(R.string.dl_button);
dlButton.setOnClickListener(new AppliDownloadOnClickListener(this ));   


@Override
public void onDestroy(){
     unregisterReceiver(receiver);
     super.onDestroy();
}

私のOnclickListenerクラスには、次のように記述します。

@Override
    public void onClick(View v) {

    // actually, the below process is in an asyncTask
    URL url;
    Intent promptInstall;

    try {
        url = new URL(apkurl);

        HttpURLConnection c = (HttpURLConnection) url.openConnection();
        c.setRequestMethod("GET");
        c.setDoOutput(true);
        c.connect();

        String PATH = Environment.getExternalStorageDirectory()+ "/download/";
        File file = new File(PATH);
        file.mkdirs();
        File outputFile = new File(file, "app.apk");
        FileOutputStream fos = new FileOutputStream(outputFile);

        InputStream is = c.getInputStream();

        byte[] buffer = new byte[1024];
        int len1 = 0;
        while ((len1 = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len1);
        }

        fos.close();
        is.close();

        promptInstall = new Intent(Intent.ACTION_VIEW);
        promptInstall.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive");

        if (promptInstall != null) {
            activity.startActivity(promptInstall);
        } else {
            ErrorDetails.displayToastMessage(activity,R.string.connection_error);
        }


    } catch (...) {
        ...
    }

}

上記のコード(縮小しました)では、ボタンをクリックするとインストーラーが表示され、アプリケーションは完全にインストールされますが、レシーバークラス(newPackageReceiver)は呼び出されません。登録(registerReceiver)はonCreateメソッドで行われ、unregisterReceiverはonDestroyメソッドで呼び出されるため、有効である必要があります。なぜなのかご存知ですか ?

読んでくれてありがとう !

4

1 に答える 1

9

インテントフィルターにデータスキーマを追加する必要があります。

filter.addDataScheme("package");

また、ACTION_PACKAGE_INSTALLは使用されていませんでした。

于 2013-01-16T03:15:21.593 に答える