Android L + Nexus 5: java.io.FileNotFoundException: ошибка открытия: EACCES (отказано в доступе)

Во-первых, я скажу, что я прочитал много других сообщений, которые соответствуют этому вопросу, и ни один из них не работал у меня.

Я тестирую свое приложение на своем устройстве Nexus 5 под управлением Android L. Оно не имеет root-прав. Этот же код работает на более старой версии Android с API 19.

Я пытаюсь сделать снимок экрана и поделиться им, используя этот код:

    View screen = getWindow().getDecorView().getRootView();
    screen.setDrawingCacheEnabled(true);
    Bitmap bitmap = screen.getDrawingCache();
    String filename = getScreenshotName();
    String filePath = Environment.getExternalStorageDirectory().getPath()
            + File.separator + filename;

    File imageFile = new File(filePath);
    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
        byte[] bitmapData = bos.toByteArray();

        FileOutputStream fos = new FileOutputStream(imageFile);
        fos.write(bitmapData);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }

    // share
    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("image/png");
    share.putExtra(Intent.EXTRA_STREAM, Uri.parse(filePath));
    startActivity(Intent.createChooser(share, "Share Image"));

У меня есть эти разрешения в AndroidManifest.xml:

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

И я получаю эту ошибку:

java.io.FileNotFoundException: /storage/emulated/0/2014-09-14.png: open failed: EACCES (Permission denied)

В этой строке:

FileOutputStream fos = new FileOutputStream(imageFile);

Я также пробовал 10 других способов получить путь к файлу, и теперь я подозреваю, что это проблема устройства/Android L.

Есть идеи, что происходит?


person Shreyans    schedule 15.09.2014    source источник
comment
Попробуйте вместо этого сохранить в getExternalFilesDir() для теста.   -  person greenapps    schedule 15.09.2014
comment
спасибо, @greenapps, я попробовал и получил null в качестве значения файла   -  person Shreyans    schedule 16.09.2014
comment
Что такое «значение файла»?   -  person greenapps    schedule 16.09.2014
comment
@greenapps filePath. getExternalFilesDir() возвращает ноль.   -  person Shreyans    schedule 16.09.2014
comment
Вам удалось обойти эту проблему? Я столкнулся с похожей проблемой и до сих пор не смог ее решить [ссылка]   -  person Debosmit Ray    schedule 23.02.2016