2012-01-11 87 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