开放失败:EACCES(权限被拒绝)“在Android上

我正进入(状态

开放失败: EACCES (Permission denied)

OutputStream myOutput = new FileOutputStream(outFileName);

我检查了根,我试过android.permission.WRITE_EXTERNAL_STORAGE

我该如何解决这个问题?

 try { InputStream myInput; myInput = getAssets().open("XXX.db"); // Path to the just created empty db String outFileName = "/data/data/XX/databases/" + "XXX.db"; // Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); // Transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } // Close the streams myOutput.flush(); myOutput.close(); myInput.close(); buffer = null; outFileName = null; } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } 

我有同样的问题… <uses-permission是在错误的地方。 这是对的:

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

uses-permission标签需要在application标签之外。

对于API 23+,即使它们已经在您的清单中,您也需要请求读/写权限。

 // Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * Checks if the app has permission to write to device storage * * If the app does not has permission then the user will be prompted to grant permissions * * @param activity */ public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions( activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE ); } } 

AndroidManifest.xml中

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

有关请求API 23+权限的官方文档,请查看https://developer.android.com/training/permissions/requesting.html

在仿真器中运行应用程序时,我观察过一次。 在仿真器设置中,您需要正确指定外部存储(“SD卡”)的大小。 默认情况下,“外部存储”字段为空,这可能意味着没有这样的设备,并且即使在清单中授予权限也会引发EACCES。

除了所有的答案之外,请确保您没有将您的手机用作USB存储设备。

HTC Sensation在启用USB存储模式时遇到同样的问题。 我仍然可以debugging/运行应用程序,但我不能保存到外部存储。

我的问题是“TargetApi(23)”,如果你的minSdkVersion低于23,就需要这个。

所以,我有以下代码段的请求权限

 protected boolean shouldAskPermissions() { return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1); } @TargetApi(23) protected void askPermissions() { String[] permissions = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; int requestCode = 200; requestPermissions(permissions, requestCode); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... if (shouldAskPermissions()) { askPermissions(); } } 

事实certificate,这是一个愚蠢的错误,因为我的手机仍然连接到台式电脑,并没有意识到这一点。

所以我不得不closuresUSB连接,一切正常。

我在Samsung Galaxy Note 3上遇到了同样的问题,运行CM 12.1。 我的问题是,我有

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/> 

并不得不使用它来拍摄和存储用户的照片。 当我试图在ImageLoader中加载这些相同的照片时,我得到了(Permission denied)错误。 解决scheme是明确添加

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

因为上面的权限只限制了API版本18的写入权限,并且具有读权限。

我期望下面的所有内容/data属于“内部存储”。 但是,您应该可以写入/sdcard

我有同样的问题,没有任何build议帮助。 但我发现一个有趣的原因,在一个物理设备, 银河标签 。

USB存储打开时,外部存储读写权限不起作用。 只需closuresUSB存储设备,并使用正确的权限,即可解决问题。

除了所有的答案之外,如果客户端使用的是Android 6.0,Android为(棉花糖)添加了新的权限模型 。

诀窍:如果您的目标版本是22或以下,那么您的应用程序将在安装时请求所有权限,就像在运行低于棉花糖的操作系统的任何设备上一样。 如果你正在尝试在模拟器上,那么从android 6.0开始,你需要明确地去设置 – > apps-> YOURAPP – >权限,如果你有任何的权限,更改权限。

当您的应用程序属于系统应用程序时,它不能访问SD卡。

更改/system/etc/permission/platform.xml的权限属性
和团体需要提到如下。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> <group android:gid="sdcard_rw" /> <group android:gid="media_rw" /> </uses-permission> 

奇怪的是,在我的新文件之前加了斜杠“/” ,我的问题就解决了。 我改变了这个:

 File myFile= new File(Environment.getExternalStorageDirectory() + "newFile"); 

对此:

 File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile"); 

当我试图在Galaxy S5(android 6.0.1)上的DCIM / camera文件夹中写入图像时,我遇到了同样的错误,我发现只有这个文件夹是受限制的。 我只是可以写入DCIM /任何文件夹,但不能在相机。 这应该是基于品牌的限制/定制。

我正在创build一个文件夹/ data /在我的init.rc(用Nexus 7上的aosp打搅),正是这个问题。

事实certificate,给文件夹rw(666)的权限是不够的,它必须是rwx(777),那么这一切工作!

如果您通过以下adb命令拥有根设备,则可以绕过后置6.0执行的存储权限:

 root@msm8996:/ # getenforce getenforce Enforcing root@msm8996:/ # setenforce 0 setenforce 0 root@msm8996:/ # getenforce getenforce Permissive 

在清单中添加权限。

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

也许答案是这样的:

在API> = 23的设备上,如果您安装了应用程序(该应用程序不是系统应用程序),您应该检查“设置 – 应用程序”中的存储权限,每个应用程序都有权限列表,您应该检查它! 尝试

我有同样的问题(API> = 23)。

解决schemehttps://stackoverflow.com/a/13569364/1729501为我工作,但断开应用程序debugging是不实际的。

我的解决scheme是在Windows上安装适当的adb设备驱动程序。 谷歌USB驱动程序不适用于我的设备。

第1步:为您的设备品牌下载adb​​驱动程序。

第2步:转到设备pipe理器 – >其他设备 – >用单词“adb”查找条目 – >select更新驱动程序 – >在步骤1中指定位置

在我的情况下,我正在使用一个文件select器库 ,它返回到外部存储的path,但它从/root/开始。 即使在运行时授予WRITE_EXTERNAL_STORAGE权限,我仍然有错误EACCES(权限被拒绝)
因此,使用Environment.getExternalStorageDirectory()来获取到外部存储的正确path。

例:
不能写: /root/storage/emulated/0/newfile.txt
可以写: /storage/emulated/0/newfile.txt

 boolean externalStorageWritable = isExternalStorageWritable(); File file = new File(filePath); boolean canWrite = file.canWrite(); boolean isFile = file.isFile(); long usableSpace = file.getUsableSpace(); Log.d(TAG, "externalStorageWritable: " + externalStorageWritable); Log.d(TAG, "filePath: " + filePath); Log.d(TAG, "canWrite: " + canWrite); Log.d(TAG, "isFile: " + isFile); Log.d(TAG, "usableSpace: " + usableSpace); /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } 

输出1:

 externalStorageWritable: true filePath: /root/storage/emulated/0/newfile.txt isFile: false usableSpace: 0 

输出2:

 externalStorageWritable: true filePath: /storage/emulated/0/newfile.txt isFile: true usableSpace: 1331007488