Android打开失败:尝试读取数据/数据中的文件时,EACCES(权限被拒绝)

M3M3X

我需要读取用户选择的文件,因此我使用以下代码:

//This code is called by a button to ask the permission
private void startUpload(){

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_PERMISSION_GRANTED);

        } else {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_PERMISSION_GRANTED);
        }
    }

}//startUpload

我也将相对权限放入清单中:

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

我以这种方式读取文件:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case WRITE_PERMISSION_GRANTED: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                try {
                    FileInputStream stream = new FileInputStream(toUpload.getCanonicalFile());
                    byte[] data = new byte[(int) toUpload.length()];
                    stream.read(data);
                    stream.close();
                    Log.e("FUNZIONA!!!!", "OK!");
                }catch (Exception e){
                    Log.e("ECCEZIONE", e.getMessage());
                }
            } else {
                Log.e("PERMISSION", "DEINED");
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

(toUpload是用户使用文件管理器选择的文件,在这种情况下为下载的图像)使用代码,我得到此异常:

/data/data/com.android.browser/cache/2016-04-25-17-17-49-1205395195.jpg: open failed: EACCES (Permission denied)

我不知道问题是什么。

我添加一些细节:

//this code opens the defualt file manager
private void showFileChooser() {

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"),
                FILE_SELECT_CODE);
    } catch (android.content.ActivityNotFoundException ex) {

        Snackbar.make(uploadView, "Nessun file manager trovato!", Snackbar.LENGTH_LONG).setAction("Response", null).show();
    }

}//showFileChooser

//this is for getting the selected file
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {
        case FILE_SELECT_CODE:
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                String path = getPath(this, uri);
                toUpload = new File(path);
                //Log.d("LOG", "File Path: " + path);
            }
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);

}//onActivityResult

这是获取路径的代码:

private String getPath(final Context context, final Uri uri) {

    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

    // DocumentProvider
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
        // ExternalStorageProvider
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }
        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {

            final String id = DocumentsContract.getDocumentId(uri);
            final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

            return getDataColumn(context, contentUri, null, null);
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[]{
                    split[1]
            };

            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    }
    // MediaStore (and general)
    else if ("content".equalsIgnoreCase(uri.getScheme())) {

        // Return the remote address
        if (isGooglePhotosUri(uri))
            return uri.getLastPathSegment();

        return getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;

}//getPath

public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {

    Cursor cursor = null;
    final String column = "_data";
    final String[] projection = {column};

    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                null);
        if (cursor != null && cursor.moveToFirst()) {
            final int index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;

}//getDataColumn

public static boolean isExternalStorageDocument(Uri uri) {

    return "com.android.externalstorage.documents".equals(uri.getAuthority());

}//isExternalStorageDocument

public static boolean isDownloadsDocument(Uri uri) {

    return "com.android.providers.downloads.documents".equals(uri.getAuthority());

}//isDownloadsDocument

public static boolean isMediaDocument(Uri uri) {

    return "com.android.providers.media.documents".equals(uri.getAuthority());

}//isMediaDocument

public static boolean isGooglePhotosUri(Uri uri) {

    return "com.google.android.apps.photos.content".equals(uri.getAuthority());

}//isMediaDocument

怎么了?

M3M3X

好的,我解决了!问题部分是模拟器...我将代码发布给有相同问题的人(感谢CommonsWare的帮助):

//It requires a file manager installed
private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("file/*");
    try {
        startActivityForResult(intent, FILE_SELECT_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        Snackbar.make(uploadView, "No file manager founded!", Snackbar.LENGTH_LONG).setAction("Response", null).show();
    }

}//showFileChooser

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {
        case FILE_SELECT_CODE:
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                uriToUpload = uri;
            }
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);

}//onActivityResult 

private byte[] getFileData() throws IOException{

    Cursor cursor = getContentResolver().query(uriToUpload, null, null, null, null);
    cursor.moveToFirst();
    long size = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE));
    cursor.close();
    InputStream stream = getContentResolver().openInputStream(uriToUpload);
    byte[] data = new byte[(int)size];
    stream.read(data);
    stream.close();

    return data;

}//getFileData

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android打开失败:在数据/数据/包/文件中写入文件时EACCES(权限被拒绝)

在 Android 上读取文本文件时出错,打开失败:EACCES(权限被拒绝)

打开失败:Android中的EACCES(权限被拒绝)

Errno13,尝试读取文件时权限被拒绝

尝试读取bash中创建的临时文件时,权限被拒绝

Android上的“打开失败:EACCES(权限被拒绝)”

Android IOException:打开失败:EACCES(权限被拒绝)

Android:打开失败的eacces权限被拒绝

尝试读取带有644权限的文件时,权限被拒绝

尝试读取excel文件时如何修复[Errno13]权限被拒绝?

打开失败:EACCES(权限被拒绝)

打开/尝试读取文件

尝试从图片读取元数据时获取FileNotFoundException(权限被拒绝)

Android 6.0打开失败:EACCES(权限被拒绝)

Android上的异常“打开失败:EACCES(权限被拒绝)”

android.system.ErrnoException:打开失败:EACCES(权限被拒绝)

打开失败:将图像上传到服务器时,棉花糖中的EACCES(权限被拒绝)

打开失败:离子-2中的EACCES(权限被拒绝)

运行时错误70权限2个程序尝试读取和写入csv文件时被拒绝

打开失败:EACCES(权限被拒绝)错误

FileNotFoundException:打开失败:EACCES(权限被拒绝)

尝试读取使用Python数组模块创建的数据文件时出现问题

Deja dup:尝试读取davfs上的清单时,权限被拒绝

Firebase权限在读取数据时被拒绝

IllegalArgumentException:尝试读取数据块中的 json 时,路径必须是绝对的

在 Prolog 中打开文件时权限被拒绝

尝试读取时找不到文件

java.net.BindException:绑定失败:尝试为 UDP 连接创建 DatagramSocket 时 EACCES(权限被拒绝)

Android异常“打开失败:EACCES(权限被拒绝)”-不是由于SD卡