2016-08-23 18 views
37

Tôi đang sử dụng PackageStats và in mã của PackageStats, cacheSize, dataSize, một số dữ liệu sẽ đến là âm.Android PackageStats cung cấp các giá trị âm

Một vài câu hỏi:

  • Làm thế nào có thể như vậy?
  • Các trường hợp khi codeSize có thể là số âm khi xem xét kích thước gói ứng dụng là khoảng 50MB?
  • Bất kỳ cách nào khác có thể được sử dụng một cách đáng tin cậy để trích xuất thông tin trên?

Ngoài ra, dành cho Android N nó mang lại cho tôi "NoSuchMethodException" Vì vậy,

  • Có xóa do Android N hoặc là có một số cách để sử dụng nó?
  • Bất kỳ giải pháp thay thế nào có thể giúp tôi tính toán các kích thước ở trên?

Code:

PackageManager packageManager = context.getPackageManager(); 
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId"); 
int userID = (Integer) myUserId.invoke(packageManager); 

Method getPackageSizeInfo = packageManager.getClass().getDeclaredMethod("getPackageSizeInfo", String.class, int.class, 
IPackageStatsObserver.class); 
getPackageSizeInfo.invoke(packageManager, context.getPackageName(), userID, new IPackageStatsObserver.Stub() { 

    @Override 
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { 
     long codeSize = pStats.codeSize/MB; //long MB = 1024*1024; 
     long cacheSize = pStats.cacheSize/MB; 
     long dataSize = pStats.dataSize/MB; 
     long appSize = codeSize + cacheSize + dataSize; 
    }; 
} 
+0

Bạn có thể thêm ví dụ mã bao gồm cách bạn hiển thị/kiểm tra giá trị cũng như bất kỳ phép tính nào được thực hiện trên giá trị đó không? – Zachary

+0

Ok. Tôi không thực hiện bất kỳ phép tính nào ngoại trừ 1 trong đó tôi chia giá trị cho 1024 * 1024 để nhận giá trị bằng MB. – thepace

Trả lời

0

chỉ cố gắng trên API 23/24 và chỉ có thể dụ nó.

các thuộc tính external* này có thể tham chiếu đến thẻ SD.

PackageStats stats = new PackageStats(context.getPackageName()); 
    long codeSize = stats.codeSize + stats.externalCodeSize; 
    long dataSize = stats.dataSize + stats.externalDataSize; 
    long cacheSize = stats.cacheSize + stats.externalCacheSize; 
    long appSize = codeSize + dataSize + cacheSize; 
+0

Tôi đồng ý với bạn. Một cách khác là nếu nó vượt quá dài có thể. Ý bạn là gì? – thepace

+0

@thepace với "chỉ dụ", nghĩa là từ khoá 'mới' - không có' invoke() 'và' onGetStatsCompleted() '. giá trị tiêu cực về cơ bản chỉ có thể với số nguyên đã ký, vì vậy tối đa có thể không là 4294967295, nhưng 2147483647 (trong khi -2147483647 có thể chỉ báo lỗi hoặc giá trị vắng mặt) ... trong khi đó thực sự quan trọng người dùng nào chạy mã, vì có bộ nhớ ứng dụng, người dùng riêng tư và người dùng dùng chung - và khu vực người dùng-riêng tư có thể khác nhau về kích thước. –

+0

bạn có thể chia sẻ lệnh chính xác để nhận được kích thước (như bạn đã đề xuất với onGetStatsCompleted không cần thiết) – thepace

Các vấn đề liên quan