在Android中保留文件描述符

时间:2012-08-06 13:57:29

标签: android persistence file-descriptor

我正在编写一个管理文件并与其他应用程序共享的Android应用程序。该应用程序实现了一个内容提供程序,可以将ParcelFileDescriptor个对象分发给请求的应用程序(就像内置的电子邮件应用程序和K-9 Mail应用程序一样):

   public ParcelFileDescriptor openFile(Uri uri, String mode)
        throws FileNotFoundException {
    File file;      
    ...

    file = new File(FilePermsActivity.FILE_ROOT, fileName);         
    ParcelFileDescriptor fd;        
    fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);         
    // store the file descriptor for later
    String callerPackage = getAppNameByPID(getContext(), Binder.getCallingPid());       
    FilesApplication.getInstance().addFd(callerPackage, fd);            
    return fd;
}

我想让文件管理器稍后关闭文件描述符,以防止两个应用程序同时保存打开的读写文件描述符。 FilesApplication类执行此操作,存储ParcelFileDescriptor个对象供以后使用:

    public void addFd(String packageName, ParcelFileDescriptor fd) {
    List<ParcelFileDescriptor> fds = null; 

    if ( openFds.containsKey(packageName))
    {
        fds = openFds.get(packageName);
        fds.add(fd);
    }       
    else
    {
        fds = new ArrayList<ParcelFileDescriptor>();
        fds.add(fd);
        openFds.put(packageName, fds);
    }           
}

public List<ParcelFileDescriptor> getFds (String packageName) {
    return openFds.get(packageName);
}

问题在于,当我尝试使用ParcelFileDescriptor检索打开的getFds时,文件描述符始终无效。通过检查,收件人应用程序仍然可以使用之前发送的文件描述符,但我的应用程序无法关闭它。

是否存在阻止ArrayList存储并随后检索文件描述符的内容?

1 个答案:

答案 0 :(得分:0)

经过更多搜索后,问题不在ParcelFileDescriptor,因为无论我过去使用哪个容器(ArrayList,常规ParcelFileDescriptor[]),它都会失效。我能找到的最佳解释是ContentProvider的文档说:

  

返回的ParcelFileDescriptor由调用者拥有,因此他们有责任在完成后关闭它。也就是说,此方法的实现应为每次调用创建一个新的ParcelFileDescriptor。

我想这意味着调用者可以对返回的文件描述符进行独占控制,我的应用程序以后就无法关闭它。