上传图片失败,错误为 EACCES(权限被拒绝)

fail to upload image with error EACCES (Permission denied)

将我的应用程序更新到 api 29 和 运行 它在 android 10 设备上后,上传图片失败并出现错误:"EACCES (Permission denied)" 请帮忙。

这是我的代码:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == SELECT_IMG_REQUEST) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(Intent.createChooser(intent, "Select Image"), SELECT_IMG_REQUEST);
        } else {
            Toast.makeText(getApplicationContext(), "permission", Toast.LENGTH_LONG).show();
        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

Bitmap bitmap;
Uri filePath;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == SELECT_IMG_REQUEST && resultCode == RESULT_OK && data != null) {
        filePath = data.getData();
        Log.e("path", filePath + "");
        try {
            InputStream inputStream = getContentResolver().openInputStream(filePath);
            bitmap = BitmapFactory.decodeStream(inputStream);
            if (MySingleton.getmInstance(this).userData().getGender().equals("Male")) {
                Glide.with(this)
                        .load(bitmapToByte(bitmap))
                        .asBitmap()
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .placeholder(R.mipmap.sidemenu_pic_profile_man)
                        .transform(new CircleTransform(this))
                        .thumbnail(0.1f)
                        .into(pic);
            } else {
                Glide.with(this)
                        .load(bitmapToByte(bitmap))
                        .asBitmap()
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .placeholder(R.mipmap.sidemenu_pic_profile_woman)
                        .transform(new CircleTransform(this))
                        .into(pic);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
    super.onActivityResult(requestCode, resultCode, data);
}

private byte[] bitmapToByte(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

public String getPath(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    String document_id = cursor.getString(0);
    document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
    cursor.close();

    cursor = getContentResolver().query(
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
    cursor.moveToFirst();
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
    cursor.close();

    return path;
}

这是清单中的权限:

我发现问题是由于针对 API 29+ 的应用程序中的范围存储,这需要额外的工作来处理存储上的文件访问, 作为一种快速解决方法,我在清单中使用了这个标志 android:requestLegacyExternalStorage="true",作为参考,您可以看到 documentation
还有这个 medium article is so helpful