Android Environment.getExternalStoragePublicDirectory提供内部存储

Android Environment.getExternalStoragePublicDirectory提供内部存储,android,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;

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

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();
}
但是,当我通过windows查找图像时,它位于内存中,gallery会确认这一点:

最后一个是令人困惑的,它表示内部内存,但在文件路径中也有
sdcard0


那么,什么时候外部并不意味着外部?它是一个设备设置的东西,还是一个I miss使用/miss理解
getExternalStoragePublicDirectory

MTP引擎有时会将
getExternalStorageDirectory()
报告为“内部存储”,这就是为什么在Windows、Linux等上以卷的形式装载设备时,它会显示在该名称下


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

如果
getExternalStorageDirectory
以这种方式运行,我应该如何获取SD卡的路径?谢谢,但我使用的是
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u DCIM)
而且它没有放在物理SD卡上。@weston:根据设备制造商的说法,它不应该放在物理SD卡上。引用我在之前的评论中链接到的文档:“使用内部存储分区作为外部存储的设备也可能提供SD卡插槽。在这种情况下,SD卡不是外部存储的一部分,您的应用程序无法访问它(额外存储仅用于系统扫描的用户提供的介质)。好的,我现在明白了为什么会这样。这无助于我将文件放在sd卡上。我的用户不明白他们的内置摄像头应用程序如何使用sd卡,而我的应用程序不能。所以,你是说,如果设备具有内部存储,则无法写入sd卡?@pillesoft:“我的意思是,如何确保您真的将文件保存到物理SD卡?”--除了几个特定于应用程序的位置之外,您在Android 4.4+上没有可移动存储的文件系统访问权限。“您有Android提供的解决方案吗?”?“--在Android 7.0之前,你想要什么是不可能的,在Android 7.0之前,你可以访问
StorageVolume
(经用户批准)。对于Android 5.0-6.0,你可以使用
ACTION\u OPEN\u DOCUMENT\u TREE
,让用户允许你访问文档树,但这可能不是你想要的魔法。