137 lines
4.7 KiB
Java
137 lines
4.7 KiB
Java
package com.info.sn.utils;
|
|
|
|
|
|
import android.content.Context;
|
|
import android.content.pm.IPackageDataObserver;
|
|
import android.content.pm.IPackageManager;
|
|
import android.content.pm.IPackageStatsObserver;
|
|
import android.content.pm.PackageManager;
|
|
import android.content.pm.PackageStats;
|
|
import android.os.RemoteException;
|
|
import android.os.ServiceManager;
|
|
import android.util.Log;
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
public class CacheUtils {
|
|
|
|
private static final String TAG = CacheUtils.class.getSimpleName();
|
|
private final long MAX_WAIT_TIME = 60 * 1000;
|
|
private final long WAIT_TIME_INCR = 10 * 1000;
|
|
|
|
/**
|
|
* 获取应用数据大小 cache + data
|
|
*
|
|
* @param context
|
|
* @param packageName
|
|
* @return
|
|
* @throws Exception
|
|
*/
|
|
|
|
public long getApplicationCache(Context context, String packageName) throws Exception {
|
|
try {
|
|
PackageStatsObserver observer = new PackageStatsObserver();
|
|
// wait on observer
|
|
synchronized (observer) {
|
|
Method method = PackageManager.class.getMethod("getPackageSizeInfo", new Class[] { String.class, IPackageStatsObserver.class });
|
|
method.invoke(context.getPackageManager(), packageName, observer);
|
|
// getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
|
|
long waitTime = 0;
|
|
while ((!observer.isDone()) || (waitTime > MAX_WAIT_TIME)) {
|
|
observer.wait(WAIT_TIME_INCR);
|
|
waitTime += WAIT_TIME_INCR;
|
|
}
|
|
if (!observer.isDone()) {
|
|
throw new Exception("Timed out waiting for PackageStatsObserver.onGetStatsCompleted");
|
|
}
|
|
}
|
|
Log.d(TAG, "toString " + observer.stats.toString());
|
|
return observer.stats.dataSize + observer.stats.cacheSize;
|
|
} catch (RemoteException e) {
|
|
Log.w(TAG, "Failed to get handle for PackageManger Exception: " + e);
|
|
return -1;
|
|
} catch (InterruptedException e) {
|
|
Log.w(TAG, "InterruptedException :" + e);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除应用数据
|
|
*
|
|
* @param context
|
|
* @param packageName
|
|
* @return
|
|
* @throws Exception
|
|
*/
|
|
public boolean cleanApplicationUserData(Context context, String packageName) throws Exception {
|
|
try {
|
|
PackageDataObserver observer = new PackageDataObserver();
|
|
// wait on observer
|
|
synchronized (observer) {
|
|
Method method = PackageManager.class.getMethod("clearApplicationUserData", new Class[] { String.class, IPackageDataObserver.class });
|
|
method.invoke(context.getPackageManager(), packageName, observer);
|
|
// getPm().deleteApplicationCacheFiles(appid, observer);
|
|
long waitTime = 0;
|
|
while (!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
|
|
observer.wait(WAIT_TIME_INCR);
|
|
waitTime += WAIT_TIME_INCR;
|
|
}
|
|
if (!observer.isDone()) {
|
|
throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
|
|
}
|
|
}
|
|
Log.d(TAG, "cleanApplicationCache " + observer.retValue);
|
|
return observer.retValue;
|
|
} catch (RemoteException e) {
|
|
Log.w(TAG, "Failed to get handle for PackageManger Exception: " + e);
|
|
return false;
|
|
} catch (InterruptedException e) {
|
|
Log.w(TAG, "InterruptedException :" + e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private IPackageManager getPm() {
|
|
return IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
|
|
}
|
|
|
|
class PackageDataObserver extends IPackageDataObserver.Stub {
|
|
public boolean retValue = false;
|
|
private boolean doneFlag = false;
|
|
|
|
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
|
|
synchronized (this) {
|
|
retValue = succeeded;
|
|
doneFlag = true;
|
|
notifyAll();
|
|
}
|
|
}
|
|
|
|
public boolean isDone() {
|
|
return doneFlag;
|
|
}
|
|
}
|
|
|
|
class PackageStatsObserver extends IPackageStatsObserver.Stub {
|
|
public boolean retValue = false;
|
|
public PackageStats stats;
|
|
private boolean doneFlag = false;
|
|
|
|
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
|
|
synchronized (this) {
|
|
retValue = succeeded;
|
|
stats = pStats;
|
|
doneFlag = true;
|
|
notifyAll();
|
|
}
|
|
}
|
|
|
|
public boolean isDone() {
|
|
return doneFlag;
|
|
}
|
|
}
|
|
|
|
}
|
|
|