не удалось загрузить изображение с ошибкой EACCES (В доступе отказано) - PullRequest
0 голосов
/ 08 января 2020

После обновления моего приложения до целевой 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;
}

и вот разрешения в манифесте:

1 Ответ

0 голосов
/ 16 января 2020

Я выяснил, что проблема связана с хранилищем Scoped в приложениях, предназначенных для API 29+, которые требуют дополнительной работы для доступа к файлам в хранилище, в качестве быстрого обходного пути я использовал этот флаг android:requestLegacyExternalStorage="true" в манифесте внутри , в качестве справочного материала вы можете ознакомиться с документацией
, также эта статья очень полезна

...