在Android模拟器中如何模拟一个真实的外部SD(更新:可移动存储)卡。

4

我试图模拟一个外部SD卡,就像在真实设备中一样。

在真实设备中,除非使用新的“存储访问框架”(API 21和22),否则外部SD卡是不可写的。

当我添加一个带有文件或大小的SD卡时...

enter image description here

我总是得到一个可写的SD卡,这在真实设备中是不正确的(我猜)。我可以仅使用以下代码(我知道,我不应该直接访问,但这只是为了测试是否具有写入权限)创建“CreateFolder”文件夹:

        String spathWriteTest="/storage/sdcard/";
        new File(spathWriteTest + "createFolder").mkdir();

有没有想法如何模拟一个真正的外部SD卡?

1
访问规则将取决于SD卡是主要的还是次要的外部存储。在模拟器或其他没有其他内容的设备上,它将是主要的。您想探索它是次要的行为。我不知道模拟器是否支持这一点而无需进行代码级修改。您可以考虑创建其他东西,以类似的方式公开文档以进行测试。此外,我认为您也可以使用更抽象的API来访问主存储 - 即使您也可以直接访问它,因此实际上只有决策逻辑无法测试。 - Chris Stratton
谢谢Chris。最后,我想模拟从API 21和22开始提供的新外部存储功能的写入访问权限。我想测试新的Intent“ACTION OPEN DOCUMENT TREE”来将写入访问权限持久化到特定文件夹,但这需要一个不可写的外部存储作为前提条件。我可以购买一台带有棒棒糖系统的设备,并且具有外部存储插槽,但我认为这应该是可以模拟的。 - mcfly soft
我相信你会发现,你可以使用“ACTION OPEN DOCUMENT TREE”作为模拟器的主要外部存储,以及假设的次要存储。你只需要编写你的程序来仅使用那个和由此产生的抽象访问机制,而不是通过直接访问字面文件来“作弊”。 - Chris Stratton
当然在模拟器中这会有效,因为我有写入权限。但是模拟的目的是模拟真实设备。我想我对CommonsWare解释的术语感到困惑。我想要模拟“可移动存储”,而不是“外部存储”。 - mcfly soft
如果你想测试这个,不要使用直接的文件访问方式,即使模拟器允许这样做。相反,使用你正在尝试测试的抽象API。 - Chris Stratton
显示剩余8条评论
1个回答

4
当您设置一个AVD并且它涉及到“SD卡”时,实际上是指外部存储而不是可移动存储。模拟器不会模拟可移动存储。您可以尝试看看Genymotion是否模拟可移动存储。

感谢您的解释。所以这是我造成的术语混淆。我阅读了您提供的文章。非常有趣,谢谢。我不知道我是否理解正确。getExternalFilesDirs()是否也返回可移动存储的路径? - mcfly soft
1
我已经检查了Genymotion,但是我没有找到任何可移动存储。当然,我没有检查所有可用的版本。 - mcfly soft
@user1344545:在Android 4.4及以上版本中,getExternalFilesDirs()方法是否也会返回可移动存储路径?如果该方法返回2个或更多条目,则第二个及后续条目应位于可移动存储上。 - CommonsWare
@CommonsWare 没错,你应该在每个文件上调用 isExternalStorageRemovable(File) 来确认它是否真的可移动。这是在 Android 5.0 (API 21) (LOLLIPOP) 中添加的。 - Joshua Pinter

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