开放失败: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