2015-09-25 128 views
3

当我只在我的清单中声明READ_EXTERNAL_PERMISSION时,getExternalFilesDir()返回null。如果我声明WRITE_EXTERNAL_STORAGE,getExternalFilesDir()会返回一些内容。getExternalFilesDir(null)即使具有READ_EXTERNAL_STORAGE权限也会返回null

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

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。我的测试设备是LG Optimus Pro G和Android 4.1.2,并且我重新启动了设备。

回答

1

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

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

最后一些结果! Environment.getExternalStorageDirectory()返回“storage/sdcard0”。但为什么getExternalFilesDir()失败?仍然没有任何解释... – wooohoh

+0

在这个,你可以给文件名全文路径 –

+0

然后工作,我认为 –

1

这是从documentation一张纸条:

返回NULL,如果外部存储当前未安装,因此 不能确保路径存在;

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

外部存储器不可用/挂载应用程序的一种常见情况是设备通过USB连接到计算机的情况。安装在计算机上时,设备无法使用外部存储设备。

+0

我添加了一行来调用Environment.getExternalStorageState(),我得到了“挂载”。但getExternalFileDir()仍然返回null。 – wooohoh

+0

问题是,如果我在清单中声明WRITE_EXTERNAL_STORAGE,getExternalFileDir()会返回一些内容。如果我只声明READ_EXTERNAL_STORAGE,则getExternalFileDir()返回null。 – wooohoh

-1

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

+1

我知道WRITE_EXTERNAL授予READ_EXTERNAL。情况是,getExternalFileDir()应该用READ_EXTERNAL返回一些东西,但事实并非如此。它只在我有WRITE时返回一些东西。 – wooohoh

+0

那我要说的是,你也必须给予WRITE权限 – KishuDroid

+1

[doc](http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String))说_“要访问属于其他包的路径,需要WRITE_EXTERNAL_STORAGE和/或READ_EXTERNAL_STORAGE。”_听起来像READ就足够了。 – wooohoh

相关问题