Java 无法将IPackageStatsObserver解析为类型(Android)

Java 无法将IPackageStatsObserver解析为类型(Android),java,android,sdk,Java,Android,Sdk,我想计算使用该设备的所有缓存的总和。为此,我得到一个编译时间错误: IPackageStatsObserver cannot be resolved to a type 我在代码中已两次提到此错误: public long totalCacheSize(){ totalSize=0; PackageManager packageManager = getApplicationContext().getPackageManager(); /* List<Pac

我想计算使用该设备的所有缓存的总和。为此,我得到一个编译时间错误:

IPackageStatsObserver cannot be resolved to a type
我在代码中已两次提到此错误:

public long totalCacheSize(){
    totalSize=0;

    PackageManager packageManager = getApplicationContext().getPackageManager();

     /* List<PackageInfo> packs = packageManager
      .getInstalledPackages(PackageManager.GET_ACTIVITIES);*/
     // PackageManager.GET_META_DATA

    List<PackageInfo> packs = packageManager
            .getInstalledPackages(PackageManager.GET_META_DATA);

    for (int i = 0; i < packs.size(); i++) {

        PackageInfo p = packs.get(i);

        Method getPackageSizeInfo;
        try {
            getPackageSizeInfo = packageManager.getClass()
                    .getMethod("getPackageSizeInfo",
                        String.class, Class.forName("android.content.pm.IPackageStatsObserver"));

            getPackageSizeInfo.invoke(packageManager, p.packageName,
                    new IPackageStatsObserver.Stub() { //error

                        public void onGetStatsCompleted(
                                PackageStats pStats, boolean succeeded)
                                throws RemoteException {

                            totalSize = totalSize + pStats.cacheSize;
                            Log.d("size", totalSize+"");
                            Toast.makeText(getApplicationContext(), "size"+totalSize, Toast.LENGTH_SHORT).show();
                        }
                    }
            );

        } catch (Exception e) {
            try {
                getPackageSizeInfo = packageManager.getClass()
                        .getMethod("getPackageSizeInfo",
                            String.class, Class.forName("android.content.pm.IPackageStatsObserver"));

                getPackageSizeInfo.invoke(packageManager, p.packageName,
                        new IPackageStatsObserver.Stub() { //error

                            public void onGetStatsCompleted(
                                    PackageStats pStats, boolean succeeded)
                                    throws RemoteException {

                                totalSize = totalSize + pStats.cacheSize;
                                Log.d("size", totalSize+"");
                                Toast.makeText(getApplicationContext(), "size"+totalSize, Toast.LENGTH_SHORT).show();
                            }
                        }
                );
            } catch (Exception ee) {
                Log.d("eeeeeeeeeee", "error");
                ee.printStackTrace();
            } 
        } 
    }

    Log.d("return size", totalSize+"");
    Toast.makeText(getApplicationContext(), "return size"+totalSize, Toast.LENGTH_SHORT).show();
    return totalSize;
}
public long totalCacheSize(){
totalSize=0;
PackageManager PackageManager=getApplicationContext().getPackageManager();
/*列表包=packageManager
.getInstalledPackages(PackageManager.GET_活动)*/
//PackageManager.GET_元数据
列表包=packageManager
.getInstalledPackages(PackageManager.GET_元数据);
对于(int i=0;i
IPackageStatsObserver
在android SDK中不可用。可能使用
class.forName()
加载存根类,查找默认构造函数并调用它以获取
存根的新实例。但是我该怎么编码呢,我对它一无所知


救命

您需要在项目中添加和。

要解决问题,请执行以下步骤:

Android Studio

  • 右键单击您的项目新建>文件夹>AIDL文件夹
  • Finish
  • 右键单击
    aidl
    folderNew>Package
  • 插入android.content.pm
并按OK
  • 下载
  • 将aidl文件复制到
    android.content.pm
    包中
  • 构建>重建项目
  • Eclipse

    • 右键单击
      src
      folderNew>Package
    • 插入
      android.content.pm
    • Finish
    • 下载
    • 将aidl文件复制到
      android.content.pm
      包中
    • 选择
      totalCacheSize
      所在的类,然后选择Source>organizeimports

    更新

    在Android O(API级别26)中,您不能对reflaction使用
    getPackageSizeInfo
    方法。以下帖子包含一段代码,可帮助您处理api级别26以下和以上的应用程序:

    遵循以下步骤

    app > src > main >java > 
    
    在此路径中创建三个文件夹

    create folder =  "android"> "content" > "pm"
    
    在pm文件夹中粘贴此文件以检索所有系统缓存

    IPackageDataObserver.java

     package android.content.pm;
    
    import android.os.Binder;
    import android.os.IBinder;
    import android.os.IInterface;
    import android.os.Parcel;
    import android.os.RemoteException;
    
    public interface IPackageDataObserver extends IInterface {
    
    public static abstract class Stub extends Binder implements IPackageDataObserver {
        private static final String DESCRIPTOR = "android.content.pm.IPackageDataObserver";
        static final int TRANSACTION_onRemoveCompleted = 1;
    
        private static class Proxy implements IPackageDataObserver {
            private IBinder mRemote;
    
            public String getInterfaceDescriptor() {
                return Stub.DESCRIPTOR;
            }
    
            Proxy(IBinder iBinder) {
                this.mRemote = iBinder;
            }
    
            public IBinder asBinder() {
                return this.mRemote;
            }
    
            public void onRemoveCompleted(String str, boolean z) throws RemoteException {
                Parcel obtain = Parcel.obtain();
                try {
                    obtain.writeInterfaceToken(Stub.DESCRIPTOR);
                    obtain.writeString(str);
                    obtain.writeInt(z ? 1 : 0);
                    this.mRemote.transact(1, obtain, null, 1);
                } finally {
                    obtain.recycle();
                }
            }
        }
    
        public IBinder asBinder() {
            return this;
        }
    
        public Stub() {
            attachInterface(this, DESCRIPTOR);
        }
    
        public static IPackageDataObserver asInterface(IBinder iBinder) {
            if (iBinder == null) {
                return null;
            }
            IInterface queryLocalInterface = iBinder.queryLocalInterface(DESCRIPTOR);
            if (queryLocalInterface == null || !(queryLocalInterface instanceof IPackageDataObserver)) {
                return new Proxy(iBinder);
            }
            return (IPackageDataObserver) queryLocalInterface;
        }
    
        public boolean onTransact(int i, Parcel parcel, Parcel parcel2, int i2) throws RemoteException {
            String str = DESCRIPTOR;
            if (i == 1) {
                parcel.enforceInterface(str);
                onRemoveCompleted(parcel.readString(), parcel.readInt() != 0);
                return true;
            } else if (i != 1598968902) {
                return super.onTransact(i, parcel, parcel2, i2);
            } else {
                parcel2.writeString(str);
                return true;
            }
        }
    }
    
    void onRemoveCompleted(String str, boolean z) throws RemoteException;
    }
    

    我尝试使用他们的代码getPackageSizeInfo.invoke(packageManager,“com.android.mms”,新的IPackageStatsObserver.Stub(){//error仍然是相同的错误