ファイルを管理して他のアプリケーションと共有するAndroidアプリを書いています。このアプリケーションは、オブジェクトを要求元のアプリケーションに渡すコンテンツプロバイダーを実装ParcelFileDescriptor
します(組み込みの電子メールアプリやK-9メールアプリケーションと同じように)。
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;
}
2つのアプリケーションが同時に読み取り+書き込みファイル記述子を開いたままにしないように、ファイルマネージャーが後でファイル記述子を閉じることを許可したいと思います。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
問題は、を使用してopenを取得しようとするとgetFds
、ファイル記述子が常に無効になることです。チェックから、受信者アプリケーションは以前に送信されたファイル記述子を引き続き使用できますが、私のアプリケーションはそれを閉じることができません。
ArrayList
ファイル記述子の保存とその後の取得を妨げるものはありますか?