解决方案 »

  1.   

    package com.cshis.DGRHotel.SDCardReader;import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;import com.cshis.DGRHotel.SDCardReader.Dev_MountInfo.DevInfo;import android.os.Environment;
    /**
     * 取外置SD卡路径类
     * @author WangYimin
     *
     */
    public class Dev_MountInfo implements IDev {
    /**
     * ***
     */
    public final String HEAD = "dev_mount";
    public final String LABEL = "<label>";
    public final String MOUNT_POINT = "<mount_point>";
    public final String PATH = "<part>";
    public final String SYSFS_PATH = "<sysfs_path1...>"; /**
     * Label for the volume
     */
    private final int NLABEL = 1;
    /**
     * Partition
     */
    private final int NPATH = 2;
    /**
     * Where the volume will be mounted
     */
    private final int NMOUNT_POINT = 3;
    private final int NSYSFS_PATH = 4; private final int DEV_INTERNAL = 0;
    private final int DEV_EXTERNAL = 1; private ArrayList<String> cache = new ArrayList<String>(); private static Dev_MountInfo dev;
    private DevInfo info; private final File VOLD_FSTAB = new File(Environment.getRootDirectory()
    .getAbsoluteFile()
    + File.separator
    + "etc"
    + File.separator
    + "vold.fstab"); public static Dev_MountInfo getInstance() {
    if (null == dev)
    dev = new Dev_MountInfo();
    return dev;
    } private DevInfo getInfo(final int device) {
    // for(String str:cache)
    // System.out.println(str); if (null == info)
    info = new DevInfo(); try {
    initVoldFstabToCache();
    } catch (IOException e) {
    e.printStackTrace();
    } if (device >= cache.size())
    return null;
    String[] sinfo = cache.get(device).split(" "); info.setLabel(sinfo[NLABEL]);
    info.setMount_point(sinfo[NMOUNT_POINT]);
    info.setPath(sinfo[NPATH]);
    info.setSysfs_path(sinfo[NSYSFS_PATH]); return info;
    } /**
     * init the words into the cache array
     * @throws IOException
     */
    private void initVoldFstabToCache() throws IOException {
    cache.clear();
    BufferedReader br = new BufferedReader(new FileReader(VOLD_FSTAB));
    String tmp = null;
    while ((tmp = br.readLine()) != null) {
    // the words startsWith "dev_mount" are the SD info
    if (tmp.startsWith(HEAD)) {
    cache.add(tmp);
    }
    }
    br.close();
    cache.trimToSize();
    } public class DevInfo {
    private String label, mount_point, path, sysfs_path; /**
     * return the label name of the SD card
     * @return
     */
    public String getLabel() {
    return label;
    } private void setLabel(String label) {
    this.label = label;
    } /**
     * the mount point of the SD card
     * @return
     */
    public String getMount_point() {
    return mount_point;
    } private void setMount_point(String mount_point) {
    this.mount_point = mount_point;
    } /**
     * SD mount path
     * @return
     */
    public String getPath() {
    return path;
    } private void setPath(String path) {
    this.path = path;
    } /**
     * "unknow"
     * @return
     */
    public String getSysfs_path() {
    return sysfs_path;
    } private void setSysfs_path(String sysfs_path) {
    this.sysfs_path = sysfs_path;
    } } @Override
    public DevInfo getInternalInfo() {
    return getInfo(DEV_INTERNAL);
    } @Override
    public DevInfo getExternalInfo() {
    return getInfo(DEV_EXTERNAL);
    }
    }interface IDev {
    DevInfo getInternalInfo(); DevInfo getExternalInfo();
    }调用方法:
    Dev_MountInfo dev = Dev_MountInfo.getInstance();
    DevInfo info = dev.getInternalInfo();// Internal SD Card Informations
    info = dev.getExternalInfo();// External SD Card Informations PATH.ROOT_SDCARD_PATH = info.getPath();
    PATH.ROOT_INSIDE_PATH = Environment.getExternalStorageDirectory()
    .getAbsolutePath();
      

  2.   

    原生的android系统,Environment.getExternalStorageDirectory()获取的是外部的sd卡,三星的应该都内置一个sd卡,程序默认读到的都是内置的,外置的sd卡的话,应该是三星另外做了个接口出来的,可以反射查看下Environment类下的接口方法就知道了
      

  3.   

    我用我同学的手机做的测试、 不是三星的  得到的也是内置内存卡的路径
    然后我问了一个做开发的同学  他告诉我是因为现在手机内置内存都比较大了  所以许多手机中直接就把内置内存挂载为sdcard了   而getExternalStorageDirectory()这个方法得到的其实是app可读写的地方  就是这个挂载了的内置内存了   语言表述不是特别好  将就着理解吧  
      

  4.   

    问题最新进度:  按照同学提的意见  因为开发的特殊性   所以直接用了绝对路径   
    可是在绝对路径生成的file中, 无法生成第二层文件夹    即比如先在外置内存卡中已经生成了A这个文件夹,但是在A的文件夹之下无法生成子文件夹  这是为什么? 感觉像是无法对A这个文件夹之下进行任何写入操作一样   这是为什么?
      

  5.   


    文件夹没有时要自己创建的
    对呀   我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊   可是就是死活创建不了    真心不知道为什么   给我的感觉就好像是没有对该文件进行操作的权限一样   不知道为何
      

  6.   


    文件夹没有时要自己创建的
    对呀   我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊   可是就是死活创建不了    真心不知道为什么   给我的感觉就好像是没有对该文件进行操作的权限一样   不知道为何因为获取的路径不对,所以创建不了
      

  7.   


    文件夹没有时要自己创建的
    对呀   我是自己在代码中通过new一个File给路径然后file.mkdirs()来创建A内的子文件夹啊   可是就是死活创建不了    真心不知道为什么   给我的感觉就好像是没有对该文件进行操作的权限一样   不知道为何因为获取的路径不对,所以创建不了
    感觉不是这个原因啊   我这个应用本来之前照片是存在内置内存中的   路径比如是sdcard/AAA/bbb  这里没有任何问题  可以看到内置内存里有AAA文件夹和子文件夹bbb以及bbb里面的照片
    然后我把这个绝对路径直接前缀部分改了其他任何东西都没有改动  即变为:/storage/extSdCard/AAA/bbb   这个外置内存卡的绝对路径导致的结果就是只能在外置内存卡中看到AAA的第一层文件夹  它内部的bbb子文件夹没有生成   这应该不会是因为文件夹路径的问题不对吧?
      

  8.   

    你也可以直接打内存卡的绝对路径,假设你的外内存卡的路径是/storage/sdcard1       那么路径就是:String SdcardPath = "/storage/sdcard1"
      

  9.   

    印象中Android默认的外置内存卡的路径是“/storage/sdcard0”(“/mnt/sdcard”也可以) 可能三星把路径改了,可是获得外置内存卡路径的方法还是用Google原生的。
      

  10.   

    你可以安装root explorer文件管理查看一下路径
      

  11.   

    我用的就是RootExplorer   写的就是绝对路径   现在其实已经可以连接到外置sd卡了   
    问题在于生产文件夹的时候只能在外置sd卡最外层生产   但是内部的子文件夹就没办法生产了  更加无法在生产的第一层文件夹内写入数据了     并不是路径问题找不到
    我的内置内存卡路径是  sdcard/AAA/bbb(或者是/storage/sdcard/AAA/bbb)  我如果是用的这个内置内存卡的路径任何操作和数据的写入等都没有任何问题   一切正常   
    但是如果只是把路径改为外置内存卡绝对路径/storage/extSdCard/AAA/bbb的话  结果就是只能得到最外层的AAA文件夹  但是内部应该还有一个子文件夹bbb却无法得到   然后我做了测试再写了一个File   这个file用的路径就是/storage/extSdCard/AAA/bbb   因为之前已经有了AAA这个文件夹   我判断这个新的file是否存在  然后不存在就调用file.mkdirs() 独立生存内部的bbb这个子文件夹  通过添加判断发现这个文件夹不存在  但是也无法创建bbb这个子文件夹