概述
关于手机上的所有app的信息,网上已经有好多介绍的了,现在我这里做一下整理。
其中使用的权限有: <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" /> <!-- 获取app包的大小 -->
1、首先自定义一个APP信息的类,这里包含了APP的基本信息,下面是我的,最好在编写类的时候预留一个或者两个空的属性也好,字段也好,方便以后有修改的时候不用再去修改类了,尤其是在创建数据库的时候最为重要。
/**
* 已安装应用的实例类,应用的消息类
* @author luckchoudog
*/
public class AppInfo {
private String appLabel; // 应用程序标签(应用名称)
private Drawable appIcon; // 应用程序图像
private String pkgName; // 应用程序所对应的包名
private long cachesize; // 缓存大小
private long datasize; // 数据大小
private long codesieze; // 应用程序大小
private boolean isSizeKnow = false; // 应用程序大小是否获取成功false表示不知道
public long getCachesize() {
return cachesize;
}
public void setCachesize(long cachesize) {
this.cachesize = cachesize;
}
public long getDatasize() {
return datasize;
}
public void setDatasize(long datasize) {
this.datasize = datasize;
}
public long getCodesieze() {
return codesieze;
}
public void setCodesieze(long codesieze) {
this.codesieze = codesieze;
}
public AppInfo() {
}
public String getAppLabel() {
return appLabel;
}
public void setAppLabel(String appName) {
this.appLabel = appName;
}
public Drawable getAppIcon() {
return appIcon;
}
public void setAppIcon(Drawable appIcon) {
this.appIcon = appIcon;
}
public String getPkgName() {
return pkgName;
}
public void setPkgName(String pkgName) {
this.pkgName = pkgName;
}
public boolean getIsSizeKnow() {
return isSizeKnow;
}
public void setIsSizeKnow(boolean isSizeKnow) {
this.isSizeKnow = isSizeKnow;
}
@Override
public String toString() {
return "AppInfo [appLabel=" + appLabel + ", appIcon=" + appIcon
+ ", pkgName=" + pkgName + ", cachesize=" + cachesize
+ ", datasize=" + datasize + ", codesieze=" + codesieze
+ ", isSizeKnow=" + isSizeKnow + "]";
}
}
2、接下来就是获取程序的信息了,一般的像大多数软件管理软件一样,都是呈现的是设置中应用的相关数据,看如下方法
/**
* 获取App信息的类,包括获取当前App信息和安装包的信息
* <pre>
* 信息包括其中有:
* 安装包名称,安装包包名称,安装包版本信息,安装包图标
* </pre>
* @author luckchoudog
*/
public class GetAppMsg {
/**
* 获取当前App版本号
*
* @return 当前应用的版本号
*/
public static String getVersion(Context context) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(),
0);
String version = info.versionName;
return version;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 获取当前App名称
*
* @return 当前应用的App名称
*/
public static String getAppName(Context context) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(),
0);
ApplicationInfo appInfo = info.applicationInfo;
String appName = manager.getApplicationLabel(appInfo).toString();
return appName;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 获取当前App包名称
*
* @return 当前应用的App包名称
*/
public static String getPackageName(Context context) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(),
0);
String packageName = info.packageName;
return packageName;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 获取当前App的Ico
*
* @return 当前应用的Ico
*/
public static Drawable getIcon(Context context) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(),
0);
ApplicationInfo appInfo = info.applicationInfo;
Drawable icon = manager.getApplicationIcon(appInfo);
return icon;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取任何安装包App信息
*
* @param context
* 上下文
* @param appDir
* 安装包包的路径,比如说下载在SD卡上的一个安装包
* @return
* 包含安装包App信息的HashMap,其中有AppName(安装包名称),AppPackageName(安装包包名称),AppVersion
* (安装包版本信息),AppIcon(安装包图标)
*/
public HashMap<String, Object> getAppMsg(Context context, String appDir) {
HashMap<String, Object> result = new HashMap<String, Object>();
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageArchiveInfo(appDir,
PackageManager.GET_ACTIVITIES);
if (info != null) {
ApplicationInfo appInfo = info.applicationInfo;
String appName = pm.getApplicationLabel(appInfo).toString();
String packageName = appInfo.packageName;
String version = info.versionName;
Drawable icon = pm.getApplicationIcon(appInfo);
result.put("AppName", appName);
result.put("AppPackageName", packageName);
result.put("AppVersion", version);
result.put("AppIcon", icon);
}
return result;
}
}
最后的一个方法是获取一个安装包的信息的,获取的数据是安装包中的清单文件中的数据。
3、下面的这个类,主要的方法是获取整个手机中的所有app的信息,有用到2中的一些方法,返回的列表是1中的列表,看下面的代码,其中获取app的大小这个方法需要用到aidl中的一些知识,直接将这些复制到自己的工程就好了,名字包名什么的都不要改,下载地址
/**
* 获取设备所有已经安装的应用
* @author luckchoudog
*/
public class GetApps {
private String TAG = GetApps.class.getSimpleName();
private AppInfo mAppInfo;
public GetApps() {
mAppInfo = new AppInfo();
}
/**
* 获取app的大小
*
* @param context
* @param app
* 想要获取大小的app
* @return AppInfo
*/
public void getAppSizeInfo(Context context, AppInfo app) {
Logger.d(TAG, "getAppSizeInfo ~ start");
if (null == app.getPkgName() || "".equals(app.getPkgName())) {
Logger.d(TAG, "getAppSizeInfo ~ end1");
return;
}
this.mAppInfo = app;
PackageManager pm = context.getPackageManager();
try {
Method getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo", String.class,
IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, app.getPkgName(),
new PkgSizeObserver());
} catch (Exception e) {
Logger.e(TAG, "getAppSizeInfo ~ error",e);
}
}
class PkgSizeObserver extends IPackageStatsObserver.Stub {
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
if (pStats != null) {
mAppInfo.setCodesieze(pStats.codeSize);// 应用程序大小
mAppInfo.setCachesize(pStats.cacheSize);// 缓存大小
mAppInfo.setDatasize(pStats.dataSize);// 数据大小
mAppInfo.setIsSizeKnow(true);
}
}
}
/**
* 获取手机所有程序列表
*
* @param context
* @return 返回手机已经安装的Applist
*/
public List<AppInfo> getPhoneAppList(Context context) {
Logger.d(TAG, "getPhoneAppList ~ start");
PackageManager packageManager = context.getPackageManager();
List<AppInfo> list = new ArrayList<AppInfo>();
// 获取手机所有应用
List<PackageInfo> temp = packageManager.getInstalledPackages(0);
AppInfo tempAppInfo;
for (PackageInfo packageInfo : temp) {
tempAppInfo = new AppInfo();
// 获取图标
tempAppInfo.setAppIcon(packageInfo.applicationInfo
.loadIcon(packageManager));
// 获取应用名称
tempAppInfo.setAppLabel(packageInfo.applicationInfo.loadLabel(
packageManager).toString());
// 获取应用安装路径
tempAppInfo.setPkgName(packageInfo.applicationInfo.packageName);
getAppSizeInfo(context, tempAppInfo);
list.add(tempAppInfo);
}
Logger.d(TAG, "getPhoneAppList ~ end");
return list;
}
/**
* 获取手机正在运行列表
*
* @param context
* @return 所有正在运行的Applist
*/
public List<AppInfo> getRunningProcess(Context context) {
Logger.d(TAG, "getRunningProcess ~ start");
PackageManager packageManager = context.getPackageManager();
List<AppInfo> list = new ArrayList<AppInfo>();
ActivityManager am = (ActivityManager) context
.getSystemService("activity");
// 获取正在运行的应用
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
List<ApplicationInfo> temp = packageManager
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
for (int i = 0; i < run.size(); i++) {
// 这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。
if (run.get(i).processName.equals("system")
|| run.get(i).processName.equals("com.android.phone")) {
continue;
}
AppInfo tempAppInfo;
for (int j = 0; j < temp.size(); j++) {
if (temp.get(j).processName.equals(run.get(i).processName)) {
tempAppInfo = new AppInfo();
tempAppInfo
.setAppIcon(temp.get(j).loadIcon(packageManager));
tempAppInfo.setAppLabel((String) temp.get(j).loadLabel(
packageManager));
tempAppInfo.setPkgName(temp.get(j).packageName);
getAppSizeInfo(context, tempAppInfo);
list.add(tempAppInfo);
}
}
}
Logger.d(TAG, "getRunningProcess ~ end");
return list;
}
/**
* 获取系统应用
*
* @param context
* @return
*/
public List<AppInfo> getSystemApp(Context context) {
Logger.d(TAG, "getSystemApp ~ start");
PackageManager packageManager = context.getPackageManager();
List<AppInfo> list = new ArrayList<AppInfo>();
List<ApplicationInfo> temp = packageManager
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
AppInfo tempAppInfo;
for (int i = 0; i < temp.size(); i++) {
if ((temp.get(i).flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
tempAppInfo = new AppInfo();
tempAppInfo.setAppIcon(temp.get(i).loadIcon(packageManager));
tempAppInfo.setAppLabel(temp.get(i).processName);
tempAppInfo.setPkgName(temp.get(i).packageName);
getAppSizeInfo(context, tempAppInfo);
list.add(tempAppInfo);
}
}
Logger.d(TAG, "getSystemApp ~ end");
return list;
}
/**
* 获取安装在SD卡上的App
*
* @param context
* @return
*/
public List<AppInfo> getSDCardApp(Context context) {
Logger.d(TAG, "getSDCardApp ~ start");
PackageManager packageManager = context.getPackageManager();
List<AppInfo> list = new ArrayList<AppInfo>();
List<ApplicationInfo> temp = packageManager
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
AppInfo tempAppInfo;
for (int i = 0; i < temp.size(); i++) {
if ((temp.get(i).flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
tempAppInfo = new AppInfo();
tempAppInfo.setAppIcon(temp.get(i).loadIcon(packageManager));
tempAppInfo.setAppLabel(temp.get(i).processName);
tempAppInfo.setPkgName(temp.get(i).packageName);
getAppSizeInfo(context, tempAppInfo);
list.add(tempAppInfo);
}
}
Logger.d(TAG, "getSDCardApp ~ end");
return list;
}
/**
* 获取设备上的第三方App
*
* @param context
* @return
*/
public List<AppInfo> getThirdApp(Context context) {
Logger.d(TAG, "getThirdApp ~ start");
PackageManager packageManager = context.getPackageManager();
List<AppInfo> list = new ArrayList<AppInfo>();
List<ApplicationInfo> temp = packageManager
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
AppInfo tempAppInfo;
for (int i = 0; i < temp.size(); i++) {
if ((temp.get(i).flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
tempAppInfo = new AppInfo();
tempAppInfo.setAppIcon(temp.get(i).loadIcon(packageManager));
tempAppInfo.setAppLabel(temp.get(i).processName);
tempAppInfo.setPkgName(temp.get(i).packageName);
getAppSizeInfo(context, tempAppInfo);
list.add(tempAppInfo);
}
}
Logger.d(TAG, "getThirdApp ~ end");
return list;
}
}
4、卸载某个应用,直接进入系统卸载应用的界面
/**
* 启动卸载某个App
* @author luckchoudog
*/
public class StarUninstallApp {
/**
* 卸载某个APP
*
* @param context
* @param packageName
* app的包名
*/
public void uninstallApp(Context context, String packageName) {
Uri uri = Uri.parse("package:" + packageName);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
context.startActivity(intent);
}
/**
* 通过包名启动其他已经安装的程序
*
* @param context
* @param packageName
* 已经安装的app的包名
* @throws Exception
* 包名不存在异常
*/
public void openAPP(Context context, String packageName) throws Exception {
PackageManager packageManager = context.getPackageManager();
Intent intent = new Intent();
intent = packageManager.getLaunchIntentForPackage(packageName);
context.startActivity(intent);
}
}
5、清除应用数据,缓存等,这个类我整理了一下,同时可以清除data/data目录下的文件夹或者SD卡上的缓存等
/**
* 数据清除管理器 描述: 主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录
* @author luckchoudog
*/
public class DataCleanManager {
/**
* 清除本应用内部缓存(/data/data/com.xxx.xxx/cache)
*/
public static void cleanInternalCache(Context context) {
deleteFilesByDirectory(context.getCacheDir());
}
/**
* 清除本应用所有数据库(/data/data/com.xxx.xxx/databases)
*/
@SuppressLint("SdCardPath")
public static void cleanDatabases(Context context) {
deleteFilesByDirectory(new File("/data/data/" + context.getPackageName() + "/databases"));
}
/**
* 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs)
*/
@SuppressLint("SdCardPath")
public static void cleanSharedPreference(Context context) {
deleteFilesByDirectory(new File("/data/data/" + context.getPackageName() + "/shared_prefs"));
}
/**
* 按名字清除本应用数据库
*
* @param context
* @param dbName
*/
public static void cleanDatabaseByName(Context context, String dbName) {
context.deleteDatabase(dbName);
}
/**
* 清除/data/data/com.xxx.xxx/files下的内容
*/
public static void cleanFiles(Context context) {
deleteFilesByDirectory(context.getFilesDir());
}
/**
* 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache)
*/
public static void cleanExternalCache(Context context) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
deleteFilesByDirectory(context.getExternalCacheDir());
}
}
/**
* 清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除
*
* @param filePath
*/
public static void cleanCustomCache(String filePath) {
deleteFilesByDirectory(new File(filePath));
}
/**
* 清除本应用所有的数据
*
* @param context
* @param filepath
*/
public static void cleanApplicationData(Context context, String... filepath) {
cleanInternalCache(context);
cleanExternalCache(context);
cleanDatabases(context);
cleanSharedPreference(context);
cleanFiles(context);
if (filepath == null) {
return;
}
for (String filePath : filepath) {
cleanCustomCache(filePath);
}
}
/**
* 删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理
*
* @param directory
*/
private static void deleteFilesByDirectory(File directory) {
if (directory != null && directory.exists() && directory.isDirectory()) {
for (File item : directory.listFiles()) {
item.delete();
}
}
}
/**
* 获取文件的大小
*
* @param file
* @return
* @throws Exception
*/
public static long getFolderSize(File file) throws Exception {
long size = 0;
try {
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
// 如果下面还有文件
if (fileList[i].isDirectory()) {
size = size + getFolderSize(fileList[i]);
} else {
size = size + fileList[i].length();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return size;
}
/**
* 删除指定目录下文件及目录
*
* @param deleteThisPath
* @param filepath
* @return
*/
public static void deleteFolderFile(String filePath, boolean deleteThisPath) {
if (!TextUtils.isEmpty(filePath)) {
try {
File file = new File(filePath);
if (file.isDirectory()) {// 如果下面还有文件
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFolderFile(files[i].getAbsolutePath(), true);
}
}
if (deleteThisPath) {
if (!file.isDirectory()) {// 如果是文件,删除
file.delete();
} else {// 目录
if (file.listFiles().length == 0) {// 目录下没有文件或者目录,删除
file.delete();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 格式化单位
*
* @param size
* @return
*/
public static String getFormatSize(double size) {
double kiloByte = size / 1024;
if (kiloByte < 1) {
return size + "Byte";
}
double megaByte = kiloByte / 1024;
if (megaByte < 1) {
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
}
double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
}
double teraBytes = gigaByte / 1024;
if (teraBytes < 1) {
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
}
BigDecimal result4 = new BigDecimal(teraBytes);
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
}
}
最后
以上就是任性白开水为你收集整理的获取手机已经安装的所有App的信息的全部内容,希望文章能够帮你解决获取手机已经安装的所有App的信息所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复