下面列出了android.content.pm.PackageStats#android.content.pm.IPackageStatsObserver 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
@UnsupportedAppUsage
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
final String msg = "Shame on you for calling the hidden API "
+ "getPackageSizeInfoAsUser(). Shame!";
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
throw new UnsupportedOperationException(msg);
} else if (observer != null) {
Log.d(TAG, msg);
try {
observer.onGetStatsCompleted(null, false);
} catch (RemoteException ignored) {
}
}
}
/**
* 获取应用大小8.0以下
*/
@SuppressWarnings("JavaReflectionMemberAccess")
private static void getAppSizeLowerO(Context context, @NonNull final OnGetSizeListener listener) {
try {
Method method = PackageManager.class.getMethod("getPackageSizeInfo", String.class,
IPackageStatsObserver.class);
// 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
method.invoke(context.getPackageManager(), context.getPackageName(), new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
AppSizeInfo ctAppSizeInfo = new AppSizeInfo();
ctAppSizeInfo.cacheSize = pStats.cacheSize;
ctAppSizeInfo.dataSize = pStats.dataSize;
ctAppSizeInfo.codeSize = pStats.codeSize;
listener.onGetSize(ctAppSizeInfo);
}
});
} catch (Throwable e) {
listener.onError(e);
}
}
@Override public void onCreate() {
try {
mGetPackageSizeInfoMethod = getPackageManager().getClass()
.getMethod(
"getPackageSizeInfo",
String.class,
IPackageStatsObserver.class);
mFreeStorageAndNotifyMethod = getPackageManager().getClass()
.getMethod(
"freeStorageAndNotify",
long.class,
IPackageDataObserver.class);
mDeleteApplicationCacheFiles = getPackageManager().getClass()
.getMethod(
"deleteApplicationCacheFiles",
String.class,
IPackageDataObserver.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
@Override
protected Void doInBackground(Void... params) {
mCallBack.onBegin();
if (isCancelled()) {
mCallBack.onCancel();
return null;
}
PackageManager pm = App.getAppContext().getPackageManager();
List<ApplicationInfo> installedPackages = pm.getInstalledApplications(PackageManager.GET_GIDS);
IPackageStatsObserver.Stub observer = new PackageStatsObserver();
mTotalCount = installedPackages.size();
mSysCaches = new ArrayList<>();
mAppNames = new HashMap<>();
for (int i = 0; i < mTotalCount; i++) {
ApplicationInfo info = installedPackages.get(i);
mAppNames.put(info.packageName, pm.getApplicationLabel(info).toString());
getPackageInfo(info.packageName, observer);
}
mIsOverTime = false;
return null;
}
@Override
protected Void doInBackground(Void... params) {
mCallback.onBegin();
PackageManager pm = MyApplication.getInstance().getPackageManager();
List<ApplicationInfo> installedPackages = pm.getInstalledApplications(PackageManager.GET_GIDS);
IPackageStatsObserver.Stub observer = new PackageStatsObserver();
mScanCount = 0;
mTotalCount = installedPackages.size();
mSysCaches = new ArrayList<>();
mAppNames = new HashMap<>();
for (int i = 0; i < mTotalCount; i++) {
ApplicationInfo info = installedPackages.get(i);
mAppNames.put(info.packageName, pm.getApplicationLabel(info).toString());
getPackageInfo(info.packageName, observer);
}
return null;
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
try {
mPM.getPackageSizeInfo(packageName, userHandle, observer);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
final String msg = "Shame on you for calling the hidden API "
+ "getPackageSizeInfoAsUser(). Shame!";
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
throw new UnsupportedOperationException(msg);
} else if (observer != null) {
Log.d(TAG, msg);
try {
observer.onGetStatsCompleted(null, false);
} catch (RemoteException ignored) {
}
}
}
@Override
public void getPackageSizeInfo(String packageName, int userHandle,
IPackageStatsObserver observer) {
try {
mPM.getPackageSizeInfo(packageName, userHandle, observer);
} catch (RemoteException e) {
// Should never happen!
}
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
final String msg = "Shame on you for calling the hidden API "
+ "getPackageSizeInfoAsUser(). Shame!";
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
throw new UnsupportedOperationException(msg);
} else if (observer != null) {
Log.d(TAG, msg);
try {
observer.onGetStatsCompleted(null, false);
} catch (RemoteException ignored) {
}
}
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
final String msg = "Shame on you for calling the hidden API "
+ "getPackageSizeInfoAsUser(). Shame!";
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
throw new UnsupportedOperationException(msg);
} else if (observer != null) {
Log.d(TAG, msg);
try {
observer.onGetStatsCompleted(null, false);
} catch (RemoteException ignored) {
}
}
}
@Override
public void getPackageSizeInfo(String packageName,
IPackageStatsObserver observer) {
try {
mPM.getPackageSizeInfo(packageName, observer);
} catch (RemoteException e) {
// Should never happen!
}
}
@Override
public void getPackageSizeInfo(String packageName, int userHandle,
IPackageStatsObserver observer) {
try {
mPM.getPackageSizeInfo(packageName, userHandle, observer);
} catch (RemoteException e) {
// Should never happen!
}
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
final String msg = "Shame on you for calling the hidden API "
+ "getPackageSizeInfoAsUser(). Shame!";
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
throw new UnsupportedOperationException(msg);
} else if (observer != null) {
Log.d(TAG, msg);
try {
observer.onGetStatsCompleted(null, false);
} catch (RemoteException ignored) {
}
}
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
try {
mPM.getPackageSizeInfo(packageName, userHandle, observer);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@Override
public void getPackageSizeInfoAsUser(String packageName, int userHandle,
IPackageStatsObserver observer) {
final String msg = "Shame on you for calling the hidden API "
+ "getPackageSizeInfoAsUser(). Shame!";
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
throw new UnsupportedOperationException(msg);
} else if (observer != null) {
Log.d(TAG, msg);
try {
observer.onGetStatsCompleted(null, false);
} catch (RemoteException ignored) {
}
}
}
private void getCaches() {
// scan
pm = getPackageManager();
List<PackageInfo> packages = pm.getInstalledPackages(0);
int max = packages.size();
int current = 0;
sb.delete(0, sb.length());
sb.append("");
sb.append("本机一共安装了:").append(max).append("个应用");
tvShowCaches.setText(sb.toString());
for (PackageInfo pinfo : packages) {
String packageName = pinfo.packageName;
try {
Method getPackageSizeInfo = PackageManager.class
.getDeclaredMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, packageName, new MyPackageStateObserver());
current++;
} catch (Exception e) {
current++;
e.printStackTrace();
}
}
//===到这里,数据准备完成
mHadler.postDelayed(new Runnable() {
@Override
public void run() {
btnClearAll.setVisibility(View.VISIBLE);
Toast.makeText(getApplicationContext(), "已读取全部缓存", Toast.LENGTH_SHORT).show();
sbCache.append(Formatter.formatFileSize(getApplicationContext(), cacheS)).append("\n");
tvShowCaches.setText(sb.toString());
tvAppCache.setText(sbCache.toString());
sbCache.delete(0, sbCache.length());
}
}, 1000);
//ok,所有应用程序信息显示完成
}
private void getCaches(){
// scan
pm = getPackageManager();
List<PackageInfo> packages = pm.getInstalledPackages(0);
int max = packages.size();
int current = 0;
sb.delete(0, sb.length());
sb.append("");
sb.append("本机一共安装了:" + max+"个应用");
tvShowCaches.setText(sb.toString());
for (PackageInfo pinfo : packages) {
String packageName = pinfo.packageName;
try {
Method getPackageSizeInfo = PackageManager.class
.getDeclaredMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, packageName, new MyPackageStateObserver());
current++;
} catch (Exception e) {
current++;
e.printStackTrace();
}
}
//===到这里,数据准备完成
mHadler.postDelayed(new Runnable() {
@Override
public void run() {
btnClearAll.setVisibility(View.VISIBLE);
Toast.makeText(getApplicationContext(),"已读取全部缓存",Toast.LENGTH_SHORT).show();
sbCache.append(Formatter.formatFileSize(getApplicationContext(),cacheS)+"\n");
tvShowCaches.setText(sb.toString());
tvAppCache.setText(sbCache.toString());
sbCache.delete(0,sbCache.length());
}
}, 1000);
//ok,所有应用程序信息显示完成
}
private void getAppSize() {
boolean flag = false;
try {
PackageManager.class.getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
flag = true;
} catch (NoSuchMethodException e) {
try {
PackageManager.class.getMethod("getPackageSizeInfo", String.class, int.class, IPackageStatsObserver.class);
flag = true;
} catch (NoSuchMethodException ee) {
flag = false;
}
}
// Method[] methods = PackageManager.class.getMethods();
// for (Method m : methods) {
// if ("getPackageSizeInfo".equals(m.getName())) {
// Class<?>[] classes = m.getParameterTypes();
// if (classes.length == 2 || classes.length == 3) {
// flag = true;
// break;
// }
// }
// }
if (flag) {
useIPackageStatsObserver();
} else {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
getStorageWith_7_1();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getStorageWith_8();
}
}
}
@Override public void onCreate(Bundle savedInstanceState) {
//position = mContext.getArguments().getInt(ARG_POSITION);
try {
mGetPackageSizeInfoMethod = mContext.getPackageManager()
.getClass()
.getMethod("getPackageSizeInfo",
String.class,
IPackageStatsObserver.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//mTaskScanApps = new TaskScanApps();
//mAppsView.initViews(mAppsListAdapter,mContext,);
}
/**
* get app size by package name
* @param context
* @param packageName package name
* @param listener it will be call when success to get size
*/
public static void getAppSize(Context context, String packageName, final AppSizeInfoListener listener) {
// check argument
if(null == listener) {
throw new NullPointerException("listener can't be null");
}
if(TextUtils.isEmpty(packageName)) {
throw new IllegalArgumentException("packageName can't be empty");
}
// get pm
PackageManager pm = context.getPackageManager();
Method getPackageSizeInfo = null;
try {
// get method getPackageSizeInfo
getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo",
String.class, IPackageStatsObserver.class);
// call method
getPackageSizeInfo.invoke(pm, packageName,
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
// call listener
listener.onGetSizeInfoCompleted(
new AppSizeInfo(pStats.cacheSize, pStats.dataSize, pStats.codeSize));
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCreate() {
try {
mGetPackageSizeInfoMethod = getPackageManager().getClass().getMethod(
"getPackageSizeInfo", String.class, IPackageStatsObserver.class);
mFreeStorageAndNotifyMethod = getPackageManager().getClass().getMethod(
"freeStorageAndNotify", long.class, IPackageDataObserver.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
/** @hide */
@Override public void getPackageSizeInfoAsUser(String packageName, int userId, IPackageStatsObserver observer) {
mBase.getPackageSizeInfoAsUser(packageName, userId, observer);
}
/** @hide */
@Override public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
mBase.getPackageSizeInfo(packageName, observer);
}
/** @hide */
@Override public void getPackageSizeInfoAsUser(String packageName, int userId, IPackageStatsObserver observer) {
mBase.getPackageSizeInfoAsUser(packageName, userId, observer);
}
/** @hide */
@Override public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
mBase.getPackageSizeInfo(packageName, observer);
}
@Override
protected List<AppsListItem> doInBackground(Void... params) {
mCacheSize = 0;
final List<ApplicationInfo> packages = getPackageManager().getInstalledApplications(
PackageManager.GET_META_DATA);
publishProgress(0, packages.size());
final CountDownLatch countDownLatch = new CountDownLatch(packages.size());
final List<AppsListItem> apps = new ArrayList<>();
try {
for (ApplicationInfo pkg : packages) {
mGetPackageSizeInfoMethod.invoke(getPackageManager(), pkg.packageName,
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats,
boolean succeeded)
throws RemoteException {
synchronized (apps) {
publishProgress(++mAppCount, packages.size());
mCacheSize += addPackage(apps, pStats, succeeded);
}
synchronized (countDownLatch) {
countDownLatch.countDown();
}
}
}
);
}
countDownLatch.await();
} catch (InvocationTargetException | InterruptedException | IllegalAccessException e) {
e.printStackTrace();
}
return new ArrayList<>(apps);
}