2013-01-16 2 views
5

Я хочу установить файл apk и установить широковещательный приемник, чтобы поймать информацию о состоянии установки.Android: BroadcastReceiver при установке/удалении приложения

Я подготовил класс 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, поэтому он должен быть действительным. Ты знаешь почему ?

Благодарим за понимание!

ответ

5

Вам необходимо добавить data scheme в ваш фильтр намерений.

filter.addDataScheme("package"); 

Также ACTION_PACKAGE_INSTALL так и не был использован.

+0

Perfect ~ It works! Спасибо за схему данных и информацию о ACTION_PACKAGE_INSTALL ~ – johann

+0

Отлично работает, но почему? – aotian16

Смежные вопросы