卸载app的方式有多种,可以直接调用android系统的卸载程序,但是这样会调出android卸载提示框,问题就是真的不好看。
所以采用静默卸载的方式,避免弹出系统提示框。
方法一(调用系统卸载程序):
1 //卸载应用 2 Uri packageURI = Uri.parse("package:" pkgName); 3 Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 4 startActivity(uninstallIntent);
方法二(静默安装):
1 /** 2 * 卸载应用入口提示 3 * 4 * @param position app在列表中的位置 5 * @param mData app列表 6 */ 7 public void startUninstall(int position, List<AppInfoModel> mData) { 8 9 //获取应用程序包名 10 String pkg = mData.get(position).packageName; 11 //判断此应用程序是否存在 12 Boolean pkgExist; 13 pkgExist = appExist(mContext,pkg); 14 if (!pkgExist) { 15 Toast.makeText(mContext, "程序未安装", Toast.LENGTH_SHORT).show(); 16 } else { 17 //静默卸载 18 Boolean uninstallSuccess = uninstall(pkg); 19 if (uninstallSuccess){ 20 Toast.makeText(mContext, "卸载成功", Toast.LENGTH_SHORT).show(); 21 } else { 22 Toast.makeText(mContext, "卸载失败", Toast.LENGTH_SHORT).show(); 23 } 24 } 25 26 } 27 28 29 /** 30 * 静默卸载App 31 * 32 * @param packageName 包名 33 * @return 是否卸载成功 34 */ 35 private static boolean uninstall(String packageName) { 36 Process process = null; 37 BufferedReader successResult = null; 38 BufferedReader errorResult = null; 39 StringBuilder successMsg = new StringBuilder(); 40 StringBuilder errorMsg = new StringBuilder(); 41 try { 42 process = new ProcessBuilder("pm", "uninstall", packageName).start(); 43 successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); 44 errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); 45 String s; 46 while ((s = successResult.readLine()) != null) { 47 successMsg.append(s); 48 } 49 while ((s = errorResult.readLine()) != null) { 50 errorMsg.append(s); 51 } 52 } catch (Exception e) { 53 KLog.d("e = " e.toString()); 54 } finally { 55 try { 56 if (successResult != null) { 57 successResult.close(); 58 } 59 if (errorResult != null) { 60 errorResult.close(); 61 } 62 } catch (Exception e) { 63 KLog.d("Exception : " e.toString()); 64 } 65 if (process != null) { 66 process.destroy(); 67 } 68 } 69 //如果含有"success"单词则认为卸载成功 70 return successMsg.toString().equalsIgnoreCase("success"); 71 } 72 73 /** 74 * 判断应用是否存在 75 * 76 * @param context 上下文 77 * @param packageName 包名 78 * @return 是否存在 79 */ 80 private boolean appExist(Context context, String packageName) { 81 try { 82 List<PackageInfo> packageInfoList = context.getPackageManager().getInstalledPackages(0); 83 for (PackageInfo packageInfo : packageInfoList) { 84 if (packageInfo.packageName.equalsIgnoreCase(packageName)) { 85 return true; 86 } 87 } 88 } catch (Exception e) { 89 KLog.d(e.toString()); 90 } 91 return false; 92 }