即使已经获取了READ_EXTERNAL_STORAGE权限,getExternalFilesDir(null)仍返回null

4
当我在清单文件中只声明了READ_EXTERNAL_PERMISSION时,getExternalFilesDir()返回null。如果我声明了WRITE_EXTERNAL_STORAGE,getExternalFilesDir()将返回一些内容。
我进行了一些检查,以确定我是否真的有权限,并检查外部存储器是否已挂载。
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. 我的测试设备是安卓4.1.2系统的LG Optimus Pro G,并且我已经重新启动了设备。

2个回答

2
这是来自文档的一条注释:

如果外部存储器当前未安装,它将返回null,因此无法确保路径存在;

您可以使用Environment.getExternalStorageState检查其状态。
当设备通过USB连接到计算机时,应用程序无法访问外部存储器,这是外部存储器不可用/已挂载的常见情况。在设备挂载到计算机时,外部存储器对设备不可用。

1
我添加了一行代码来调用Environment.getExternalStorageState(),并且得到了“mounted”的结果。但是getExternalFileDir()仍然返回null。 - Vincent
问题是,如果我在清单中声明WRITE_EXTERNAL_STORAGE,getExternalFileDir()会返回一些内容。如果我只声明READ_EXTERNAL_STORAGE,则getExternalFileDir()将返回null。 - Vincent

-1

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


1
我知道WRITE_EXTERNAL授予READ_EXTERNAL。情况是getExternalFileDir()应该返回带有READ_EXTERNAL的内容,但它没有。只有在我拥有WRITE时才会返回一些内容。 - Vincent
我跟你说的是,你必须给予写入权限。 - KishuDroid
1
doc中写道:“要访问属于其他包的路径,需要WRITE_EXTERNAL_STORAGE和/或READ_EXTERNAL_STORAGE。”听起来好像只需要READ就可以了。 - Vincent
外部文件并不总是可用的:如果用户将外部存储挂载到计算机上或移除它,这些文件将会消失。这些文件没有任何安全保障。例如,任何持有WRITE_EXTERNAL_STORAGE权限的应用程序都可以写入这些文件。 - KishuDroid
1
这很有道理,但似乎不适用于我的情况,因为我正在检查外部存储是否已挂载,如 && extState.equals( Environment.MEDIA_MOUNTED ) - Vincent

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