通过ADB获取SD卡目录

31

我正在制作一个应用程序,通过adb从设备sdcard中获取文件(由Android应用程序保存)。问题是不同的设备有不同的sdcard目录

例如:

  • sdcard
  • sdcard/external_sd

首先我想到了以下解决方案:

  1. 运行adb shell
  2. ls
  3. 检查是否存在"sdcard"目录
  4. 如果存在,则运行sdcard/ ls并检查是否存在external_sd目录
  5. 返回值。

但问题是我有两个三星设备GT-I9100和GT-I9000,它们都有一个目录sdcard/external_sd。当我检查System.getenv("EXTERNAL_STORAGE")时,其中一个返回sdcard,另一个返回sdcard/external_sd。我需要拉取先前保存到System.getenv("EXTERNAL_STORAGE")的文件。

所以问题是:是否有任何命令可以直接从adb获取sdcard目录,而无需访问Android代码?

或者我可以使用adb的am start启动活动,并获取返回值吗?这可行吗?

编辑:找到了解决方案:

adb shell echo $EXTERNAL_STORAGE

你可能想要转义 $ - Blackbelt
1
当我使用 adb shell echo $EXTERNAL_STORAGE 时,它会自动转义 $。当我按照以下步骤操作时:
  1. adb shell
  2. echo $EXTERNAL_STORAGE 我必须以 exit 结束以转义 $。
- Paweł
重复的问题:http://android.stackexchange.com/q/14105/32571 - janot
3个回答

28

就此而言,使用$EXTERNAL_STORAGE变量可能会给您带来误导性的结果。我这里有一台HP Slate平板电脑,它的EXTERNAL_STORAGE变量设置为/storage/sdcard0。 然而,在使用Shell中的df(磁盘空间)命令或甚至是mount命令来显示可用空间或挂载时,以下情况变得明显:

shell@android:/ $ df
Filesystem             Size   Used   Free   Blksize
/dev                  452.7M  36.0K  452.7M   4096
/mnt/asec             452.7M  0.0 K  452.7M   4096
/mnt/obb              452.7M  0.0 K  452.7M   4096
/system               629.9M  468.5M  161.5M   4096
/data                 5.7 G  2.3 G  3.5 G   4096
/cache                435.9M  16.4M  419.5M   4096
/storage/sdcard0      5.7 G  2.3 G  3.5 G   4096
/mnt/external_sd      29.3G  64.0K  29.3G   32768

因此,外部SD卡实际上位于/mnt/external_sd,而不是EXTERNAL_STORAGE返回的值(即内部存储器)。


这应该是答案。谢谢约翰! - Mouradif
非常好的回答。谢谢。 - frogoscar

25

如果我没有误解你的意思,你想要的是类似这样的东西:

emanuele@Nabucodonosor:~$ adb shell cd \$EXTERNAL_STORAGE
emanuele@Nabucodonosor:~$ adb shell ls \$EXTERNAL_STORAGE
emanuele@Nabucodonosor:~$ adb shell echo \$EXTERNAL_STORAGE

2
根据您的评论,我找到了解决方案“adb shell echo $EXTERNAL_STORAGE”,非常感谢。 - Paweł
这不是正确的答案。John Deaux的答案很好。 - frogoscar
在我的设备上,$EXTERNAL_STORAGE实际上是内部存储,原因很愚蠢。John Deaux是正确的,df 是正确的方法! - kontextify
答案非常老旧。 - Blackbelt

0

建议使用getExternalStorageDirectory()而不是System.getenv("EXTERNAL_STORAGE"),这将为你提供不受设备影响的外部存储目录。


1
不考虑设备的话,您的意思是 System.getenv("EXTERNAL_STORAGE") 在某些设备上无法工作? - Paweł
getExternalStorageDirectory() 表示外部应用存储,而非外部设备存储。谷歌似乎有一个设计时代,将可扩展的设备内存从 Android 中移除。他们正在恢复,但结果很混乱。在 Lollipop 之后,挂载外部存储(SD 卡、USB、网络驱动器等)应该是直接的。 - Dominic Cerisano
我想从shell脚本访问sdcard,这个答案帮了我很多。我不明白为什么人们要投反对票... - Kamran Ahmed

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