1

ファイルを管理して他のアプリケーションと共有する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ファイル記述子の保存とその後の取得を妨げるものはありますか?

4

1 に答える 1

0

さらに検索した後、問題はありません。ParcelFileDescriptor以前に保持していたコンテナ(ArrayList、通常ParcelFileDescriptor[])に関係なく、無効になったからです。私が見つけることができる最良の説明は、ContentProviderのドキュメントに次のように記載されていることです。

返された ParcelFileDescriptor は呼び出し元が所有するため、完了したら閉じる必要があります。つまり、このメソッドの実装では、呼び出しごとに新しい ParcelFileDescriptor を作成する必要があります。

これは、呼び出し元が返されたファイル記述子を排他的に制御し、アプリケーションが後でそれを閉じることができないことを意味すると思います。

于 2012-08-07T10:46:04.680 に答える