Android讀取第三方應用列表並卸載

運行效果

工具類功能如標題所示,實現效果如上圖,具體實現見代碼。

/**
 * 安裝一個apk文件
 */
public static void install(Context context, File uriFile) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(uriFile), "application/vnd.android.package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}
/**
 * 卸載一個app
 */
public static void uninstall(Context context, String packageName) {
    //通過程序的包名創建URI
    Uri packageURI = Uri.parse("package:" + packageName);
    //創建Intent意圖
    Intent intent = new Intent(Intent.ACTION_DELETE, packageURI);
    //執行卸載程序
    context.startActivity(intent);
}

/**
 * 獲取已安裝非系統應用
 *
 * @return
 */
public static List<AppInfo> scanInstallApp(Context mContext) {
    List<AppInfo> appInfos = new ArrayList<>();
    PackageManager pm = mContext.getPackageManager(); // 獲得PackageManager對象
    List<ApplicationInfo> listAppcations = pm
            .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
    Collections.sort(listAppcations,
            new ApplicationInfo.DisplayNameComparator(pm));// 字典排序
    for (ApplicationInfo app : listAppcations) {
        if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {//非系統程序
            appInfos.add(getAppInfo(app, pm));
        }//本來是系統程序,被用戶手動更新後,該系統程序也成爲第三方應用程序了
        else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
            appInfos.add(getAppInfo(app, pm));
        }
    }
    return appInfos;
}

/**
 *  構造一個AppInfo對象 ,並賦值
 */
private static AppInfo getAppInfo(ApplicationInfo app, PackageManager pm) {
    AppInfo appInfo = new AppInfo();
    appInfo.setAppName(pm.getApplicationLabel(app).toString());//應用名稱
    appInfo.setAppIcon(app.loadIcon(pm));//應用icon
    appInfo.setPkgName(app.packageName);//應用包名,用來卸載
    File file = new File(app.sourceDir);
    float size = file.length();
    DecimalFormat df = new DecimalFormat("#.00");
    appInfo.setAppSize(df.format(size / (1024 * 1024)) + "M");//應用大小,M單位,保留兩位小數
    PackageInfo packageInfo = null;
    try {
        packageInfo = pm.getPackageInfo(app.packageName, 0);
        long lastUpdateTime = packageInfo.lastUpdateTime;//應用最近一次更新時間
        appInfo.setUpdateDate(TimeUtil.time2Ago(lastUpdateTime));//將毫秒時間對比當前時間轉換爲多久以前
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return appInfo;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章