Android获取内外置存储卡的方法

以前的Android(4.1之前的版本)中,SDcard跟路径通过“/sdcard”或者“/mnt/sdcard”来表示存储卡,而在Jelly Bean系统中修改为了“/storage/sdcard0”,以后可能还会有多个SDcard的情况。

目前为了保持和之前代码的兼容,sdcard路径做了link映射。

为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDirectory().getPath()来获取sdcard路径,如果您需要往sdcard中保存特定类型的内容,可以考虑使用Environment.getExternalStoragePublicDirectory(String type)函数,该函数可以返回特定类型的目录,目前支持如下类型:

DIRECTORY_ALARMS //警报的铃声
DIRECTORY_DCIM //相机拍摄的图片和视频保存的位置
DIRECTORY_DOWNLOADS //下载文件保存的位置
DIRECTORY_MOVIES //电影保存的位置, 比如 通过google play下载的电影
DIRECTORY_MUSIC //音乐保存的位置
DIRECTORY_NOTIFICATIONS //通知音保存的位置
DIRECTORY_PICTURES //下载的图片保存的位置
DIRECTORY_PODCASTS //用于保存podcast(博客)的音频文件
DIRECTORY_RINGTONES //保存铃声的位置

如果您的应用需要下载以上类型的文件,则可以放到上面对应的目录中去来帮助用户查找,比如最常用的就是下载文件了。如果您开发了一个浏览器,在下载文件的时候把文件下载到Download目录则方便用户以后查找该文件,当然如果你希望用户需要通过启动您的程序来查看他们下载的文件,您也可以不这么做 ^_^。

在使用这些目录保存文件的时候,需要注意一点:其他程序也有可能在使用这些目录,在保存文件前,注意判断下文件是否已经存在,不要覆盖了用户之前的数据。

Android4.1之后Android增加了多存储卡的支持,一般手机会存在内置存储卡和外置存储卡,也可能有多个外置存储卡。如何获取存储卡路径呢?

特别是各种android设备的存储器路径,是不一样的,比如T卡路径,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd 或者/mnt/sdcard2。有时内置存储器的路径也可能是/mnt/sdcard,而host usb存储器的路径也是各种各样的。

下面方法是通过反射,调用StorageManager的隐藏接口getVolumePaths(),实现获取存储器列表。

package ckl.storage.list;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.storage.StorageManager;

public class StorageList {
private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;

public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
.getSystemService(Activity.STORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManager.getClass()
.getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}

public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return paths;
}
}

在android2.3中,判断内置SD卡是否挂载:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
//为true的话,内置sd卡存在
}

判断外置SD卡是否挂载:

if(Environment.getStorageState(Environment.STORAGE_PATH_SD2).equals(Environment.MEDIA_MOUNTED))
{
//为true的话,外置sd卡存在
}

顺带描述怎么取得sdcard的空间大小:

File sdcardDir = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(sdcardDir.getPath());
//sdcardDir.getPath())值为/mnt/sdcard,想取外置sd卡大小的话,直接代入/mnt/sdcard2
long blockSize = sf.getBlockSize(); //总大小
long blockCount = sf.getBlockCount();
long availCount = sf.getAvailableBlocks(); //有效大小

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android获得内/外置存储卡路径的方法

    我们知道Android上一般都有外置的存储卡, 但是通过Environment.getExternalStorageDirectory()获取的是内置的存储卡位置 (也有的手机可以在系统中修改默认存储) 那么如何获取外置存储卡的位置呢? 我们可以通过StorageManager来获取多个外置sdcard,代码如下: StorageManager storageManager = (StorageManager) cxt.getSystemService(Context.STORAGE_SERVI

  • 如何获取Android设备挂载的所有存储器

    android系统提供了Environment.getExternalStorageDirectory()接口获得存储器的路径,但是这个接口往往给的结果并不是我们想要的,在某些设备上它返回的是手机内部存储,某些设备它返回的手机外部存储.还有就是某些Android设备支持扩展多个sdcard,这个时候想要获得所有存储器的挂载路径,这个接口是没有办法办到的. 怎么获取Android设备所有存储器的位置呢?或者说获得所有的挂载点 系统提供了一个StorageManager,它有一个方法叫getVolu

  • Android检测手机中存储卡及剩余空间大小的方法(基于Environment,StatFs及DecimalFormat)

    本文实例讲述了Android检测手机中存储卡及剩余空间大小的方法.分享给大家供大家参考,具体如下: Android中Environment可用来检测手机中是否安装有存储卡以及文件存储路径等.StatFs可以获取存储卡的空间大小以及剩余空间大小.DecimalFormat可以实现把数字划分为一定的格式. 具体程序如下: import java.io.File; import java.text.DecimalFormat; import android.app.Activity; import a

  • Android获取内外置存储卡的方法

    以前的Android(4.1之前的版本)中,SDcard跟路径通过"/sdcard"或者"/mnt/sdcard"来表示存储卡,而在Jelly Bean系统中修改为了"/storage/sdcard0",以后可能还会有多个SDcard的情况. 目前为了保持和之前代码的兼容,sdcard路径做了link映射. 为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDi

  • Android获取内置sdcard跟外置sdcard路径

    Android获取内置sdcard跟外置sdcard路径 Android获取内置sdcard跟外置sdcard路径.(测试过两个手机,亲测可用) 1.先得到外置sdcard路径,这个接口是系统提供的标准接口. 2.得到上一级文件夹目录 3.得到该目录的所有文件夹,根据判断得到内置sdcard跟外置sdcard. 4.程序运行的时候记得给程序添加读取sdcard的权限哦. /** * 得到sdcard的路径 * @return 返回一个字符串数组 下标0:内置sdcard 下标1:外置sdcard

  • Android 获取系统各个目录的方法

    在Android开发过程中,我们经常会对文件系统进行操作--存放.释放我们应用的数据.Android系统中提供了各种功能的文件目录,每个目录都有相应的特点和功能. 这篇文章主要介绍和记录一下实际开发过程中常用的各个文件目录. (1)内部存储(Internal Storage) 内部存储是App的私有目录,当一个应用卸载之后,内部存储中的这些文件也被删除.Shared Preferences和SQLite数据库文件都是存储在内部存储空间上的. -context.getFileDir() 路径:(d

  • js获取内联样式的方法

    本文实例讲述了js获取内联样式的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,target-densitydpi=high-dpi,in

  • Android获取窗体信息的Util方法

    Android获取窗体信息的Util方法,方法很简单,这里就不多废话了,直接上代码 package com.wangyi.tools; import android.app.Activity; import android.util.DisplayMetrics; public class DisplayUtils { private static DisplayUtils instance; private Activity mActivity; private DisplayUtils(Ac

  • Android获取移动网络信号强度的方法

    判断有没有 SIM 卡 获取移动网络的信号,一定要判断是否插了 SIM 卡,没插卡肯定是没法获取的 /** * 判断是否包含SIM卡 * * @return 状态 */ public static boolean hasSimCard(Context context) { TelephonyManager telMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int simState =

  • Android 获取IP地址的实现方法

    Android 获取IP地址 最近做项目,有一个需求是Android设备获取当前IP的功能,经过一番查询资料解决了,记录下实现方法. 1.使用WIFI 首先设置用户权限 <uses-permission Android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CH

  • Android获取系统时间的多种方法

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现. 现总结如下: 方法一: void getTime1(){ long time=System.currentTimeMillis();//long now = android.os.SystemClock.uptimeMillis(); SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd

  • android获取手指触摸位置的方法

    本文实例为大家分享了android获取手指触摸位置的具体代码,供大家参考,具体内容如下 手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件. 其原型是: public boolean onTouchEvent(MotionEvent event) 参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置.触摸的类型以及触摸的时间等.该对象会

随机推荐