찾다

 >  Q&A  >  본문

android - PackageManager反射方法时,报 java.lang.NoSuchMethodException:错误?

天蓬老师天蓬老师2772일 전787

모든 응답(2)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-17 16:46:32

    在Android4.2以上版本中,PackageManager.getPackageSizeInfo(String packageName, IPackageStatsObserver observer)不可用,改为PackageManager.getPackageSizeInfo(String packageName, int userHandle, IPackageStatsObserver observer), 至于增加的参数userHandle的解释是:The user whose size information should be retrieved。下面是PackageManager内部的用法:

    public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {  
        getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);  
    } 

    最后更改为:

    private void getPacakgeStats(String pkgName) {  
        if (pkgName != null) {  
            try {  
                Method getPackageSizeInfo = mPm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,  
                        int.class, IPackageStatsObserver.class);  
                /** 
                 * after invoking, PkgSizeObserver.onGetStatsCompleted() will be called as callback function. <br> 
                 * About the third parameter ‘Process.myUid() / 100000’,please check: 
                 * <android_source>/frameworks/base/core/java/android/content/pm/PackageManager.java: 
                 * getPackageSizeInfo(packageName, UserHandle.myUserId(), observer); 
                 */  
                getPackageSizeInfo.invoke(mPm, pkgName, Process.myUid() / 100000, new PkgSizeObserver());  
            } catch (Exception e) {  
                Log.e(TAG, e.toString());  
            }  
        }  
    }  

    测试后,可用。
    通过查阅资料,其中Process.myUid() / 100000的解释为:

    表示多用户中的某一个用户,因为一个用户装的apk可以有100000个,用uid表示,uid/100000的商就是某个特定的用户id也叫userId或者userHandle。

    如有不对之处,欢迎大家讨论。

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 16:46:32

    IPackageStatsObserver.class你这个是怎么得到的

    회신하다
    0
  • 취소회신하다