2015-10-28 41 views
0

我的应用程序将从其他设备接收的文件存储在外部存储器中。它适用于具有不可拆卸sd卡的设备当应用程序没有插入时,应用程序在装有可移动SD卡的设备上崩溃

问题出在galaxy tab4上,当外部sd卡未插入时。

我使用下面的行获取文件路径

String filePath=Environment.getExternalStorageDirectory()+"/BFT/"; 

我想要做的是,如果外置SD卡是可移动的,而不是插入我要创建在设备中的上述目录存储(在Galaxy S4中提供了16 GB)。

我因为星系很困惑S4中工作正常,但它使用Environment.getExternalStorageDirectory()+“/ BFT /”时,该目录中存储

This is where it is stored on S4

如何使它在tab4或任何其他设备上工作时,可能会崩溃当外部SD卡是可移动的,没有插入,我用上面的线。

我只是想在设备上创建一个文件夹,而不管它的存储架构是什么。特定的代码是赞赏或至少是什么导致错误(我知道目录没有找到,但为什么?)。

+0

您只需在操作其目录之前检查ExternalStorage是否可用。 –

回答

0

你需要使用它

getExternalStorageState() 返回主共享/外部存储介质的当前状态之前得到外部存储目录的状态。

Returns 
one of MEDIA_UNKNOWN, MEDIA_REMOVED, MEDIA_UNMOUNTED, MEDIA_CHECKING, MEDIA_NOFS, MEDIA_MOUNTED, MEDIA_MOUNTED_READ_ONLY, MEDIA_SHARED, MEDIA_BAD_REMOVAL, or MEDIA_UNMOUNTABLE. 

而且ExternalStorage并不总是意味着外部

注意:不要用这个词混淆 “外部” 在这里。该目录 可以更好地被认为是媒体/共享存储。它是一个文件系统,它可以容纳相对较大数量的数据,并在所有应用程序间共享(不强制执行权限) 。传统上,这是SD卡的 ,但它也可以作为 设备中的内置存储设备实现,该设备与受保护的内部存储设备不同,并且可以将 作为文件系统安装在计算机上。

有关External Storage

+0

明白了......但在tab4中,如果它没有安装....我仍然希望将它存储在设备内存中(16 GB在我的情况下)。即使外部存储器不可用,我也只想将其存储起来。 –

+0

您正在创建一个BFT文件夹,然后它就存在于设备上。 –

+0

我试着在设备存储上创建它。但是,通过使用Environment.getExternalStorageDirectory +“/ BFT /”没有发现它,因为sd卡没有像你说的那样挂载。但是如果我想使用该设备存储呢? –

0

更多信息原来的Environment.getExternalDirectory(),而对他人它显示设备存储(两者都是外部存储装置而不是内部)返回在某些设备可移除SD卡路径。

要显示已安装的外部存储的列表,我使用了此类的getStorageList(),然后选择一个可用的外部存储。与较新的设备处理多个安装点对于像Galaxy系列三星的外接存储设备时

public class StorageUtils { 

private static final String TAG = "StorageUtils"; 

public static class StorageInfo { 

    public final String path; 
    public final boolean readonly; 
    public final boolean removable;  
    public final int number; 

    StorageInfo(String path, boolean readonly, boolean removable, int number) { 
     this.path = path; 
     this.readonly = readonly; 
     this.removable = removable;   
     this.number = number; 
    } 

    public String getDisplayName() { 
     StringBuilder res = new StringBuilder(); 
     if (!removable) { 
      res.append("Internal SD card"); 
     } else if (number > 1) { 
      res.append("SD card " + number); 
     } else { 
      res.append("SD card"); 
     } 
     if (readonly) { 
      res.append(" (Read only)"); 
     } 
     return res.toString(); 
    } 
} 

public static List<StorageInfo> getStorageList() { 

    List<StorageInfo> list = new ArrayList<StorageInfo>(); 
    String def_path = Environment.getExternalStorageDirectory().getPath(); 
    boolean def_path_removable = Environment.isExternalStorageRemovable(); 
    String def_path_state = Environment.getExternalStorageState(); 
    boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED) 
           || def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY); 
    boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY); 

    HashSet<String> paths = new HashSet<String>(); 
    int cur_removable_number = 1; 

    if (def_path_available) { 
     paths.add(def_path); 
     list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1)); 
    } 

    BufferedReader buf_reader = null; 
    try { 
     buf_reader = new BufferedReader(new FileReader("/proc/mounts")); 
     String line; 
     Log.d(TAG, "/proc/mounts"); 
     while ((line = buf_reader.readLine()) != null) { 
      Log.d(TAG, line); 
      if (line.contains("vfat") || line.contains("/mnt")) { 
       StringTokenizer tokens = new StringTokenizer(line, " "); 
       String unused = tokens.nextToken(); //device 
       String mount_point = tokens.nextToken(); //mount point 
       if (paths.contains(mount_point)) { 
        continue; 
       } 
       unused = tokens.nextToken(); //file system 
       List<String> flags = Arrays.asList(tokens.nextToken().split(",")); //flags 
       boolean readonly = flags.contains("ro"); 

       if (line.contains("/dev/block/vold")) { 
        if (!line.contains("/mnt/secure") 
         && !line.contains("/mnt/asec") 
         && !line.contains("/mnt/obb") 
         && !line.contains("/dev/mapper") 
         && !line.contains("tmpfs")) { 
         paths.add(mount_point); 
         list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++)); 
        } 
       } 
      } 
     } 

    } catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     if (buf_reader != null) { 
      try { 
       buf_reader.close(); 
      } catch (IOException ex) {} 
     } 
    } 
    return list; 
} 
} 

这个问题面临。

相关问题