我正在编写一个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
中的存储和随后检索文件描述符?