• android 获取SD卡路径


    examples

    当前app缓存路径

    // path == "/data/data/com.xxx.yy"
    // "com.xxx.yy"表示当前app的包路径
    String path = getApplicationContext().getFilesDir().getAbsolutePath();
    
    • 1
    • 2
    • 3

    外置SD卡根路径

    // path == "/sdcard"
    String path = Environment.getExternalStorageDirectory().getPath();
    
    • 1
    • 2

    内置SD卡存储路径

    // path == "/storage/emulated/0"
    String path = Environment.getExternalStorageDirectory().getAbsolutePath();
    
    • 1
    • 2

    判断SD卡是否存在

    boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
    
    • 1

    Environment 类

    Environment是一个提供访问环境变量的类。

    包含常量

    用于与 getExternalStorageState() 的返回值比较。

    • MEDIA_BAD_REMOVAL
      SDCard 被卸载前己被移除
    • MEDIA_CHECKING
      对象正在磁盘检查
    • MEDIA_MOUNTED
      对象是否存在并具有读/写权限
    • MEDIA_MOUNTED_READ_ONLY
      对象权限为只读
    • MEDIA_NOFS
      对象为空白或正在使用不受支持的文件系统
    • MEDIA_REMOVED
      SD卡不存在
    • MEDIA_SHARED
      SDCard 未安装 ,并通过 USB 大容量存储共享
    • MEDIA_UNMOUNTABLE
      SDCard 是存在但不可以被安装
    • MEDIA_UNMOUNTED
      SDCard 是存在但是没有被安装

    常用方法

    • getDataDirectory()
      获取 Android 数据目录。
    • getDownloadCacheDirectory()
      获取 Android 下载/缓存内容目录。
    • getExternalStorageDirectory()
      获取外部存储目录即 SDCard
    • getExternalStoragePublicDirectory(String type)
      取一个高端的公用的外部存储器目录来摆放某些类型的文件
    • getExternalStorageState()
      获取外部存储设备的当前状态
    • getRootDirectory()
      获取 Android 的根目录

    StatFs类

    StatFs 是一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况。

    常用方法

    • getAvailableBlocks()
      返回 Int ,获取当前可用的存储空间
    • getBlockCount()
      返回 Int ,获取该区域可用的文件系统数
    • getBlockSize()
      返回 Int ,大小,以字节为单位,一个文件系统
    • getFreeBlocks()
      返回 Int ,该块区域剩余的空间
    • restat(String path)
      执行一个由该对象所引用的文件系统

    完整例子读取 SDCard 内存

    存储卡在 Android 手机上是可以随时插拔的,每次的动作都对引起操作系统进行 ACTION_BROADCAST,本例子将使用上面学到的方法,计算出 SDCard 的剩余容量和总容量。代码如下:

    package com.terry;
    
    import java.io.File;
    import java.text.DecimalFormat;
    import android.R.integer;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.StatFs;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.widget.Toast;
    
    
    public class getStorageActivity extends Activity {
    	private Button myButton;
    
    	/** Called when the activity is first created. */
    	@Override 
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		findView();
    		viewHolder.myButton.setOnClickListener(new OnClickListener() {
    			@Override 
    			         public 
    			void onClick(View arg0) {
    				// TODO Auto-generated method stub 
    				getSize();
    			}
    		}
    		);
    	}
    
    	void findView(){
    		viewHolder.myButton=(Button)findViewById(R.id.Button01);
    		viewHolder.myBar=(ProgressBar)findViewById(R.id.myProgressBar);
    		viewHolder.myTextView=(TextView)findViewById(R.id.myTextView);
    	}
    
    	void getSize(){
    		viewHolder.myTextView.setText("");
    		viewHolder.myBar.setProgress(0);
    		//判断是否有插入存储卡 
    		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    			File path =Environment.getExternalStorageDirectory();
    			//取得sdcard文件路径 
    			StatFs statfs=new StatFs(path.getPath());
    			//获取block的SIZE 
    			long blocSize=statfs.getBlockSize();
    			//获取BLOCK数量 
    			long totalBlocks=statfs.getBlockCount();
    			//己使用的Block的数量 
    			long availaBlock=statfs.getAvailableBlocks();
    			String[] total=filesize(totalBlocks*blocSize);
    			String[] availale=filesize(availaBlock*blocSize);
    			//设置进度条的最大值 
    			int maxValue=Integer.parseint(availale[0]) 
    			         *viewHolder.myBar.getMax()/Integer.parseint(total[0]);
    			viewHolder.myBar.setProgress(maxValue);
    			String Text="总共:"+total[0]+total[1]+"/n" 
    			+"可用:"+availale[0]+availale[1];
    			viewHolder.myTextView.setText(Text);
    		} else 
    		if(Environment.getExternalStorageState().equals(Environment.MEDIA_REMOVED)){
    			Toast.makeText(getStorageActivity.this, "没有sdCard",1000).show();
    		}
    	}
    
    	//返回数组,下标1代表大小,下标2代表单位 KB/MB 
    	String[] filesize(long size){
    		String str="";
    		if(size>=1024){
    			str="KB";
    			size/=1024;
    			if(size>=1024){
    				str="MB";
    				size/=1024;
    			}
    		}
    		DecimalFormat formatter=new DecimalFormat();
    		formatter.setGroupingSize(3);
    		String result[] =new String[2];
    		result[0]=formatter.format(size);
    		result[1]=str;
    		return result;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
  • 相关阅读:
    用python表格初级尝试
    用docker搭建简易ctf题目
    【高等数学基础进阶】不定积分-练习 & 定积分与反常积分-补充
    如何在宝塔上面新建虚拟主机
    小满Vue3第四十一章(docker 碰撞 vue3)
    .Net/C#分库分表高性能O(1)瀑布流分页
    三十而立学FPGA之UART
    LeetCode 面试题 08.04. 幂集
    实战二十六:基于字符串匹配的实体对齐任务 代码+数据 (可作为毕设)
    Lazarus上好用的 Indy TCP client 组件
  • 原文地址:https://blog.csdn.net/guo_lei_lamant/article/details/127403936