2012-01-11 92 views
1


我正在嘗試爲非市場用戶創建自動安裝應用程序。我正在從私人服務下載APK文件並觸發它進行安裝。現在,一旦安裝過程完成,我想以編程方式知道這一點,以便我可以刪除APK文件。
現在問題是,我無法收到廣泛的鑄ACTION_PACKAGE_INSTALL。我的代碼不在onReceive裏面。接收廣播時出錯

try { 
     //set the download URL, a url that points to a file on the internet 
     //this is the file to be downloaded 
     URL url = new URL("http://url/Downloads/App.apk"); 

     //create the new connection 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 


     //and connect! 
     urlConnection.connect(); 

     //set the path where we want to save the file 
     //in this case, going to save it on the root directory of the 
     //sd card. 
     File SDCardRoot = Environment.getExternalStorageDirectory(); 
     //create a new file, specifying the path, and the filename 
     //which we want to save the file as. 
     File file = new File(SDCardRoot,"App.apk"); 

     //this will be used to write the downloaded data into the file we created 
     FileOutputStream fileOutput = new FileOutputStream(file); 

     //this will be used in reading the data from the internet 
     InputStream inputStream = urlConnection.getInputStream(); 

     //this is the total size of the file 
     int totalSize = urlConnection.getContentLength(); 
     //variable to store total downloaded bytes 
     int downloadedSize = 0; 

     //create a buffer... 
     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; //used to store a temporary size of the buffer 

     //now, read through the input buffer and write the contents to the file 
     while ((bufferLength = inputStream.read(buffer)) > 0) { 
       //add the data in the buffer to the file in the file output stream (the file on the sd card 
       fileOutput.write(buffer, 0, bufferLength); 
       //add up the size so we know how much is downloaded 
       downloadedSize += bufferLength; 
       //this is where you would do something to report the prgress, like this maybe 
       // updateProgress(downloadedSize, totalSize); 

     } 
     //close the output stream when done 
     fileOutput.close(); 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
     startActivity(intent); 
     //catch some possible errors... 
} catch (MalformedURLException e) { 
     e.printStackTrace(); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 

    BroadcastReceiver myReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(Intent.ACTION_PACKAGE_INSTALL)){ 
       Toast.makeText(AndroidActivity.this,"Hi", Toast.LENGTH_LONG).show(); 
      } 

     } 
    }; 

    registerReceiver(myReceiver, new IntentFilter("ACTION")); 
    unregisterReceiver(myReceiver); 

<?xml version="1.0" encoding="utf-8"?> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".AndroidActivity" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

回答

1

我認爲你必須註冊ACTION_PACKAGE_CHANGEDACTION_PACKAGE_ADDED並檢查安裝是你的包在reciever(是否以避免反應,其他一些包被添加)使用

packagename = intent.getdata().getSchemeSpecificPart() 

然後刪除您的APK

+0

是的,我同意你的看法,但我真正的問題是我不能夠進去的onReceive – 2012-01-11 13:30:14

+0

甚至改變和增加意圖? – nandeesh 2012-01-11 13:31:53

+0

我已經刪除了onReceive中的if條件。 – 2012-01-11 13:34:20