如何避免'#34; EACCES权限被拒绝n#34;使用KITKAT 4.4.2版本在SDCARD上。来自谷歌的新政策

时间:2014-03-14 13:15:15

标签: android file-permissions android-4.4-kitkat

使用android kitkat 4.4.2版本是针对writeaccess实施的新google策略,到目前为止我还不明白。

我在其他应用中阅读了很多关于这个问题的内容。他们得到“EACCES权限被拒绝”。我的应用程序需要编写/解压缩zipfile,也写入sqlite数据库。

如何通过Android版本4.4.2 KITKAT解决此EACCES权限被拒绝的问题?

4 个答案:

答案 0 :(得分:9)

来自文档:

从Android 4.4开始,多个外部存储设备通过 Context.getExternalFilesDirs(),Context.getExternalCacheDirs()和Context.getObbDirs()浮出水面。

通过这些API浮出的外部存储设备必须是设备的半永久性部分(例如电池盒中的SD卡插槽)。开发人员希望存储在这些位置的数据能够长时间使用。因此,不应通过这些API显示瞬态存储设备(如USB大容量存储驱动器)。

WRITE_EXTERNAL_STORAGE权限只能授予对设备上主外部存储的写访问权限。不得允许应用程序写入辅助外部存储设备,但合成权限允许的特定于程序包的目录除外。以这种方式限制写入可确保系统在卸载应用程序时清理文件。

答案 1 :(得分:7)

我在xda forum找到了解决此问题的有效方案;没有必要生根。
这是一个例子:

/**
 * Returns an OutputStream to write to the file. The file will be truncated immediately.
 */
public OutputStream write()
        throws IOException {
    if (file.exists() && file.isDirectory()) {
        throw new IOException("File exists and is a directory.");
    }

    // Delete any existing entry from the media database.
    // This may also delete the file (for media types), but that is irrelevant as it will be truncated momentarily in any case.
    String where = MediaStore.MediaColumns.DATA + "=?";
    String[] selectionArgs = new String[] { file.getAbsolutePath() };
    contentResolver.delete(filesUri, where, selectionArgs);

    ContentValues values = new ContentValues();
    values.put(MediaStore.Files.FileColumns.DATA, file.getAbsolutePath());
    Uri uri = contentResolver.insert(filesUri, values);

    if (uri == null) {
        // Should not occur.
        throw new IOException("Internal error.");
    }

    return contentResolver.openOutputStream(uri);
}

答案 2 :(得分:2)

你需要像这样询问机器人关于实时的权限:

private static final int MY_PERMISSIONS_REQUEST_STORAGE = 123456;

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_STORAGE);
}

@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_STORAGE: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Intent chooserIntent = cameraHelper.openImageIntent();
                    startActivityForResult(chooserIntent, MY_PERMISSIONS_REQUEST_STORAGE);
                }
            }
        }
    }

答案 3 :(得分:0)

目前唯一的解决方案是这个问题只能通过使用文件浏览器根据您的手机并从根目录更改ext sdcard的权限来解决,这不建议使用,因为它会使您的手机的保修失效。还可以触发一些安全应用程序,如三星Galaxy S5 S4 Note3和Note2等手机中的KNOX。

很抱歉发布了这个痛苦的事实。

让我们希望谷歌本身的更新可以让我们摆脱这种情况。

但也认为在更新jellybean到kitkat之前,因为JB是Android最方便的操作系统。 和b / w JB& Kitkat不是那么高。

希望我帮助你......