如何在Android外部存储中保存公共文件

时间:2014-12-18 08:51:49

标签: android android-file

我正在开发一个Android应用程序,我在其中将pdf文件从Internet下载到外部目录。 我在很多方面尝试过,但总是有错误。 我在下面连续列出了我的代码错误:

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):用于PHP Developers.pdf的/storage/sdcard/Download/Node.js:打开失败: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

的答案

但又是恐怖:

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

2 个答案:

答案 0 :(得分:1)

在第一个错误中你使用了错误的路径(我猜)。由于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"/>

我希望它有所帮助。

答案 1 :(得分:1)

1&GT;要将数据文件写入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"/>