1. 程式人生 > >Android 獲取手機儲存資訊詳解(記憶體,外存等)

Android 獲取手機儲存資訊詳解(記憶體,外存等)

        android  獲取手機儲存資訊詳解(記憶體,外存等)         android不像ios,android可以外接Sd卡,並且也會有內接的儲存卡,此次專門研究下如何獲取android的儲存資訊。 一、RAM記憶體         RAM,也就是我們常說的手機記憶體。最早的記憶體大小才80M,而現在一般記憶體大小已經達到1G,近年來2G記憶體已經成為主流,也有一些手機是3.5G與4G、8G等大小。一般來說記憶體越大,執行起來更流程,起碼我自己的手機才1G==早就想換個大點的了………言歸正傳,此時我們來獲取android的記憶體大小。         在android手機中,存在檔案路徑"/proc/meminfo“ 此為系統記憶體資訊檔案,第一行就是記憶體大小
        我們可以通過adb工具連結手機,開啟除錯模式,之後採用命令”adb pull /proc/meminfo "將其匯出,用文字格式開啟裡面內容。         所有可以通過該方式獲取總記憶體(關鍵程式碼):
 final String mem_path = "/proc/meminfo";// 系統記憶體資訊檔案,第一行為記憶體大小
        Reader reader = null;
        BufferedReader bufferedReader = null;
        
        reader = new FileReader(mem_path);
        bufferedReader = new BufferedReader(reader, 8192);
        long totalRAMSize = Long.parseLong(bufferedReader.readLine().split("\\s+")[1]) * 1024L;//這裡*1024是轉換為單位B(位元組)

        而獲取記憶體可用大小有兩種方式,一是和上面一個有個MemFree的引數,顯示可用大小……而另一種方式則是直接使用android自帶的類,獲取當前的可用記憶體大小。        第一種方式和獲取總記憶體大小一樣,我就不寫了,第二種方式(關鍵程式碼):
 <span style="white-space:pre">	</span>ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); //該介面可用獲取很多裝置資訊,這裡就不詳敘了==
        ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(memInfo);
        long  availRAMsize = memInfo.availMem;

        至此,我們已經獲取到了手機記憶體總大小與可用記憶體大小 二、ROM內部儲存        ROM,RAM ==之前一直傻傻分不清楚。後來稍加記憶,ROM裡面的‘o’就是only 的意思,我就是理解為僅僅作為儲存所用,所以是內部儲存而不是記憶體==當然換個通俗易懂的方式,如果手機和電腦來比較的話,手機記憶體RAM,就是電腦的記憶體;手機內部儲存ROM就是電腦的C盤,而手機的SD卡內建儲存卡就對應電腦的D/E/F……盤          再次迴歸主題,要獲取內部儲存資訊大小,可以通過android自帶的類StatFs獲取磁碟的資訊。
 <span style="white-space:pre">	</span>final StatFs statFs = new StatFs(Environment.getDataDirectory().getPath());//呼叫該類來獲取磁碟資訊(而getDataDirectory就是內部儲存)
        long tcounts = statFs.getBlockCount();//總共的block數
        long counts = statFs.getAvailableBlocks() ; //獲取可用的block數
        long size = statFs.getBlockSize(); //每格所佔的大小,一般是4KB==
        long availROMSize = counts * size;//可用內部儲存大小
        long totalROMSize = tcounts *size; //內部儲存總大小

       上面方法原理顯而易見了==我就懶得說了……下面的才是重頭戲 三、外接儲存資訊        所謂舉一反三,上面獲取ROM內部儲存資訊的時候,已經用到了獲取磁碟資訊類StatFs,當然儲存卡都算是磁碟的一種啦,我不信android裡面設定這個類沒有考慮到外接儲存卡!         果然,同意可以通過StatFs方式獲取:         
        final StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath());//呼叫該類來獲取磁碟資訊(而getExternalStorageDirectory就是外接儲存)
        long tcounts = statFs.getBlockCount();//總共的block數
        long counts = statFs.getAvailableBlocks() ; //獲取可用的block數
        long size = statFs.getBlockSize(); //每格所佔的大小,一般是4KB==
        long availROMSize = counts * size;//可用內部儲存大小
        long totalROMSize = tcounts *size; //內部儲存總大小

        ……是的,我是無恥的複製貼上了ROM裡面的==|||         當然修改一個磁碟地址getExternalStorageDirectory(看命名就知道了--一個是getDataDirectory,內部儲存,一個是getExternalStorageDirectory,額外的儲存目錄……)         當初以為到這裡,大功告成…………然而,我還是太年輕         寫好程式碼之後,用自己爛爛的VIVO進行測試,插的是8G的卡發現,沒有任何問題,再找了一臺機器測試,16G的卡發現,顯示的是4G……看清楚--是4G。。。。         ……MADAN。。。這是什麼東西,我手機儲存卡明明是16G,結果顯示4G……         繼續探究,觀察原始碼列印Environment.getExternalStorageDirectory().getPath()地址,發現出來的是scard0,--自己看手機的儲存卡地址,scard1,,,原來 android的官方文件上說,採用Enviroment.getExternalStorageDirectory()方法可以得到android裝置的外接儲存(即外插SDCARD),如果android裝置有外插SDCARD的話就返回外插SDCARD的根目錄路徑,如果android裝置沒有外插SDCARD的話就返回android裝置的內建SDCARD的路徑。這套方案很快就被否決了,因為Enviroment類的這個方法裡面的路徑也是寫死的,只有原生的android系統才使用這套方案,被更改過的anroid體統很多裝置的路徑都改了。        除此之外,呼叫Environment.getExternalStorageDirectory(),返回的儲存目錄並不是系統內建的SD卡目錄。
1.一部分手機將eMMC儲存掛載到 /mnt/external_sd 、/mnt/sdcard2 等節點,而將外接的SD卡掛載到Environment.getExternalStorageDirectory()這個結點。
此時,呼叫Environment.getExternalStorageDirectory(),則返回外接的SD的路徑。
2.而另一部分手機直接將eMMC儲存掛載在Environment.getExternalStorageDirectory()這個節點,而將真正的外接SD卡掛載到/mnt/external_sd、/mnt/sdcard2 等節點。
         …………………………這樣這個方法就不科學了啊…………好在,還是有其他方法,通過讀取system/etc/vold.fstab檔案的內容來獲取儲存裝置路徑

相關推薦

Android 獲取手機儲存資訊記憶體外存

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); //系統記憶體資訊 ActivityManager.MemoryInfo memInfo = new ActivityManager

Android 獲取手機儲存資訊記憶體外存

        android  獲取手機儲存資訊詳解(記憶體,外存等)         android不像ios,android可以外接Sd卡,並且也會有內接的儲存卡,此次專門研究下如何獲取android的儲存資訊。 一、RAM記憶體         RAM,也就是我們常說的手機記憶體。最早的記憶體大小

Android熱修復技術原理最新最全版本

總結 核心 桌面圖標 實時 開源 穩定性 安卓 定義 check 本文框架 什麽是熱修復? 熱修復框架分類 技術原理及特點 Tinker框架解析 各框架對比圖 總結 ??通過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各類框架的優缺點以及技術原理,文章末尾簡單描述

mybatis的insert插入後獲取自增id從controller到mapper

需求說明:當執行插入操作的時候,其中資料包含兩個模組,分別存放在兩種資料庫表中,拿表A,表B來說。 表A為基本資訊表,其中插入時候有自增id,也就是每新增一條資料後下一個id都會自動加1。 表B為詳情表,其中有個欄位為A_id與A表中的id是一樣的,也就是他們的關聯欄位。 那麼問

Android OTA升級包製作指令碼引數解析

寫在前面:     “build/tools/releasetools/ota_from_target_files  -u lk.bin  -n target.zip update.zip”這是製作整包的命令,很顯然這裡支援lk升級。本系列博文主要對該命令的執行流程及原理進

微信Android熱更新Tinker使用by 星空武哥

Tinker是什麼 Tinker是微信官方的Android熱補丁解決方案,它支援動態下發程式碼、So庫以及資源,讓應用能夠在不需要重新安裝的情況下實現更新。當然,你也可以使用Tinker來更新你的外掛。 它主要包括以下幾個部分: gradle編譯外掛: tinker

Java 原子操作類AtomicInteger、AtomicIntegerArray

當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變數i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全的更新操作,通常我們會使

最新最詳細最簡潔Eclipse除錯PHP配置XdebugZend Debugger

轉自:http://lspvic.tk/2011/05/27/php-debug-config-in-eclipse-zend-xdebug/ 搬家注:該日誌寫於2011 年 04 月 07 日,Eclipse,PHP等版本號很多,更新也比較快,請注意文章中的版本。本文

JDK 原子操作類AtomicInteger、AtomicIntegerArray

當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變數i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全的更新操作,通常我們會使用

sensor 轉載用以記錄

mHandler = new Handler(looper) { @Override public void handleMessage(Message msg) { final Sen

Android獲取手機基站資訊並進行基站定位基站定位原理

http://blog.csdn.net/mad1989/article/details/9970431 一,首先普及一下手機基站資訊中相關的專業詞彙:  通過TelephonyManager 獲取lac:mcc:mnc:cell-id(基站資訊)的解釋: MCC,M

curl -l的資訊這樣還看不懂就沒天理了

[[email protected] ~]# curl -I "http://www.baidu.com" HTTP/1.1 200 OK Accept-Ranges: bytes Cache-Control: private, no-cache, no-store, proxy-reva

elasticsearch 索引儲存深入Elasticsearch教程03|MVP講堂

作者:阿里雲MVP 銘毅 往期內容:死磕 Elasticsearch 方法論:普通程式設計師高效精進的 10 大狠招!Elasticsearch學習,請先看這一篇!(Elasticsearch教程01)Elasticsearch增、刪、改、查操作深入詳解(Elasticsearch教程02) 1、關於ES

Android 獲取手機儲存總大小系統佔用空間

一、Android 儲存介紹及通常查詢大小 手機儲存有兩種,內建記憶體和外接記憶體(SD),目前可擴充套件記憶體的機型正在減少,大部分是內建儲存的手機,內建128G、256G已經很常見,但如果有擴充套件功能的話,買個乞丐版+SD卡也是美滋滋,畢竟廠家增加儲存空間後手機定價也不便宜。言

android-獲取手機小區資訊介面設計

1. manifests <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package

Android自定義主題樣式結合自定義title欄講解

此篇部落格將總結主題樣式的自定義並且結合例項自定義title欄進行講解。為了方便閱讀,在此先寫明文章結構: 1.對android主題樣式的理解 (簡略結合系統自帶樣式的講解) 2.如何自定義主題樣式 (主要,有例子) 3.如何自定義titl

python爬蟲之requests庫如何通過requests來獲得頁面資訊

前言: 爬蟲的基礎是與網頁建立聯絡,而我們可以通過get和post兩種方式來建立連線,而我們可以通過引入urllib庫[在python3的環境下匯入的是urllib;而python2的環境下是urllib和urllib2]或者requests庫來實現,從程式的複雜度和可讀性

Android 4.4 Graphic系統2 VSYNC的生成

VSYNC 的概念 VSYNC(Vertical Synchronization)是一個相當古老的概念,對於遊戲玩家,它有一個更加大名鼎鼎的中文名字—-垂直同步。 “垂直同步(vsync)”指的是顯示卡的輸出幀數和螢幕的垂直重新整理率相同,這完全是一個CRT顯

Android跨程序通訊AIDL附原始碼

概述 AIDL:Android Interface Definition Language,即Android介面定義語言,記住,它是一門語言,設計它的目的就是為了實現跨程序通訊,我們知道Android的每一個程序都執行在獨立的記憶體中,程序之間程式碼是不能愉快

android開發 -- 檢視和陰影 Material Design

Material Design包含了很多內容,大致把它分為四部分: 主題和佈局——ANDROID L——Material Design詳解(主題和佈局) 檢視和陰影——ANDROID L——Material Design詳解(檢視和陰影) UI控制元件——ANDROID