【问题标题】:permission denied on creating new file in external storage在外部存储中创建新文件的权限被拒绝
【发布时间】:2015-12-05 12:37:08
【问题描述】:

如果该文件不存在,我想在外部存储中创建一个新文件。 我已经在 SO 中阅读了类似的问题,并且在我的清单中有 WRITE_EXTERNAL_STORAGE 许可。 在使用 android 5.1 和 xperia t 使用 android 4.3 的 GenyMotion 模拟器上进行测试,结果是相同的,我在 file.createNewFile() 上得到“open failed: EACCES (Permission denied)”。我检查了运行时,getExternalStorageState functoin 返回值为“MOUNTED”

注意:如果我手动创建文件,我的代码可以完美运行并读取内容,这意味着可以访问外部存储。 我虽然使用getExternalPublicStorage 将代码中的另一个位置写入外部存储以保存捕获的图像,但它工作正常!

File f = Environment.getExternalStorageDirectory();
File config = new File(f, "poinila config" + ".txt");
if (!config.exists()) {
    if (!config.createNewFile()) {
        // toast that creating directory failed
    } else {
        writeDefaultIpPort();
    }
}

编辑: 路径字符串为“/storage/sdcard0/poinila config.txt”

【问题讨论】:

  • 你检查这个link
  • '如果我手动创建文件,我的代码可以完美运行' ???请解释“手动”以及它与您的代码有什么关系。
  • 'Logger.toast("创建目录失败");'.目录???
  • @greenapps:“手动”是指不通过应用程序代码创建文件。就像通过文件管理器创建一样,或者将现有的同名文件复制到外部存储目录中。
  • Logger.toast("... Directory") 是个失误!我会改正的。

标签: android android-external-storage


【解决方案1】:

我认为这是 android 中引入的新安全功能。运行时权限。你必须做这样的事情

           int hasReadExternalStoragePermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);
            if(hasReadExternalStoragePermission != PackageManager.PERMISSION_GRANTED)
                if (shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE))
                    new AlertDialog.Builder(getContext())
                            .setMessage("You need to Allow access to Images to set a Company Logo")
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    requestPermission();
                                }
                            }).show();
                    else
                        requestPermission();
            else
                callChooser();

【讨论】:

    【解决方案2】:

    我有同样的问题。我认为这是路径中缺少的 / 。试试这个:

    config = new File(Environment.getExternalStorageDirectory() + "/" +  "poinila config.txt" );
    

    希望对你有帮助

    【讨论】:

    • 你能发布完整的堆栈跟踪吗?还有路径字符串?
    • 奇怪的是,堆栈跟踪没有打印在控制台中!但是在调试模式下捕获异常时我会附上图像。路径字符串添加到问题
    • 据我所知,所有异常cause 字段都是“libcore.io.ErrnoException: open failed: EACCES (Permission denied)”
    • 我仍然认为这是一个路径问题。在 /storage/emulated/0/ 上试一试。这应该是指内部的“sd-card”。
    • 我试过了(在模拟器和真实设备上),结果是一样的
    【解决方案3】:

    您的许可在清单文件中的位置是否正确

      <application>
            ...
    
        </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        </manifest>
    

    【讨论】:

    • 我仔细检查过,是的,权限在正确的位置
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2011-10-01
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多