Android 9. + API 29: /storage/emulated/0/Pictures/myPic.png открыть не удалось: EACCES (разрешение запрещено) - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь получить исходный код очень простого приложения для камеры на Android Studio 3.4.1 с API виртуального устройства Android (AVD) Nexus 7 (2012) 29. Я сделал снимок с помощью камеры в эмуляторе и попытался сохранить это как /storage/emulated/0/Pictures/myPic.png, но получил исключение из /storage/emulated/0/Pictures/myPic.png open fail: EACCES (Permission Denied). Я испробовал все советы, доступные в Интернете, например:

  1. В AndroidManifest.xml я добавил:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  1. В MainActivity.java я добавил следующую проверку прав доступа и код запроса:
public class MainActivity extends Activity {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    public static void verifyStoragePermissions(Activity activity) {
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        boolean checkPermission = (permission == PackageManager.PERMISSION_GRANTED);

        Toast toastPermission = Toast.makeText(activity,
                "Is permission granted? " + checkPermission,
                Toast.LENGTH_SHORT);
        LinearLayout toastLayoutPermission = (LinearLayout) toastPermission.getView();
        TextView toastTVPermission = (TextView) toastLayoutPermission.getChildAt(0);
        toastTVPermission.setTextSize(30);
        toastPermission.show();


        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }

  1. Затем я проверяю и запрашиваю разрешение как в onCreate, так и непосредственно перед тем, как хочу сохранить изображение, следующим образом:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        verifyStoragePermissions(this);


......


private void saveImageToFile(File file)
    {
        if (mCameraBitmap != null)
        {
            FileOutputStream outStream = null;

            verifyStoragePermissions(this);

            try
            {
                outStream = new FileOutputStream(file);

                ...

            }
            catch (Exception e)
            {
                Toast toastException = Toast.makeText(MainActivity.this,
                        "Exception: " + e.getMessage(),
                        Toast.LENGTH_SHORT);
                LinearLayout toastLayoutException = (LinearLayout) toastException.getView();
                TextView toastTVException = (TextView) toastLayoutException.getChildAt(0);
                toastTVException.setTextSize(30);
                toastException.show();
            }

...

  1. Я также проверил разрешение хранилища вручную в эмуляторе, чтобы убедиться, что доступ к хранилищу разрешен.

Однако, ни один из советов не работает!

Код сгенерировал исключение

/ storage / emulated / 0 / Pictures / myPic.png открыть не удалось: EACCES (В доступе отказано)

когда он достиг линии

outStream = new FileOutputStream(file);

Есть идеи для дальнейшего решения? Большое спасибо.

1 Ответ

0 голосов
/ 18 июля 2019

В конце концов я выяснил, что проблема заключается в Android API 29, как только я опустился до API 28, проблем с разрешением больше нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...