android:公共目录中的内部存储中保存文件

zed*_*zed 4 android

我试图将图像保存在app文件目录中的公共目录中.通过公开,我的意思是我将能够使用动作视图意图.

/** Saves the bitmap to app storage */
    public int SaveBitmap(Bitmap bitmap, String filename, Boolean scan){

        // Save the file
        OutputStream os = null;

        String path = context.getFilesDir() + "/MyAppName/";
        File file = new File(path);
        if(!file.isDirectory())file.mkdirs();
        path += (filename + ".png");
        try {
            os = new BufferedOutputStream(new FileOutputStream(path,true));
            //os = mContext.openFileOutput(, Context.MODE_PRIVATE);
            bitmap.compress(CompressFormat.PNG, 100, os);
            os.flush();
            os.close();
            bitmap.recycle();
        } catch (IOException e) {
            e.printStackTrace();
            return 1; //Failure
        }

        File fileR = new File(path);

        fileR.setReadable(true, false);
        // Show in Gallery
        if(scan) ShowInGallery(filename);

        return 0; // SUCCESS

    }
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用,文件仍然以私有模式创建.

使用:

context.openFileOutput(filename + ".png", Context.MODE_WORLD_READABLE); 
Run Code Online (Sandbox Code Playgroud)

我能够公开打开它们,但我无法将文件保存在该目录中.

请注意,我的目标是没有SD卡的用户,这就是我不使用外部存储的原因.

我能做什么?

Sub*_*sed 7

您将要使用Environment.getExternalStoragePublicDirectory (String type)Environment.getExternalStorageDirectory作为文件目录的根目录.有关详细信息,请参阅文档.

编辑:

从以下环境文档getExternalStorageDirectory ():

注意:这里不要混淆"外部"这个词.此目录最好被视为媒体/共享存储.它是一个文件系统,可以容纳相对大量的数据,并在所有应用程序之间共享(不强制执行权限).传统上,这是一张SD卡,但它也可以作为与受保护的内部存储不同的设备中的内置存储实现,并且可以作为文件系统安装在计算机上.

所有"外部"意味着它在您的应用程序或公共外部.因此,如果SD卡可用,则此方法默认为该存储目录.如果设备不使用SD卡,则使用设备的内置存储.

  • 没错,但不满意.因此Context.MODE_WORLD_READABLE已弃用. (3认同)
  • "外部"存储不仅仅意味着外部存储.请稍后查看编辑. (2认同)

zed*_*zed 1

我认为在我的情况下最安全的做法是使用Environment.getExternalStoragePublicDirectory (String type) And if an exception is catched,我将使用普通的 getFilesDir 将其保存到内部存储中。我还没有找到一种方法使应用程序数据中的该文件夹可供公开读取。

这是因为如果设备应该有 SD 卡但未安装,则 getExternalStoragePublicDirectory 可能会失败。所以你不能依赖它。