[android] 分析setting源代码获取SD卡大小详解手机开发

保存文件到sd卡需要判断sd卡的大小,通过查看android系统的自带应用的源代码,得到方法,sdk下面的sourcesdk的源代码,包含的是android.Jar下面的所有class的源代码。在android系统源代码中有ndkjavac,dalvik虚拟机等,里面packages/apps/settings是设置的源代码。

 

导入一个源代码,import ==> general ==> existing projects into workspace 选择完root目录后会报错(no project to import) 

正确导入 import  ==>  android ==> existing android code into workspace ==>选中root目录 完成

导入系统源码此时的项目里面会报各种错误,原因是一些api找不到,忽略掉就行,Environment.getExternalStorageDirectory()得到根路径File类型的

Environment.getDataDirectory() 获取手机内存

调用File对象的getPath(),得到String路径,实例化StaFs

调用StaFs对象的getBlockCount() 得到空间个数,调用getAvailableBlock()可用个数

调用StaFs对象的getBlockSize() 得到每个空间大小 两个相乘得到总空间大小

调用Formatter.formatFileSize() 格式化大小(android.text.format

 

根据系统设置的文字信息搜索代码部分,按ctrl+h 找文件搜索,在setting源码中查找到。windows上面存储文件,首先格式化硬盘,比如存储1个字节的信息,占用空间也是4kb

 

activity代码:

 

package com.tsh.readsdsize; 
 
import java.io.File; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.StatFs; 
import android.text.format.Formatter; 
import android.util.Log; 
import android.widget.TextView; 
 
public class MainActivity extends Activity { 
    private TextView tv; 
    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        tv=(TextView) findViewById(R.id.tv); 
        //SD卡根目录 
        File rootFile=Environment.getExternalStorageDirectory(); 
        StatFs stat=new StatFs(rootFile.getPath()); 
        int size=stat.getBlockSize(); 
        long count=(long) stat.getBlockCount(); 
        long avaNum=stat.getAvailableBlocks(); 
        long sum=size*count; 
        long avaSum=avaNum*count; 
        //格式化 
        String sdSize=Formatter.formatFileSize(this, sum); 
        String avSdSize=Formatter.formatFileSize(this, avaSum); 
         
        tv.setText("总空间(SD):"+sdSize+"/n"+"可用空间(SD):"+avSdSize+"/n"+getRomSize()); 
    } 
    /** 
     *  
     * 获取手机内存大小 
     */ 
    public String getRomSize(){ 
        File rootFile=Environment.getDataDirectory(); 
        StatFs stat=new StatFs(rootFile.getPath()); 
        int size=stat.getBlockSize(); 
        long count=(long) stat.getBlockCount(); 
        long avaNum=stat.getAvailableBlocks(); 
        long sum=size*count; 
        long avaSum=avaNum*count; 
        //格式化 
        String sdSize=Formatter.formatFileSize(this, sum); 
        String avSdSize=Formatter.formatFileSize(this, avaSum); 
         
        return "总空间(手机):"+sdSize+"/n"+"可用空间(手机):"+avSdSize; 
    } 
 
}

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5502.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论