专栏首页陶士涵的菜地[android] 分析setting源代码获取SD卡大小

[android] 分析setting源代码获取SD卡大小

保存文件到sd卡需要判断sd卡的大小,通过查看android系统的自带应用的源代码,得到方法,sdk下面的source是sdk的源代码,包含的是android.Jar下面的所有class的源代码。在android系统源代码中有ndk(java调c),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;
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你不知道的 Java 注解那些事!

    注解对于开发人员来讲既熟悉又陌生,熟悉是因为只要你是做开发,都会用到注解(常见的 @Override),陌生是因为即使不使用注解也照常能够进行开发,注解不是必须...

    周三不加班
  • RecyclerView实现混合布局

    PS:好长时间不写博客了,起初是不知道写些什么,后来接触了到了很多东西,原本看似简单的东西,背后都隐藏着巨大的秘密,想handler的使用,一般情况下会引起内存...

    cMusketeer
  • 成熟项目的Flutter快速引入以及Flutter、Native混合开发探究

    又有两个月没有发文了,最近我司逐渐开始在成熟的项目中引入 Flutter 作为一种新的开发方式。作为比较早吃螃蟹的人,我也在组内为三四十个同学做了一次 Flu...

    何时夕
  • Android Q 手势导航背后的故事

    新引入的手势导航是 Android Q 带来的主要变化之一。简而言之,采用这款新系统导航模式后,用户无需借助任何虚拟按键,只要滑动手势便能完成多种操作,包括:...

    Android 开发者
  • 如何让你的app在后台被干掉后优雅的启动

    作为一名Android开发师,肯定在处理用户的体验上下一定的功夫。有这么一个场景,在用户用着你开发的app的时候,突然某个聊天工具来消息了,切换到聊天工具后长时...

    Android技术干货分享
  • [译]C++ 和 Android 本地 Activity 初探

    我会带你完成一个简单的 Android 本地 Activity。我将介绍一下基本的设置,并尽力将进一步学习所需的工具提供给你。

    Android 开发者
  • Azkaban-3.x源码编译以及Solo-Server模式部署

    查看azkaban-3.73.1/gradle/wrapper/gradle-wrapper.properties文件:

    CoderJed
  • 【连载】聊聊 APK(四) —— 脱离 AS 手工创造 APK 文件

    想进大厂,就关注「 程序亦非猿 」 时不时 8:38 推送优质文章,觉得有用,置顶加星标

    程序亦非猿
  • 成功逆袭:越来越胖怎么能忍,我的APK瘦身之路!

    随着版本迭代,功能增加安装包体积也会慢慢增大。本文主要是介绍APK瘦身中用到的一些方法。

    Android技术干货分享
  • Android 应用构建速度提升的十个小技巧

    应用的构建速度会直接影响开发效率,本文将带您通过改造一个 Android 应用: “Google 追踪圣诞老人 (Google Santa Tracker)” ...

    用户1907613

扫码关注云+社区

领取腾讯云代金券