復制流化的數據
你可以復制和粘貼被流化的大文本和二進制數據。這種數據可以是以下形式:
1. 保存在實際設備上的的文件;
2. 來自套接字中的數據流;
3. 保存在底層數據庫系統中的大數據。
針對數據流的內容提供器使用一個文件描述對象(如AssetFileDescriptor,而不是Cursor對象)來提供對數據的訪問。粘貼數據的應用程序會使用這個文件描述對象來讀取數據流。
按照以下步驟創建使用提供其來復制數據流的應用程序:
1. 創建一個准備放入剪貼板上的數據流所對應的內容URI。包括以下可選的內容:
A.給數據流編制一個要放到URI上的標識,然後在包含該標識和對應數據流名稱的提供器中維護一個表;
B.直接把數據流的名稱編寫到該URI上;
C.使用能夠始終從該提供器中返回當前數據流的唯一URI。如果你選擇這種方法,你必須要記住,無論何時,通過URI把數據流復制到剪貼板時,都要更新你的提供器,以便指向不同的數據流。
2. 給你計劃提供的每種數據流都提供一個MIME類型。粘貼數據的應用程序需要這個信息來判斷它們是否可以粘貼剪貼板上的數據。
3. 實現ContentProvider類中的一個方法,讓它返回對應數據流的文件描述對象。如果你把標識編寫到了內容的URI上,就可以使用這個方法來判斷對應的數據流是否打開。
4. 要把數據流復制到剪貼板上,就要構造該內容的URI並把它放到剪貼板上。
要粘貼一個數據流,應用程序就要從剪貼板上獲取剪貼對象和其中的URI,並在調用ContentResolver對象的打開數據流的文件描述對象的方法中使用它。ContentResolver方法會調用對應的ContentProvider方法,並把內容的URI傳遞給它。你提供器會把這個文件描述對象返回給ContentResolver的方法。然後粘貼數據的應用程序就有能力從數據流中讀取該數據了。
下面介紹了對內容提供器來說最為重要的幾個文件描述對象方法。其中的每一個方法在ContentResolver對象都有對應的附加了Descriptor字符串的方法名稱,例如:ContentReslolver中對應openAssetFile()方法的是openAssetFileDescriptor()方法。
openTypeAssetFile()
如果內容提供器支持所提供的MIME類型,那麼這個方法會返回一個資源文件的描述對象。調用者應用提供一個MIME類型模式。如果內容提供器可以提供這個MIME類型, 那麼它就會返回一個AssetFileDescriptor文件句柄,否則它會拋出一個異常。
這個方法能夠處理文件的內容,你可以使用它來讀取內容提供器已經復制到剪貼板中資源。
openAssetFile()
這個方法是比openTypeAssetFile()方法更一般化的形式。它不針對MIME類型來進行過濾,但可以讀取文件的內容。
openFile()
這個方法比openAssetFile()方法還要一般化。它不能夠文件的內容。
你可以選擇使用代用文件描述符方法的openPipeHelper()方法,它允許粘貼數據的應用程序在後台線程中使用管道來讀取流式數據。要使用這個方法,你需要實現ContentProvider.PipeDataWriter接口。在Note Pad示例中就是這麼做的,詳細請看NotePadProvider.java的openTypeAssetFile()方法。
設計有效的復制/粘貼功能
要給你的應用程序設計有效的復制/粘貼功能,就要記住以下幾點:
1. 任何時候,在剪貼板上都只有一個剪貼對象。系統中,任何一個新的應用程序的復制操作都會覆寫之前的剪貼對象。因為用戶在做了復制操作之後離開你的應用程序,因此你不能假設剪貼板中所包含的剪貼對象就是之前在你的應用程序中復制的那個對象。
2. 每個剪切對象中的多個ClipData.Item對象的用途是支持對多個被選擇的對象的復制和粘貼,而不是對同一個選擇對象應用的不同形式。通常,剪貼對象中的所有的ClipData.Item對象都要要有相同的格式,也就是說,它們應用都是簡單的文本、內容URI或Intent對象,而不是混合的。
3. 在你提供數據時,你能夠提供不同的MIME說明。把MIME類型添加到ClipDescription對象中,然後在你的內容提供器中實現該MIME類型。
4. 當你從剪貼板中獲取數據時,你的應用程序要負責檢查MIME類型是否可用,如果可用,然後再決定使用那種類型,否則即使在剪貼板上有剪貼對象,並且用戶請求粘貼操作,那麼你的應用程序也不會執行粘貼操作。如果MIME類型是兼容,你才應該執行粘貼操作。你可以選擇使用coerceToText()方法,把剪貼板上的數據強制轉換成文本。如果你的應用程序支持多種可用的MIME類型,那麼你可以允許用戶來選擇使用那種類型。
分享到: 上一篇:Android的文本和輸入---復制和粘貼(五)