2011-09-10 44 views
17

Desidero ottenere la dimensione RAM completa di un dispositivo. memoryInfo.getTotalPss() restituisce 0. Non c'è funzione per ottenere la dimensione totale della RAM in ActivityManager.MemoryInfo.Come ottenere la dimensione totale della RAM di un dispositivo?

Come fare questo?

+1

'public static synchronized int readTotalRam() { \t \t int tm = 1000; \t try { \t RandomAccessFile reader = new RandomAccessFile ("/ proc/meminfo", "r"); \t String load = reader.readLine(); \t Stringa [] totrm = load.split ("kB"); \t Stringa [] trm = totrm [0] .split (""); \t tm = Integer.parseInt (trm [trm.length-1]); \t tm = Math.round (tm/1024); \t} catch (IOException ex) { \t ex.printStackTrace(); \t} \t ritorno tm; \t} ' – BOOMik

+1

Scrivo la funzione per questo. ^^^ answer ^^^ – BOOMik

risposta

19

comando UNIX standard: $ cat /proc/meminfo

Nota che /proc/meminfo è un file. In realtà non è necessario eseguire cat, è sufficiente leggere il file.

+0

I reed/proc/meminfo file e dimensione della RAM ricevuta. – BOOMik

+0

Ripristinato alla versione dell'autore originale di questa risposta. Mentre Leon pubblica qualcosa che funziona nei successivi livelli API, ciò non significa che questo metodo non funzioni più. Le modifiche di terze parti non devono essere utilizzate per commentare una risposta: questo è il ruolo dei commenti o, in questo caso, la risposta di Leon. –

+0

Inoltre, aggiungerò che dal codice in esecuzione sul dispositivo, non vi è alcun motivo per eseguire un processo 'cat', ma semplicemente leggere'/proc/meminfo' dal codice java o nativo come se fosse un file di testo . Cat sarebbe necessario solo se si stesse lavorando in una shell, o accedendo a qualcosa che richiedesse l'avvio di un processo con un ID utente diverso con un 'su' violato. –

25

A partire dal livello 16 dell'API ora è possibile utilizzare la proprietà totalMem della classe MemoryInfo.

Così:

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

livello Api 15 ed inferiore ancora richiede di utilizzare il comando unix come mostrato in cweiske's answer.

15

posso ottenere la memoria RAM utilizzabile in modo tale

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

Testato Fino Android 4.3: SAMSUNG S3

2

È possibile ottenere la dimensione totale di RAM utilizzando questo codice:

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

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

Se il dispositivo ha 1 GB di RAM, totalRam sarà 1000.

+0

Il codice e i metodi della sintassi non sono validi in java. Il tuo codice è in C# e xamarin? – amin

+0

Sì, l'ho postato solo per avere una base. –

Problemi correlati