您的位置:首页 > 移动开发 > Android开发

android获取内置和外置SD卡路径

2016-07-25 11:43 471 查看
本文将介绍android真机环境下如何获取内置和外置SD卡路径。

测试环境:三星Note3,其他手机待测试。。。

所需权限(AndroidManifest.xml文件里)

[html] view
plaincopy

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

获取路径代码(MainActivity.java文件)

[java] view
plaincopy

package com.example.androidtest;  

  

import java.io.BufferedReader;  

import java.io.File;  

import java.io.InputStream;  

import java.io.InputStreamReader;  

import java.util.ArrayList;  

import java.util.List;  

  

import android.os.Bundle;  

import android.os.Environment;  

import android.app.Activity;  

import android.view.Menu;  

  

public class MainActivity extends Activity {  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

  

        StringBuilder log = new StringBuilder();  

        String inPath = getInnerSDCardPath();  

        log.append("内置SD卡路径:" + inPath + "\r\n");  

          

        List<String> extPaths = getExtSDCardPath();  

        for (String path : extPaths) {  

            log.append("外置SD卡路径:" + path + "\r\n");  

        }  

        System.out.println(log.toString());  

    }  

      

    /** 

     * 获取内置SD卡路径 

     * @return 

     */  

    public String getInnerSDCardPath() {    

        return Environment.getExternalStorageDirectory().getPath();    

    }  

  

    /** 

     * 获取外置SD卡路径 

     * @return  应该就一条记录或空 

     */  

    public List<String> getExtSDCardPath()  

    {  

        List<String> lResult = new ArrayList<String>();  

        try {  

            Runtime rt = Runtime.getRuntime();  

            Process proc = rt.exec("mount");  

            InputStream is = proc.getInputStream();  

            InputStreamReader isr = new InputStreamReader(is);  

            BufferedReader br = new BufferedReader(isr);  

            String line;  

            while ((line = br.readLine()) != null) {  

                if (line.contains("extSdCard"))  

                {  

                    String [] arr = line.split(" ");  

                    String path = arr[1];  

                    File file = new File(path);  

                    if (file.isDirectory())  

                    {  

                        lResult.add(path);  

                    }  

                }  

            }  

            isr.close();  

        } catch (Exception e) {  

        }  

        return lResult;  

    }  

  

    @Override  

    public boolean onCreateOptionsMenu(Menu menu) {  

        // Inflate the menu; this adds items to the action bar if it is present.  

        getMenuInflater().inflate(R.menu.activity_main, menu);  

        return true;  

    }  

  

}  

其中,line.contains("extSdCard")判断部分有待进一步验证!

打印结果:

1. 插入一张外置SD卡后

[plain] view
plaincopy

内置SD卡路径:/storage/emulated/0  

外置SD卡路径:/storage/extSdCard  

2. 取出外置SD卡后

[plain] view
plaincopy

内置SD卡路径:/storage/emulated/0  

android系统可通过Environment.getExternalStorageDirectory()获取存储卡的路径,但是现在有很多手机内置有一个存储空间,同时还支持外置sd卡插入,这样通过Environment.getExternalStorageDirectory()方法获取到的就是内置存储卡的位置,需要获取外置存储卡的路径就比较麻烦,这里借鉴网上的代码,稍作修改,在已有的手机上做了测试,效果还可以,当然也许还有其他的一些奇葩机型没有覆盖到。

[java] view
plain copy

<pre name="code" class="java">package com.example.getpath;  

  

import java.io.BufferedReader;  

import java.io.File;  

import java.io.InputStream;  

import java.io.InputStreamReader;  

  

import android.annotation.SuppressLint;  

import android.app.Activity;  

import android.os.Bundle;  

import android.os.Environment;  

import android.util.Log;  

  

public class MainActivity extends Activity {  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

        getPath2();  

    }  

  

    @SuppressLint("SdCardPath")  

    public String getPath2() {  

        String sdcard_path = null;  

        String sd_default = Environment.getExternalStorageDirectory()  

                .getAbsolutePath();  

        Log.d("text", sd_default);  

        if (sd_default.endsWith("/")) {  

            sd_default = sd_default.substring(0, sd_default.length() - 1);  

        }  

        // 得到路径  

        try {  

            Runtime runtime = Runtime.getRuntime();  

            Process proc = runtime.exec("mount");  

            InputStream is = proc.getInputStream();  

            InputStreamReader isr = new InputStreamReader(is);  

            String line;  

            BufferedReader br = new BufferedReader(isr);  

            while ((line = br.readLine()) != null) {  

                if (line.contains("secure"))  

                    continue;  

                if (line.contains("asec"))  

                    continue;  

                if (line.contains("fat") && line.contains("/mnt/")) {  

                    String columns[] = line.split(" ");  

                    if (columns != null && columns.length > 1) {  

                        if (sd_default.trim().equals(columns[1].trim())) {  

                            continue;  

                        }  

                        sdcard_path = columns[1];  

                    }  

                } else if (line.contains("fuse") && line.contains("/mnt/")) {  

                    String columns[] = line.split(" ");  

                    if (columns != null && columns.length > 1) {  

                        if (sd_default.trim().equals(columns[1].trim())) {  

                            continue;  

                        }  

                        sdcard_path = columns[1];  

                    }  

                }  

            }  

        } catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        Log.d("text", sdcard_path);  

        return sdcard_path;  

    }  

}</pre><br>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: