【问题标题】:how to Save Public File in Android external storage如何在 Android 外部存储中保存公共文件
【发布时间】:2014-12-18 08:51:49
【问题描述】:

我正在开发一个 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):/storage/sdcard/Download/Node.js for 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的答案

但又错了:

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

【问题讨论】:

标签: android android-file


【解决方案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"/>

希望对你有帮助。

【讨论】:

【解决方案2】:

1> 将数据文件写入 sdcard :-

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"/>

【讨论】:

  • 让我问一件事,我在 google 开发者网站上看到从 sdk 19 开始我们不再需要权限,所以我在权限中使用了 maxSdk 声明。它需要一些新的权限吗???
  • 是的,所有版本都必须获得许可。如果它不起作用,请您分享错误日志。
  • 只有 这个权限是在 sdcard 上写入数据所需要的。
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多