Android中关于APK文件的下载、安装和卸载
如果我們想開發一款App,而這款App的需求中有對Apk文件的下載、安裝和卸載功能的話(就像豌豆莢,當然功能不會那強大,因為強大的功能背后總是一些比較NB的技術在支持),那么這篇博客還是比較適合你的。好了,我們現在就來看看它們是怎么現實的吧。
文件下載關鍵代碼:
private void downloadApkFile(String appName, String url) {final DownloadTask task = new DownloadTask(appName, url);task.controller = mDownloder.add(DemoApplication.SAVE_APK_PATH + task.storeFileName, task.url, new Listener<Void>() {@Overridepublic void onPreExecute() {task.invalidate(MainActivity.this);}@Overridepublic void onSuccess(Void response) {Toast.makeText(MainActivity.this, task.storeFileName + " Success!", Toast.LENGTH_SHORT).show();}@Overridepublic void onError(NetroidError error) {NetroidLog.e(error.getMessage());}@Overridepublic void onFinish() {NetroidLog.e("onFinish size : " + Formatter.formatFileSize(MainActivity.this, new File(DemoApplication.SAVE_APK_PATH + task.storeFileName).length()));task.invalidate(MainActivity.this);}@Overridepublic void onProgressChange(long fileSize, long downloadedSize) {task.onProgressChange(MainActivity.this, fileSize, downloadedSize);}});}
這是一個已經封裝好了的方法,我這里是通過點擊按鈕來調用這個方法。大家可以看到一個DownloadTask類,這個其實也可以是自己實現。不過我這里把分到了自己lib中了。這個工程Demo是基于Volley框架來開發的。不過我在Volley的代碼中沒有看到關于File相關的內容,只是一些byte相關的封裝類。不過我現在是在網上找到了一些代碼,是利用Volley的代碼,不過有一些自己的東西在里面。我就把這個優化過的代碼直接拿到用了。原連接現在有一些忘記了,不過不用擔心,這里會把他的代碼也一起放在我的資源里上傳給大家。
在我的代碼中與點擊事件直接關聯的還不是按鈕的Onclicklistener,而是下面的這樣一段代碼:
private void downloadApkFile() {String packageName = mPakeageNameEditText.getText().toString();if (ZFUtils.isEmptyString(packageName)) {Toast.makeText(MainActivity.this, "請輸入程序包名", Toast.LENGTH_SHORT).show();return;}String taskCount = mParallelTaskCountEditText.getText().toString();if (!ZFUtils.isEmptyString(taskCount)) {int count = Integer.parseInt(taskCount);mDownloder.clearAll();// 這里做一個判斷的目的是最多只能同時下載3個文件if (count <= 3) {initFilePath(Integer.parseInt(taskCount));} else {initFilePath(3);}}Toast.makeText(MainActivity.this, "Download...", Toast.LENGTH_SHORT).show();downloadApkFile(packageName + ".apk", DemoApplication.HI_APK_BASE_URL + packageName);// downloadApkFile("com.sds.android.ttpod.apk", DemoApplication.HI_APK_BASE_URL + "com.sds.android.ttpod"); // downloadApkFile("com.tencent.mobileqq.apk", DemoApplication.HI_APK_BASE_URL + "com.tencent.mobileqq"); // downloadApkFile("com.kugou.android.apk", DemoApplication.HI_APK_BASE_URL + "com.kugou.android"); // downloadApkFile("com.Qunar.apk", DemoApplication.HI_APK_BASE_URL + "com.Qunar"); // downloadApkFile("com.tencent.mtt.apk", DemoApplication.HI_APK_BASE_URL + "com.tencent.mtt"); // downloadApkFile("com.cootek.smartdialer.apk", DemoApplication.HI_APK_BASE_URL + "com.cootek.smartdialer");} 如上被注釋掉的一塊代碼是用來測試一次能并行下載多少個文件,事實現證明一次最多對并行下載的文件數目不能超過3個。
關于安裝和卸載倒是不難。如下:
/*** 安裝Apk* @date 2014-12-12* @time 上午10:39:30*/private void installAPK(String apkUrl) {String apkPath = apkUrl + ".apk";String fileName = DemoApplication.SAVE_APK_PATH + apkPath;Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");startActivity(intent);}/*** 卸載Apk* @date 2014-12-12* @time 上午10:39:41*/private void uninstallAPK(String url) {Uri packageURI = Uri.parse(url);Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);startActivity(uninstallIntent);}
本程序必需的兩個添加權限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 第一個不用說,連網權限,第二個是對SD卡的寫權限,這個一定要有,因為程序中對文件下載保存的路徑為/sdcard/zfstar,當然這個可以自己修改。
http://download.csdn.net/detail/u013761665/8260113
這里還有一點需要注意,大家可以看到下面的這張圖片:
我用藍色框出的部分是自己實現的,而紅色的部分可以直接放到自己的工程代碼就行了,當然還有一些是自己的意愿可有可無的代碼。如果你覺得麻煩,還可以自己打成一個jar包,直接放到自己的工程即可。
總結
以上是生活随笔為你收集整理的Android中关于APK文件的下载、安装和卸载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java/Android中实现Shell
- 下一篇: android sina oauth2.