本文將介紹真機環境下如何獲取內置和外置SD卡路徑。
測試環境:三星Note3,其他手機待測試。。。
所需權限(.xml文件里)
[html]
獲取路徑代碼(.java文件)
[java]
。。; 。io。; 。io。File; 。io。; 。io。; 。util。; 。util。List; 。os。; 。os。; 。app。; 。view。Menu; { @ e(tate){ super。(); (R。。); =(); =(); log。
("內置SD卡路徑:"++"\r\n"); =(); for(:){ log。("外置SD卡路徑:"+path+"\r\n"); } 。out。(log。()); } /** *獲取內置SD卡路徑 *@ */ (){ 。()。(); } /** *獲取外置SD卡路徑 *@應該就一條記錄或空 */ () { =(); try{ =。(); =rt。exec("mount"); =proc。(); =(is); =(isr); ; while((line=br。
())!=null){ if(line。("")) { []arr=line。split(""); =arr[1]; =(path); if(file。()) { 。add(path); } } } isr。close(); }catch(){ } ; } @ (){ //;。 ()。(R。menu。,menu); ; } }
其中sd卡復制顯示找不到路徑,line.("")判斷部分有待進一步驗證!
打印結果:
1. 插入一張外置SD卡后
[plain]
內置SD卡路徑:///0 外置SD卡路徑://
2. 取出外置SD卡后
[plain]
內置SD卡路徑:///0
系統可通過.()獲取存儲卡的路徑,但是現在有很多手機內置有一個存儲空間,同時還支持外置sd卡插入sd卡復制顯示找不到路徑,這樣通過.()方法獲取到的就是內置存儲卡的位置,需要獲取外置存儲卡的路徑就比較麻煩,這里借鑒網上的代碼,稍作修改,在已有的手機上做了測試,效果還可以,當然也許還有其他的一些奇葩機型沒有覆蓋到。
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; } }