2016-11-12 71 views
0

我是新来的android,我试了很多代码,但无法获取路径。 但使用下面的代码,我得到了外部SD卡的路径,但无法访问外部SD卡目录。外部Sd卡打印

public static List<StorageInfo> getStorageList() { 

    List<StorageInfo> list = new ArrayList<StorageInfo>(); 
    String def_path = Environment.getExternalStorageDirectory().getPath(); 
    boolean def_path_internal = !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); 
    BufferedReader buf_reader = null; 
    try { 
     HashSet<String> paths = new HashSet<String>(); 
     buf_reader = new BufferedReader(new FileReader("/proc/mounts")); 
     String line; 
     int cur_display_number = 1; 
     while ((line = buf_reader.readLine()) != null) {    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 (mount_point.equals(def_path)) { 
       paths.add(def_path); 
       list.add(0, new StorageInfo(def_path, def_path_internal, readonly, -1)); 
      } else 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, false, readonly, cur_display_number++)); 
       } 
      } 
     } 
     } 

     if (!paths.contains(def_path) && def_path_available) { 
      list.add(0, new StorageInfo(def_path, def_path_internal, def_path_readonly, -1)); 
     } 

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

如何访问Sd卡目录。

+0

你是什么意思?出了什么问题?非常模糊的谈话。 – greenapps

+0

Indead。该代码甚至不尝试访问目录。让它成为一个SD卡目录。你是对的。 – greenapps

+0

但是,如果你有路径,然后显示它。 – greenapps

回答

0

从android 23+开始,您需要获得用户权限才能写入手机的外部存储设备。通过添加以下到您的清单做到这一点:

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

如果这不会给你访问的SD卡,那么你可能需要在运行时尝试访问该卡前请求许可。这里有一个例子:

public void checkPermissions() { 
    String[] tmp = {"WRITE_EXTERNAL_STORAGE"}; 
    for (String s : tmp) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (!hasPermissionInManifest(getBaseContext(), s)) { 
       if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) 
         != PackageManager.PERMISSION_GRANTED) { 
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
       } 
      } 
     } 
    } 
} 

您需要的权限来访问其他传感器在手机和摄像头,可以以类似的方式来完成。你可以像这样得到外部存储的路径:

Environment.getExternalStorageDirectory().toString();