如何在安卓系统中获取SD卡中文件的路径

37

大家好,我在SD卡中有一些MP3文件。如何从SD卡获取MP3歌曲的文件路径。

请帮助我。


1
希望这个链接能够帮到你:https://dev59.com/ZG025IYBdhLWcg3w960W - user3530896
6个回答

55

您可以使用以下代码获取SD卡路径:

File extStore = Environment.getExternalStorageDirectory();

然后指定文件夹名称和文件名。

例如:

"/LazyList/"+serialno.get(position).trim()+".jpg"

26
我的手机(运行Android 4.1.2)有一个内置存储 /storage/sdcard0 和一个 SD 卡 /storage/sdcard1。Environment.getExternalStorageDirectory().getAbsolutePath() 返回 /storage/sdcard0。有没有办法获取 SD 卡的路径,即 /storage/sdcard1?需要硬编码吗? - rml
12
Environment.getExternalStorageDirectory() 返回的是 "/storage/emulated/0",而我的SD卡实际上位于 "/storage/extSdCard/"。 - joshgoldeneagle

18

Environment.getExternalStorageDirectory()不会返回micro SD卡存储的路径。

如何在Android中从SD卡获取文件路径

通过sd卡,我假设你指的是可拆卸的micro SD卡

在API级别19即Android 4.4 Kitkat中,他们在Context类中添加了File[] getExternalFilesDirs (String type),允许应用将数据/文件存储在micro SD卡上。

Android 4.4是该平台的首个版本,实际上允许应用使用SD卡进行存储。在API级别19之前对SD卡的任何访问都是通过私有、不受支持的API进行的。

Environment.getExternalStorageDirectory()API级别1开始就存在了。

getExternalFilesDirs(String type)返回所有共享/外部存储设备上应用程序专用目录的绝对路径。这意味着它将返回内部和外部存储器的路径。通常,第二个返回的路径将是microSD卡的存储路径(如果有)。

但请注意,

共享存储可能并不总是可用,因为用户可以弹出可移动介质。可以使用getExternalStorageState(File)来检查介质状态。

这些文件没有任何安全性可言。例如,任何持有WRITE_EXTERNAL_STORAGE权限的应用程序都可以写入这些文件。

根据Google/官方Android文档,内部和外部存储的术语与我们想象的非常不同


2
回答很有趣,但为了完整起见,您应该包括包含getExternalFilesDirs方法的类。dv表示不完整。 - bharal
1
@bharal,这就是我提供超链接的原因。当用户点击时,它将重定向到Android官方文档,其中包含所有详细信息。 - AnV

12

实际上,某些设备中外部SD卡的默认名称显示为extSdCard,而对于其他设备,则为sdcard1。此代码片段有助于找到确切的路径,并帮助您检索外部设备的路径。

String sdpath,sd1path,usbdiskpath,sd0path; 

if(new File("/storage/extSdCard/").exists()) 
{ 
  sdpath="/storage/extSdCard/";
  Log.i("Sd Cardext Path",sdpath); 
} 
if(new File("/storage/sdcard1/").exists()) 
{ 
  sd1path="/storage/sdcard1/";
  Log.i("Sd Card1 Path",sd1path); 
} 
if(new File("/storage/usbcard1/").exists()) 
{ 
  usbdiskpath="/storage/usbcard1/";
  Log.i("USB Path",usbdiskpath); 
} 
if(new File("/storage/sdcard0/").exists()) 
{ 
  sd0path="/storage/sdcard0/";
  Log.i("Sd Card0 Path",sd0path); 
}

1
很好的解决方案,这些都是 SD 卡可能用到的名字吗? - Samvel Kartashyan
1
@SamvelKartashyan 当然不是! :) 例如,我们有一个设备,其中SD卡安装在“/storage/ext_sd/”上,另一个设备则在“/mnt/sdcard/”上。 - Antonio

3

通过使用以下代码,您可以找到所有音频歌曲文件的名称、路径、大小等各种信息。

String[] STAR = { "*" };     
Uri allaudiosong = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String audioselection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
Cursor cursor;
cursor = managedQuery(allaudiosong, STAR, audioselection, null, null);

if (cursor != null) {
    if (cursor.moveToFirst()) {
        do {
            String song_name = cursor
                   .getString(cursor
                             .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
            System.out.println("Audio Song Name= "+song_name);

            int song_id = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.Audio.Media._ID));
            System.out.println("Audio Song ID= "+song_id);

            String fullpath = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.DATA));
            System.out.println("Audio Song FullPath= "+fullpath);

            String album_name = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ALBUM));
            System.out.println("Audio Album Name= "+album_name);

            int album_id = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
            System.out.println("Audio Album Id= "+album_id);

            String artist_name = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ARTIST));
            System.out.println("Audio Artist Name= "+artist_name);

            int artist_id = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));
            System.out.println("Audio Artist ID= "+artist_id);

        } while (cursor.moveToNext());

1

正如一些人所指出的那样,官方认可的答案并没有完全返回外部可移动SD卡。我遇到了以下线程,提出了一种我已经在一些Android设备上测试过并且似乎可靠的方法,所以我想在这里重新分享,因为我在其他回复中没有看到它:

http://forums.androidcentral.com/samsung-galaxy-s7/668364-whats-external-sdcard-path.html

赞扬paresh996提供的答案本身,我可以证明我在三星S7和S7edge上尝试过,似乎有效。
现在,我需要一种返回有效路径以读取文件并考虑可能没有外部SD卡的方法,在这种情况下应返回内部存储器,因此我修改了paresh996的代码如下:
File getStoragePath() {
    String removableStoragePath;
    File fileList[] = new File("/storage/").listFiles();
    for (File file : fileList) {
       if(!file.getAbsolutePath().equalsIgnoreCase(Environment.getExternalStorageDirectory().getAbsolutePath()) && file.isDirectory() && file.canRead()) {
            return file;
        }
    }
    return Environment.getExternalStorageDirectory();
}

0
也许你有我曾经遇到的同样问题,我的平板电脑上有一个SD卡,在/mnt/sdcard路径下,而外部SD卡在/mnt/extcard路径下,在Android文件管理器中可以查看,进入您的SD卡并查看其路径。

希望能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接