IPackageStatsObserver无法解析为某个类型(Android)

时间:2015-03-01 08:15:29

标签: java android sdk

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

IPackageStatsObserver cannot be resolved to a type

我在代码中提到过2次错误:

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;
}
Android SDK中没有

IPackageStatsObserver。也许使用Class.forName()加载Stub类,找到默认构造函数并调用它以获取Stub的新实例。但是我该怎么编码呢,我对它一无所知!

帮助!!

4 个答案:

答案 0 :(得分:14)

要解决您的问题,请按以下步骤操作:

Android Studio

  • 右键点击您的项目新&gt;文件夹&gt; AIDL文件夹
  • 完成
  • 右键点击aidl文件夹新建&gt;封装
  • 插入android.content.pm并按确定
  • 下载IPackageStatsObserver.aidl
  • 将aidl文件复制到android.content.pm
  • 构建&gt;重建项目

<强>的Eclipse

  • 右键点击src文件夹新建&gt;封装
  • 插入android.content.pm
  • 完成
  • 下载IPackageStatsObserver.aidl
  • 将aidl文件复制到android.content.pm
  • 选择totalCacheSize所在的班级来源&gt;组织进口

答案 1 :(得分:1)

您需要在项目中添加IPackageStatsObserver.aidlPackageStats.aidl

答案 2 :(得分:0)

已更新

从Android O(API级别26)开始,您不能使用getPackageSizeInfo方法进行反思。以下帖子包括一个可以帮助您解决api级别26以上的应用程序的代码:

https://stackoverflow.com/a/56616172/1939409

答案 3 :(得分:0)

按照下面的步骤

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;
}