как сохранить общедоступный файл во внешнем хранилище Android

Я разрабатываю приложение для Android, в котором загружаю PDF-файл из Интернета во внешний каталог. Я пробовал разными способами, но всегда бывает ошибка. Ниже я последовательно перечисляю свои коды с ошибками:

1.

String fname=title+".pdf";
loc="/sdcard"+"/"+fname;
output=new FileOutputStream(loc);

Ошибка:

BookActivity(1255): /sdcard/Pragmatic Unit Testing in Java with JUnit.pdf: open failed: EACCES (Permission denied)

2.

File outputdir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String fname=title+".pdf";
loc=outputdir.getAbsolutePath()
output=new FileOutputStream(loc);

Ошибка: BookActivity (1172): /storage/sdcard/Download/Node.js для PHP Developers.pdf: ошибка открытия: ENOENT (такого файла или каталога нет)

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

<!-- Permission: Allow Connect to Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Permission: Writing to SDCard -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

Пожалуйста, помогите мне, что делать ?? Также расскажите, пожалуйста, как сохранять общедоступные файлы во внутреннем хранилище.

также попробовал ответ на https://stackoverflow.com/a/7887114/964741

но снова arror:

BookActivity(1319): /storage/sdcard/Apache Axis2 Web Services, 2nd Edition.pdf: open failed: EACCES (Permission denied)

person Rivu Chakraborty    schedule 18.12.2014    source источник
comment
посмотрите этот ответ stackoverflow.com/a/7887114/964741   -  person RajaReddy PolamReddy    schedule 18.12.2014
comment
loc=outputdir.outputdir.getAbsolutePath() почему outputdir здесь используется дважды?   -  person codePG    schedule 18.12.2014
comment
извините, это была моя ошибка   -  person Rivu Chakraborty    schedule 18.12.2014


Ответы (2)


в первой ошибке вы используете неправильный путь (я думаю). Начиная с версии 4.4 (не уверен) изменили способ доступа к внешним устройствам.

Вам следует написать:

String fname=title+".pdf";
loc="/mnt/media_rw/sdcard"+"/"+fname;
output=new FileOutputStream(loc);

Я считаю, что это правильный путь.

Я определил разрешения в моем файле манифеста следующим образом:

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

Я надеюсь, что это помогает.

person No More Hello World    schedule 18.12.2014
comment
Это из-за эмулятора ?? На физических устройствах еще не пробовал - person Rivu Chakraborty; 18.12.2014
comment
Что ж, это была важная информация, которую вы не предоставили. К сожалению, я использую только физические устройства. Но вы можете найти дополнительную информацию о смоделированных SD-картах здесь: developer.android.com/ tools / devices / emulator.html # sdcard и здесь: developer.android. ru / tools / help / mksdcard.html - person No More Hello World; 18.12.2014

1> Чтобы записать файл данных на SD-карту: -

private void writeTextFileToSdcard(File fileObj, String fileName, String fileData) {

        fileObj.mkdirs();
        File file = new File(fileObj, fileName);
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            OutputStreamWriter myOutWriter = new OutputStreamWriter(out);
            myOutWriter.append(fileData);
            myOutWriter.close();
            out.flush();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2> Чтобы записать изображение в sdacrd: -

private void writeImageFileToSdcard(Bitmap finalBitmap) {

    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/My_Images");    
    myDir.mkdirs();
    String fname = "Image1.jpg";
    File file = new File (myDir, fname);
    if (file.exists ()) file.delete (); 
    try {
           FileOutputStream out = new FileOutputStream(file);
           finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
           out.flush();
           out.close();

    } catch (Exception e) {
           e.printStackTrace();
    }
}

Разрешение обязательно

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
person Ganesh AB    schedule 18.12.2014
comment
позвольте мне спросить одну вещь, я видел на сайте разработчика Google, что с sdk 19 нам больше не требовалось разрешение, поэтому я использовал объявление maxSdk в разрешении. это требует нового разрешения ??? - person Rivu Chakraborty; 18.12.2014
comment
Да, разрешение обязательно для всех версий. Не могли бы вы поделиться журналом ошибок, если он не работает. - person Ganesh AB; 18.12.2014
comment
Только ‹uses-permission android: name = android.permission.WRITE_EXTERNAL_STORAGE /› это разрешение требуется для записи данных на SD-карту. - person Ganesh AB; 18.12.2014