【问题标题】:Content provider file storage No Such file or directory内容提供者文件存储 否 此类文件或目录
【发布时间】:2011-01-16 13:40:14
【问题描述】:

我构建了允许用户制作“图形”笔记的应用程序。 当我尝试将位图保存到我的自定义 ContentProvider(NotesProvider 扩展 ContentProvider)时,我遇到了问题。根据 Google devGuide 应该覆盖 openFile(Uri uri, String mode) 方法。我得到错误:找不到文件。 我查看了这个问题并得到了解决方案here。然后我像这样构建我的表示

    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
        if(sUriMatcher.match(uri)!=NOTE_ID)
            throw new IllegalArgumentException("Unsupported open file on directori uri " +uri);
        File root = new File(Environment.getDataDirectory(),
            BITMAPS_PATH);
        root.mkdirs();
        File path=new File(root, uri.getEncodedPath());
        int imode = 0;
        if (mode.contains("w")) {
            imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
            if (!path.exists()) {
                try {
                    path.createNewFile();
                } catch (IOException e) {
                    // TODO decide what to do about it, whom to notify...
                    e.printStackTrace();
                }
            }
        }
        if (mode.contains("r")) imode |= ParcelFileDescriptor.MODE_READ_ONLY;
        if (mode.contains("+")) imode |= ParcelFileDescriptor.MODE_APPEND;

        return ParcelFileDescriptor.open(path, imode);
}

并且应用程序有 IOException

12:42:12.714    2550    WARN    System.err  java.io.IOException: No such file or directory

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    我遇到了类似的问题。在你的模拟器中,如果Environment.getDataDirectory() 对应的文件夹不存在,那么你会得到一个异常。您需要先通过终端或 adb 手动创建文件夹(而不是通过代码)。一旦你这样做了,尝试再次运行你的代码,它应该可以工作。

    【讨论】:

    • 非常感谢!在模拟器上存在目录,但麻烦在于 uri.getEncodedPath() 它不仅是文件名,我用这个修复更改了我的代码并且它可以工作。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多