2011-09-10 25 views
17

Tôi muốn nhận được kích thước RAM đầy đủ của một thiết bị. memoryInfo.getTotalPss() trả về 0. Không có chức năng để nhận tổng kích thước RAM trong ActivityManager.MemoryInfo.Làm cách nào để nhận được tổng dung lượng RAM của một thiết bị?

Cách thực hiện việc này?

+1

'đồng bộ hóa tĩnh công cộng int readTotalRam() { \t \t int tm = 1000; \t thử { \t RandomAccessFile reader = new RandomAccessFile ("/ proc/meminfo", "r"); \t Chuỗi tải = reader.readLine(); \t Chuỗi [] totrm = load.split ("kB"); \t Chuỗi [] trm = totrm [0] .split (""); \t tm = Integer.parseInt (trm [trm.length-1]); \t tm = Math.round (tm/1024); \t} bắt (IOException ex) { \t ex.printStackTrace(); \t} \t return tm; \t} ' – BOOMik

+1

Tôi viết chức năng này. ^^^ answer ^^^ – BOOMik

Trả lời

19

Chuẩn unix lệnh: $ cat /proc/meminfo

Lưu ý rằng /proc/meminfo là một tập tin. Bạn không thực sự phải chạy cat, bạn có thể chỉ cần đọc tệp.

+0

Tôi đã lấy lại/proc/tập tin meminfo và nhận được kích thước ram. – BOOMik

+0

Được quay trở lại phiên bản gốc của tác giả của câu trả lời này. Trong khi Leon đăng nội dung nào đó hoạt động ở các cấp API sau, điều đó không có nghĩa là phương pháp này không còn hoạt động nữa. Không nên sử dụng chỉnh sửa của bên thứ ba để nhận xét về câu trả lời - đó là vai trò của nhận xét hoặc trong trường hợp này là câu trả lời của Leon. –

+0

Ngoài ra, tôi sẽ thêm từ mã chạy trên thiết bị, không có lý do để chạy một quá trình 'cat' - thay vào đó, chỉ cần đọc'/proc/meminfo' từ mã java hoặc native của bạn như thể nó là một tệp văn bản . Cát sẽ chỉ cần thiết nếu bạn đang làm việc trong một hệ vỏ, hoặc truy cập vào thứ gì đó yêu cầu bạn bắt đầu một tiến trình theo một userid khác với một 'su' bị hack. –

25

Kể từ cấp API 16, giờ đây bạn có thể sử dụng thuộc tính totalMem của lớp MemoryInfo.

Như thế này:

ActivityManager actManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); 
actManager.getMemoryInfo(memInfo); 
long totalMemory = memInfo.totalMem; 

Api mức 15 và thấp hơn vẫn đòi hỏi phải sử dụng lệnh unix như trong cweiske's answer.

15

tôi có thể nhận được bộ nhớ RAM có thể sử dụng theo cách như vậy

public String getTotalRAM() { 

    RandomAccessFile reader = null; 
    String load = null; 
    DecimalFormat twoDecimalForm = new DecimalFormat("#.##"); 
    double totRam = 0; 
    String lastValue = ""; 
    try { 
     reader = new RandomAccessFile("/proc/meminfo", "r"); 
     load = reader.readLine(); 

     // Get the Number value from the string 
     Pattern p = Pattern.compile("(\\d+)"); 
     Matcher m = p.matcher(load); 
     String value = ""; 
     while (m.find()) { 
      value = m.group(1); 
      // System.out.println("Ram : " + value); 
     } 
     reader.close(); 

     totRam = Double.parseDouble(value); 
     // totRam = totRam/1024; 

     double mb = totRam/1024.0; 
     double gb = totRam/1048576.0; 
     double tb = totRam/1073741824.0; 

     if (tb > 1) { 
      lastValue = twoDecimalForm.format(tb).concat(" TB"); 
     } else if (gb > 1) { 
      lastValue = twoDecimalForm.format(gb).concat(" GB"); 
     } else if (mb > 1) { 
      lastValue = twoDecimalForm.format(mb).concat(" MB"); 
     } else { 
      lastValue = twoDecimalForm.format(totRam).concat(" KB"); 
     } 



    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     // Streams.close(reader); 
    } 

    return lastValue; 
} 

Tested Upto Android 4.3: SAMSUNG S3

2

Bạn có thể lấy tổng dung lượng RAM bằng cách sử dụng mã này:

var activityManager = GetSystemService(Activity.ActivityService) as ActivityManager; 
var memoryInfo = new ActivityManager.MemoryInfo(); 
activityManager.GetMemoryInfo(memoryInfo); 

var totalRam = memoryInfo.TotalMem/(1024 * 1024);

Nếu thiết bị có RAM 1 GB, totalRam sẽ là 1000.

+0

Mã cú pháp và phương pháp của bạn không phải là dòng trong java. Mã của bạn có trong C# và xamarin không? – amin

+0

Có, tôi đã đăng nó chỉ để có cơ sở. –

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