2012-08-06 133 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。

我想這意味着調用者獲得對返回的文件描述符的獨佔控制權,並且我的應用程序不能以後關閉它。