zoukankan      html  css  js  c++  java
  • [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+"
    "+"可用空间(SD):"+avSdSize+"
    "+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+"
    "+"可用空间(手机):"+avSdSize;
        }
    
    }
  • 相关阅读:
    关于Django 报错 ImportError: cannot import name RegexUrlResolver解决
    Git版本控制
    java Labmda表达式
    java注解&反射
    maven
    数据库
    为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
    【Linux】Linux基本命令
    阿里云服务器linux环境搭建SSM项目(一)--Linux环境配置jdk和Tomcat.md
    阿里云服务器linux环境搭建SSM项目(二)--linux环境配置mysql5.7.md
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5232716.html
Copyright © 2011-2022 走看看