2016-11-12 67 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();