工具類功能如標題所示,實現效果如上圖,具體實現見代碼。
/**
* 安裝一個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;
}