Android开发之系统信息【1】【2】【3】【4】

 

Android开发之系统信息【1】——获取Android手机中SD卡存储信息

分类: Android 2011-06-13 18:23 163人阅读 评论(0) 收藏 举报

 

SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?

 

首先,要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此第一件事就是需要添加访问扩展设备的权限。

<uses-permission 
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>

其次,需要判断手机上面SD卡是否插好,如果有SD卡的情况下,我们才可以访问得到并获取到它的相关信息,当然以下这个语句需要用if做判断。

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

取得sdcard文件路径

File path = Environment.getExternalStorageDirectory(); 
StatFs statfs = new StatFs(path.getPath());

获取block的SIZE

long blocSize = statfs.getBlockSize();

获取BLOCK数量

long totalBlocks = statfs.getBlockCount();

空闲的Block的数量

long availaBlock = statfs.getAvailableBlocks();

计算总空间大小和空闲的空间大小

 

储空间大小跟空闲的存储空间大小就被计算出来了。

 

/**

* 取得空闲sd卡空间大小

* @return

*/

public long getAvailaleSize(){

File path = Environment.getExternalStorageDirectory(); //取得sdcard文件路径

StatFs stat = new StatFs(path.getPath()); 

/*获取block的SIZE*/

long blockSize = stat.getBlockSize(); 

/*空闲的Block的数量*/

long availableBlocks = stat.getAvailableBlocks();

/* 返回bit大小值*/

return availableBlocks * blockSize; 

//(availableBlocks * blockSize)/1024      KIB 单位

//(availableBlocks * blockSize)/1024 /1024  MIB单位

 

}

 

/**

* SD卡大小

* @return

*/

public long getAllSize(){

File path = Environment.getExternalStorageDirectory(); 

StatFs stat = new StatFs(path.getPath()); 

/*获取block的SIZE*/

long blockSize = stat.getBlockSize(); 

/*块数量*/

long availableBlocks = stat.getBlockCount();

/* 返回bit大小值*/

return availableBlocks * blockSize; 

}

 

 

Android 文件的浏览(类似于FileDialog的功能)

 

最近因为比较忙,好几天没有写博客了,正好现在正在弄上传文件,当时想怎么能实现fileDialog的功能呢,打开文件,浏览文件,然后选择文件呢,查了好多资料,也看了不少论坛,都说里面没有这个功能,那真是奇怪了,里面没有这个功能,当然就需要自己动手添加这个功能了。

首先说一下这个文件浏览的简单实现原理:

首先选择一个目录做为根目录,然后打开此目录,常用的就是使用File这个类了,如下:

File file=new File(path);

然后可以通过获取到此目录下所有文件及文件夹的列表:

如下:

File[]  files = file.listFiles();

然后再根据根据得到的文件,来判断是文件夹还是文件,如果是文件夹,那么我们就将文件夹添加到列表中,如果是文件那么就把文件添加到列表中进行显示,如果需要显示图标的话,那么就需要根据文件的后缀,设置不同的图标了。我是在ListView中进行显示的。

基本代码如下:

 

代码

for (File currentFile : files)
{
//判断是一个文件夹还是一个文件
if (currentFile.isDirectory())
{
currentIcon = getResources().getDrawable(R.drawable.folder);
}
else
{
//取得文件名
String fileName = currentFile.getName();
//根据文件名来判断文件类型,设置不同的图标
if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingImage)))
{
currentIcon = getResources().getDrawable(R.drawable.image);
}
else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingWebText)))
{
currentIcon = getResources().getDrawable(R.drawable.webtext);
}
else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingPackage)))
{
currentIcon = getResources().getDrawable(R.drawable.packed);
}
else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingAudio)))
{
currentIcon = getResources().getDrawable(R.drawable.audio);
}
else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingVideo)))
{
currentIcon = getResources().getDrawable(R.drawable.video);
}
else
{
currentIcon = getResources().getDrawable(R.drawable.text);
}
}

 

下面是根据后缀对文件的类型进行的判断:

 

 

代码

//通过文件名判断是什么类型的文件
private boolean checkEndsWithInStringArray(String checkItsEnd,
String[] fileEndings)
{
for(String aEnd : fileEndings)
{
if(checkItsEnd.endsWith(aEnd))
return true;
}
return false;
}

 

那么这样我们就可以显示出来带图标的列表了,现在到了如果打开子目录的介绍了,首先对Listview添加点击事件,在点击之后,我们根据点击的内容进行判断,判断是文件还是文件夹,如果是文件夹,那么再次调用显示,并且将以前显示的内容清空即可,显示出来,如果是文件的话,那么这个根据我们的需要进行操作:如打开、选择等等操作了。

 

上面所写的就是关于如何自己做一个文件浏览器,而且在这里还可以根据不同的使用地方,让其显示特定的文件。这个需要读者在自己的使用中自己慢慢熟悉与摸索了!

  这个Listview也是根据自己的需要进行了布局,相信通过学习这一篇文章,你肯定会以File及ListView的使用有一个了解,也希望做出自己实用的文件浏览器

Android开发之系统信息【2】——获取Android手机内存信息

在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?通过读取文件”/proc/meminfo”的信息能够获取手机Memory的总量,而通过ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo)方法可以获取当前的可用Memory量。

“/proc/meminfo”文件记录了android手机的一些内存信息,在命令行窗口里输入”adb shell”,进入shell环境,输入”cat /proc/meminfo”即可在命令行里显示meminfo文件的内容,具体如下所示。

C:\Users\Figo>adb shell
# cat /proc/meminfo
cat /proc/meminfo
MemTotal:          94096 kB
MemFree:            1684 kB
Buffers:              16 kB
Cached:            27160 kB
SwapCached:            0 kB
Active:            35392 kB
Inactive:          44180 kB
Active(anon):      26540 kB
Inactive(anon):    28244 kB
Active(file):       8852 kB
Inactive(file):    15936 kB
Unevictable:         280 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         52688 kB
Mapped:            17960 kB
Slab:               3816 kB
SReclaimable:        936 kB
SUnreclaim:         2880 kB
PageTables:         5260 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       47048 kB
Committed_AS:    1483784 kB
VmallocTotal:     876544 kB
VmallocUsed:       15456 kB
VmallocChunk:     829444 kB
#

下面先对”/proc/meminfo”文件里列出的字段进行粗略解释:

MemTotal: 所有可用RAM大小。

MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。

Buffers: 用来给文件做缓冲大小。

Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache)。

SwapCached:被高速缓冲存储器(cache memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。

Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。

Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。

SwapTotal: 交换空间的总大小。

SwapFree: 未被使用交换空间的大小。

Dirty: 等待被写回到磁盘的内存大小。

Writeback: 正在被写回到磁盘的内存大小。

AnonPages:未映射页的内存大小。

Mapped: 设备和文件等映射的大小。

Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。

SReclaimable:可收回Slab的大小。

SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。

PageTables:管理内存分页页面的索引表的大小。

NFS_Unstable:不稳定页表的大小。

要获取android手机总内存大小,只需读取”/proc/meminfo”文件的第1行,并进行简单的字符串处理即可。

JAVA代码如下:

package com.figo.readsyememory;
import android.app.Activity;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.text.format.Formatter;
import android.util.Log;
import android.widget.TextView;
 
public class ReadSystemMemory extends Activity {
TextView tv = null;
 
private String getAvailMemory() {// 获取android当前可用内存大小
 
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
 

MemoryInfo mi = new MemoryInfo();

 
am.getMemoryInfo(mi);//mi.availMem; 当前系统的可用内存
return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 将获取的内存大小规格化    
 
}
 
private String getTotalMemory() {
 

String str1 = "/proc/meminfo";// 系统内存信息文件

String str2;           String[] arrayOfString;
long initial_memory = 0;
try {
 

FileReader localFileReader = new FileReader(str1);

 
BufferedReader localBufferedReader = new BufferedReader(     localFileReader, 8192);
 
str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小
arrayOfString = str2.split("\\s+");
 
for (String num : arrayOfString) {
 

Log.i(str2, num + "\t");

 
}
 
initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte               
 
localBufferedReader.close();
} catch (IOException e) {              }
 
return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte转换为KB或者MB,内存大小规格化   }
/** Called when the activity is first created. */    
 
@Override      
 
public void onCreate(Bundle savedInstanceState) {    
 
        super.onCreate(savedInstanceState);
 
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.system_memory);
 
tv.setText("手机总内存: " + this.getTotalMemory() + ", " + "可用内存: "+ this.getAvailMemory());
 
}
 
}

运行结果如下:

令一种获取手机内存的方法:

File path = Environment.getDataDirectory();
 

StatFs stat = new StatFs(path.getPath());

 
blockSize = stat.getBlockSize();
 

AllSize = stat.getBlockCount();

 
availableBlocks = stat.getAvailableBlocks();
 
long  AvailableSize=((availableBlocks*blockSize)/1024)/1024; //便得到了可用内存大小
 
long  TotalSize=((AllSize*blockSize)/1024)/1024; //便得到了总内存大小

大功告成,顺利读取android手机的总内存和当前的可用内存。这里只是抛砖引玉,大家可以举一反三,进行扩展。当然我们还可以通过读取”/proc/cupinfo”来获取android手机的CPU参数,通过读取”/proc/stat”文件来计算CPU的使用率,这里不再赘述。

 

Android开发之系统信息【3】——获取Android网络连接信息

通过学习可以取得网络连接信息,判断网络连接状态,当前网络连接类型等。可以随意扩展。

public static String getNetworkInfo(Context context){

             StringBuffer sInfo = new StringBuffer();

             ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

                      if (connectivity != null)  { 

                       

                        NetworkInfo activeNetInfo = connectivity.getActiveNetworkInfo();  

                          NetworkInfo mobNetInfo = connectivity.getNetworkInfo( ConnectivityManager.TYPE_MOBILE ); 

                          if ( activeNetInfo != null )  

                             {  

                              Log.d("","XYZ_NetState_|TypeName:"+activeNetInfo.getTypeName()+"|Type:"+activeNetInfo.getType()+"|State:"+activeNetInfo.getState()+"|ExtraInfo:"+activeNetInfo.getExtraInfo()

                                                               +"|Reason:"+activeNetInfo.getReason()+"|SubtypeName:"+activeNetInfo.getSubtypeName()+"|Subtype:"+activeNetInfo.getSubtype()+"|DetailedState:"+activeNetInfo.getDetailedState());  

                              sInfo.append("\nDetailedState:"+activeNetInfo.getDetailedState());

                              sInfo.append("\nState:"+activeNetInfo.getState());

                              sInfo.append("\nType:"+activeNetInfo.getType());

                              sInfo.append("\nTypeName:"+activeNetInfo.getTypeName());

                              sInfo.append("\nExtraInfo:"+activeNetInfo.getExtraInfo());

                              sInfo.append("\nReason:"+activeNetInfo.getReason());

                              sInfo.append("\nSubtype:"+activeNetInfo.getSubtype());

                              sInfo.append("\nSubtypeName:"+activeNetInfo.getSubtypeName());

                              sInfo.append("\n\n\n\n");

                             }  

                          if( mobNetInfo != null )  

                              {  

                               Log.d("","XYZ_NetState_"+mobNetInfo.getTypeName()+":"+mobNetInfo.getExtraInfo());    

                             }

                         

                          NetworkInfo[] info = connectivity.getAllNetworkInfo();   

                          if (info != null) {       

                              for (int i = 0; i < info.length; i++) {          

                                  if (info[i].getState() == NetworkInfo.State.CONNECTED) {

                                    Log.d("", "XYZ_isconnect");

                                   

                                  }else{

                                    sInfo.append("\nDetailedState:"+info[i].getDetailedState());

                                                sInfo.append("\nState:"+info[i].getState());

                                                sInfo.append("\nType:"+info[i].getType());

                                                sInfo.append("\nTypeName:"+info[i].getTypeName());

                                                sInfo.append("\nExtraInfo:"+info[i].getExtraInfo());

                                                sInfo.append("\nReason:"+info[i].getReason());

                                                sInfo.append("\nSubtype:"+info[i].getSubtype());

                                                sInfo.append("\nSubtypeName:"+info[i].getSubtypeName());

                                                sInfo.append("\n");

                                  }

                                 

                              }    

                          }

                      }  

            

             return sInfo.toString();

}

 

 

Android开发之系统信息【4】——获取Android已安装程序列表

 

Android开发之系统信息【4】——获取Android已安装程序列表

 

public class Software extends Activity implements  Runnable {

         List<Map<String, Object>> list = null;

         ListView itemlist = null;

         private ProgressDialog pd;

          

         @Override

         public void onCreate(Bundle icicle) { 

        super.onCreate(icicle); 

                   setContentView(R.layout.infos);

                   setTitle("软件信息");

                   itemlist = (ListView) findViewById(R.id.itemlist);

        pd = ProgressDialog.show(this, "请稍候..", "正在收集你已经安装的软件信息...", true,

                false);

        Thread thread = new Thread(this);

        thread.start();

    } 

        

 

         private void refreshListItems() {

                   list = fetch_installed_apps();

                   SimpleAdapter notes = new SimpleAdapter(this, list, R.layout.info_row,

                                     new String[] { "name", "desc" }, new int[] { R.id.name,

                                                        R.id.desc });

                   itemlist.setAdapter(notes);

                   setTitle("软件信息,已经安装"+list.size()+"款应用.");

         }

        

        

        

         public List fetch_installed_apps(){

        List<ApplicationInfo> packages = getPackageManager().getInstalledApplications(0);

                   list = new ArrayList<Map<String, Object>>(

                                     packages.size());

                   Iterator<ApplicationInfo> l = packages.iterator();

                  

                   while (l.hasNext()) {

                            Map<String, Object> map = new HashMap<String, Object>();

                            ApplicationInfo app = (ApplicationInfo) l.next();

                            String packageName = app.packageName;

            String label = "";

            try {

                label = getPackageManager().getApplicationLabel(app).toString();

            } catch (Exception e) { 

                     Log.i("Exception",e.toString());

            }

                       map = new HashMap<String, Object>();

                     map.put("name", label);

                       map.put("desc", packageName);

                       list.add(map);

                   }

                   return list;

    }

        

         @Override

         public void run() {

             fetch_installed_apps();

       handler.sendEmptyMessage(0);

         }

        

    private Handler handler = new Handler() {

        public void handleMessage(Message msg) {

            refreshListItems();

            pd.dismiss();

        }

    };

   

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值