2013-01-16 20 views
5

Yükleme durumuyla ilgili bilgileri yakalamak için bir apk dosyası kurmak ve bir yayın alıcısı kurmak istiyorum.Android: BroadcastReceiver uygulama yükleme/kaldırma

bir BroadcastReceiver sınıfı hazırladık: Ana aktivitede

public class newPackageReceiver extends BroadcastReceiver { 

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

} 

, bir uygulama için yükleme İlk olarak, yeni alıcı nesnesi kayıt daha sonra instanciate düğmesine basın. Benim OnClickListener sınıfta

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(); 
} 

i koyun:

@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 (...) { 
     ... 
    } 

} 

yukarıdaki kod (bunu daralmış) butonuna tıklandığında, yükleyici, görüntülenir ve uygulama mükemmel yüklenir ancak alıcı sınıfına ile (newPackageReceiver) asla çağrılmaz. Kayıt (registerReceiver) onCreate yönteminde yapılır ve onDestroy yönteminde unregisterReceiver çağrılır, dolayısıyla geçerli olur. Neden biliyor musun ?

Okuduğunuz için teşekkür ederiz!

cevap

5

Amaç filtrenize data scheme kodunu eklemeniz gerekir. Ayrıca, ACTION_PACKAGE_INSTALL hiçbir zaman kullanımda değildi.

+0

Mükemmel ~ Çalışıyor! Veri şeması ve ACTION_PACKAGE_INSTALL ~ – johann

+0

İyi çalışır hakkında bilgi için teşekkür ederiz, ama neden? – aotian16

İlgili konular