Environment.getExternalStoragePublicDirectory提供内部存储

wes*_*ton 15 android

我正在保存这样一张照片:

File dcimDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File picsDir = new File(dcimDir, "MyPics");
picsDir.mkdirs(); //make if not exist
File newFile = new File(picsDir, "image.png"));
OutputStream os;
try {
    os = new FileOutputStream(newFile);

    target.compress(CompressFormat.PNG, 100, os);

    os.flush();
    os.close();
    b.recycle();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我通过Windows查找图像时,它位于内部存储器中,图库确认了这一点:

在PC上

画廊细节

最后一个是令人困惑的,它说内部存储器,但后来也有sdcard0文件路径.

那么外部什么时候不代表外部?它是设备设置的东西,还是我错过使用/错过理解getExternalStoragePublicDirectory

Com*_*are 14

MTP引擎有时会报告getExternalStorageDirectory()为"内部存储",这就是为什么当您将设备作为卷安装在Windows,Linux等上时它会以该名称显示的原因.

外部存储始终意味着用户可以通过USB电缆访问存储."内部存储"标签可能用于外部存储器是板载("内部")闪存的一部分的设备上.

  • 如果`getExternalStorageDirectory`以这种方式运行,我应该如何获得SD卡的路径? (3认同)
  • 好的,我现在明白为什么它会这样运作.不帮我把文件放在SD卡上.我的用户不明白他们内置的相机应用程序如何使用SD卡而我的应用程序无法使用.那么,你是说如果设备有内部存储,写入SD卡是不可能的? (3认同)
  • 谢谢,但我正在使用`Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)`并且它没有放在物理SD卡上. (2认同)
  • @weston:根据您设备的制造商,它不应该放在物理SD卡上.在我之前的评论中引用我链接到的文档:"使用外部存储器的内部存储分区的设备也可能提供SD卡插槽.在这种情况下,SD卡不是外部存储器的一部分存储和您的应用无法访问它(额外的存储仅适用于系统扫描的用户提供的媒体)". (2认同)
  • @pillesoft:“我的意思是如何确保您确实将文件保存到物理SD卡?” -在几个特定于应用程序的位置之外,您无权访问Android 4.4+上的可移动存储的文件系统。“您为此有任何android提供的解决方案吗?” -在Android 7.0之前,您想要的东西并不是完全不可能的,在Android 7.0上,您可以访问`StorageVolume`(需要用户批准)。对于Android 5.0-6.0,您可以使用“ ACTION_OPEN_DOCUMENT_TREE”让用户向您提供对文档树的访问权限,但它可能并不是您所追求的魔术。 (2认同)