`
yangwei0915
  • 浏览: 460282 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

android 获取sd卡路径的两种方法

阅读更多
/**
	 * 方法一
	 * @return
	 */
	public String getSDPath1() {
		File sdDir = null;
		boolean sdCardExist = Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
		if (sdCardExist) {
			sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
			return sdDir.toString();
		} else {
			return null;
		}

	}

 

 

1、API>=23 时方法一无效(暂未测试)

2、有些厂商的Rom改动太多,对相关原生API的支持存在问题,这时方法一可能会存在问题。

方法二

public String getSDPath() {
		String path;
		path=getStoragePath(context,false);
		if(path==null){
			path=getStoragePath(context,true);
		}
		return path;
	}
	/**
	 * 获取内部存储和外部存储(内外sd卡)的路径,
	 * 参数 is_removable为false时得到的是内置sd卡路径,为true则为外置sd卡路径。
	 * @param mContext
	 * @param is_removale
	 * @return
	 */
	private static String getStoragePath(Context mContext, boolean is_removale) {  

	      StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
	        Class<?> storageVolumeClazz = null;
	        try {
	            storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
	            Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
	            Method getPath = storageVolumeClazz.getMethod("getPath");
	            Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
	            Object result = getVolumeList.invoke(mStorageManager);
	            final int length = Array.getLength(result);
	            for (int i = 0; i < length; i++) {
	                Object storageVolumeElement = Array.get(result, i);
	                String path = (String) getPath.invoke(storageVolumeElement);
	                boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
	                if (is_removale == removable) {
	                    return path;
	                }
	            }
	        } catch (ClassNotFoundException e) {
	            e.printStackTrace();
	        } catch (InvocationTargetException e) {
	            e.printStackTrace();
	        } catch (NoSuchMethodException e) {
	            e.printStackTrace();
	        } catch (IllegalAccessException e) {
	            e.printStackTrace();
	        }
	        return null;
	}

 

分享到:
评论

相关推荐

    Android N获取外置SD卡或挂载U盘路径的方法

    在Android N上并没有提供直接的方法获取外置SD卡或挂载U盘路径,可以通过下面方法获取内置sd卡路径 Environment.getExternalStorageDirectory().getAbsolutePath(); 通过查看getExternalStorageDirectory源码发现,...

    【Android-数据存储】外部存储(存储在SD卡上)

    android的数据存储主要分为三类: 内部存储:link. 外部存储 sharedpreferences:link. 本文主要介绍外部存储的相关知识。 存储路径:/storage/emulated/0 ...设置存储路径【两种方式①直接写存储路径 ②e

    Android开发资料合集--续

    81、获得屏幕像素的两种方法 126 82、ShowDialog(int id); 126 83、透明效果的实现 128 84、根据网络或GPS获得经纬度 128 85、TextView 130 90、获取存储卡和手机内部存储空间 130 91、获得当前应用的UID 131 92、...

    新版Android开发教程.rar

    MicroSD 卡 ; QWERTY 全键盘; 310 万像素摄像头。 流媒体 支持视频格式: H.264 、流媒体、 3GPP 、 MPEG4 和 Codec 3GP ;支持音频格式: MP3 、 AAC 、 AAC+ 、 W MA 、 MPEG4 、 WAV 、 MIDI 、 REAL 、 AUDIO ...

    Android手机输入法手势识别源代码

     关于两种方式创建模拟器的SDcard在【Android2D游戏开发之十】有详解   if (Environment.getExternalStorageState() != null) {// 这个方法在试探终端是否有sdcard!   if (!file.exists()) {// 判定是否已经...

    Android开发资料合集-World版!

    4.5.2、menu实现的两种方法 58 4.5.3、自定义MENU背景 62 4.5.4、触发menu 64 4.5.5、Context Menu和Options Menu菜单的区别 64 4.5.6、Context menus for expandable lists 64 4.6、LISTVIEW 66 4.6.1、ListView...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--android 获取sd卡状态 |--android 设置apn |--android 调节屏幕亮度 |--android 资源uri |--android 还原短信 |--android 重启 |--android中anim文件特效 |--app信息menifest获取(如版本号) |--AsyncQueryHandler...

    Android 开发技巧

    4.5.2、menu实现的两种方法 58 4.5.3、自定义MENU背景 62 4.5.4、触发menu 64 4.5.5、Context Menu和Options Menu菜单的区别 64 4.5.6、Context menus for expandable lists 64 4.6、LISTVIEW 66 4.6.1、ListView...

    深入理解Android:卷I--详细书签版

     本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...

    安装xposed框架所需的zip文件

    也就是/sdcard/Android/data/de.robv.android.xposed.installer/cache/downloads/framework,如果没有sd卡,就去内部存储中找相似目录,没有的目录就手动创建。放好后打开xposed,勾选显示过时的版本,重新启动...

    手机输入法手势识别源代码.zip

    关于两种方式创建模拟器的SDcard在【Android2D游戏开发之十】有详解 if (Environment.getExternalStorageState() != null) {// 这个方法在试探终端是否有sdcard! if (!file.exists()) {// 判定是否已经存在手势...

    matlab规则裁剪影像代码-Flow-Free:无流量

    以下命令立即获取所连接设备的屏幕快照,并按照指定路径将其存储在SD卡中。 system&#40; ' adb shell screencap -p /sdcard/screen.png ' &#41;; 以下命令按照指定的路径将其从android设备的SD卡拉入操作系统。 ...

    百度手机助手PC版 v6.0.zip

    图片、影音和电子书的管理可以方便管理SD卡中的文件。   百度手机助手PC版基本上支持市面上所有的Android设备,可以转换的格式,支持分辨率随意调整,转换速度很快。   总体来说,百度手机助手PC版游戏下载...

    网狐荣耀版开发使用常见问题解答

    然后下一步,选择打包APK文件的存储路径。 第五步,点击finish等待程序签名与APK的生成,结束。 六、网狐荣耀版游戏启动时出现“正在初始化组件”启动失败 【 2017-11-10 08:35:33 】[ 游戏 ] 房间参数加载成功 ...

    phoebe:KanjiDic2JMDict到SQLite

    菲比Phoebe是一种从日语词典文件生成SQLite数据库的工具,主要用于Android应用程序。 Phoebe的目的是为这些应用程序创建数据库,只需下载新的词典文件并运行程序,即可轻松地对其进行更新。词性为了节省空间,对有关...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目源代码

    Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...

Global site tag (gtag.js) - Google Analytics