getExternalFilesDir(null) returns null 即使有 READ_EXTERNAL_STORAGE 权限

getExternalFilesDir(null) returns null even with READ_EXTERNAL_STORAGE permission

当我只在清单中声明 READ_EXTERNAL_PERMISSION 时,getExternalFilesDir() returns 为空。如果我声明 WRITE_EXTERNAL_STORAGE,getExternalFilesDir() returns something.

我做了一些检查,看看我是否真的有权限,并检查了是否安装了外部存储。

PackageManager pm = mContext.getPackageManager();
int permRead = pm.checkPermission( Manifest.permission.READ_EXTERNAL_STORAGE, mContext.getPackageName() );
//permRead: "0"
int permWrite = pm.checkPermission( Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()); 
//permWrite: "-1"
String extState = Environment.getExternalStorageState();
// extState: "mounted"

if ( permRead == PackageManager.PERMISSION_GRANTED 
    && extState.equals( Environment.MEDIA_MOUNTED ) )
{
    File dir = mContext.getExternalFilesDir( Environment.DIRECTORY_PICTURES );
    // dir is null here!!
    ... more work...
}

据我了解,我只需要 READ_EXTERNAL_STORAGE 从 getExternalFilesDir() 中获取一些东西。

可能是什么原因?

PS。我的测试设备是装有 Android 4.1.2 的 LG Optimus Pro G,我重新启动了设备。

这是来自 documentation 的注释:

Returns null if external storage is not currently mounted so it could not ensure the path exists;

您可以使用 Environment.getExternalStorageState 检查它的状态。

应用程序的外部存储不 available/mounted 的一种常见情况是设备通过 USB 连接到计算机。当设备安装在计算机上时,外部存储对设备不可用。

这是因为文档说任何声明 WRITE_EXTERNAL_STORAGE 权限的应用程序也被隐式授予读取权限。

试试这个,打开外部存储。

String m_str = Environment.getExternalStorageDirectory()
                .getAbsolutePath().toString();