2012-08-06 61 views
0

我正在编写一个Android应用程序,用于管理文件并与其他应用程序共享它们。该应用实现了手了ParcelFileDescriptor对象请求应用程序(就像内置的电子邮件应用程序和K-9邮件的应用程序做的)内容提供商:Android中的持久文件描述符

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); 
} 

的问题是,当我尝试检索使用getFds开放ParcelFileDescriptor S,文件描述符总是无效。从检查中,收件人应用程序仍然可以使用之前发送的文件描述符,但我的应用程序无法关闭它。

是否有东西阻止ArrayList中的存储和随后检索文件描述符?

回答

0

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

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

我想这意味着调用者获得对返回的文件描述符的独占控制权,并且我的应用程序不能以后关闭它。