欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android API Guides---Text and Input

来源: 开发者 投稿于  被查看 10025 次 评论:261

Android API Guides---Text and Input


文本和输入
使用文字服务添加便利功能,例如复制/粘贴和拼写检查到您的应用程序。您也可以开发自己的文字服务,提供自定义的输入法,字典和拼写检查,你可以分发给用户为应用程序。
博客文章
添加语音输入到您的IME
在Android 4.0的中的新功能是语音输入:用户不同的是,识别结果显示在文本框中,而他们还在说话。如果你是一个开发输入法,可以方便的与语音输入集成。
语音输入API为Android
我们认为,讲话可以从根本上改变移动体验。我们想邀请所有的Andr??oid应用程序开发者考虑通过Android SDK集成语音输入功能。
制作多点触控感

单词“多点触摸”得到周围颇有几分抛出它并不总是很清楚什么人是指。对一些人来说是关于硬件的能力,对其他人而言,是指特定的手势支持的软件。无论你决定称呼它,今天我们来看看如何让你的应用程序,并享有与屏幕上的多个手指表现很好。

Copy and Paste

Android提供复制和粘贴功能强大的基于剪贴板的框架。它支持简单和复杂的数据类型,包括文本串,复杂的数据结构,文本和二进制数据流,甚至应用的资产。简单的文本数据被直接存储在剪贴板中,而复杂的数据被存储作为该粘贴应用程序与内容提供商解析的引用。复制和粘贴都在应用程序中,并实现了框架的应用程序之间进行。


由于框架的一部分使用内容提供商,这个主题假定一些熟悉Android的内容提供商的API,这是在主题内容提供商描述。


剪贴板框架


当您使用剪贴板框架,你把数据转化为剪辑对象,然后把剪辑对象在全系统剪贴板。剪辑对象可以采取三种形式:


文本
文本字符串。您可以直接把串入剪辑对象,您然后将复制到剪贴板。要粘贴字符串,将剪贴板中的剪辑对象和字符串复制到您的应用程序的存储。
URI
代表任何形式的URI的Uri对象。这主要是用于从内容提供者复制复杂的数据。要复制的数据,你把一个Uri对象到剪辑对象,并把剪辑对象复制到剪贴板。要粘贴数据,你得到的剪辑对象,得到Uri对象,它解析为数据源,如内容提供商,以及从源头到应用程序的存储复制数据。
意图
意图。这支持复制应用程序快捷方式。要复制的数据,创建一个意图,把它变成一个剪辑对象,并把剪辑对象复制到剪贴板。要粘贴数据,你得到的剪辑对象,然后意图对象复制到你的应用程序的内存区域。
剪贴板只拥有一次剪辑对象。当应用程序将一个剪辑对象在剪贴板上,以前的剪辑对象消失。


如果你希望允许用户将数据粘贴到你的应用程序,你不必处理所有类型的数据。给你的用户将其粘贴选项之前,您可以检查剪贴板上的数据。除了具有一定的数据格式,剪辑对象也包含了告诉你什么MIME类型或类型可用的元数据。该元数据可以帮助你决定??是否你的应用程序可以做一些与剪贴板数据非常有用。例如,如果你有一个应用程序,主要处理可能要忽略包含URI或意图剪辑对象的文本。


您也可以允许用户将文本粘贴无论在剪贴板上的数据的形式。要做到这一点,您可以强制剪贴板数据转换成文本表示,然后粘贴这个文本。这是一节中所述强制转换剪贴板文本。


剪贴板类


本节介绍剪贴板框架使用的类。


ClipboardManager


在Android系统中,系统剪贴板是由全球ClipboardManager类表示。您不要直接实例化这个类;相反,你会得到通过调用getSystemService(CLIPBOARD_SERVICE)对它的引用。


ClipData,ClipData.Item和ClipDesc??ription


将数据添加到剪贴板中,您可以创建包含一个数据的描述和数据本身ClipData对象。剪贴板拥有在同一时间只有一个ClipData。一个ClipData包含ClipDesc??ription对象和一个或多个ClipData.Item对象。


一个ClipDesc??ription对象包含有关片段元数据。尤其是,它含有可用MIME类型的片段的数据数组。当你把一个剪辑在剪贴板,这个数组可用于粘贴的应用程序,它可以检查它,看看他们是否可以处理任何可用的MIME类型。


一个ClipData.Item对象包含文本,URI或意向数据:


文本
一个CharSequence的。
URI
一个URI。这通常包含的内容提供者的URI,尽管任何URI被允许的。提供数据的应用程序将URI剪贴板上。希望粘贴数据的应用程序从剪贴板中得到URI并用它来访问内容提供商(或其他数据源)和检索数据。
意图
意图。此数据类型可以让你的应用程序快捷方式复制到剪贴板。然后,用户可以粘贴快捷方式到他们的应用程序供以后使用。
您可以到剪辑添加多个ClipData.Item对象。这允许用户多重选择作为一个剪辑复制和粘贴。例如,如果你有一个列表小工具,允许用户同时选择多个项目,可以将所有的项目一次复制到剪贴板。要做到这一点,您可以为每个项目单独ClipData.Item,然后你ClipData.Item对象添加到ClipData对象。


ClipData方便的方法


该ClipData类为创建一个单一ClipData.Item对象和一个简单的ClipDesc??ription对象ClipData对象的静态便捷方法:


newPlainText(标签,文本)
返回ClipData对象,其单ClipData.Item对象包含的文本字符串。该ClipDesc??ription对象的标签设置标签。在ClipDesc??ription单MIME类型是MIMETYPE_TEXT_PLAIN。
使用newPlainText()来创建一个文本字符串的剪辑。


newUri(解析器,标签,URI)
返回ClipData对象,其单ClipData.Item对象包含一个URI。该ClipDesc??ription对象的标签设置标签。如果URI是内容的URI(Uri.getScheme()返回内容:),该方法使用在分解器提供的ContentResolver的目的是从内容提供商检索可用的MIME类型,并将它们存储在ClipDesc??ription。对于一个URI不是内容:URI,该方法将MIME类型MIMETYPE_TEXT_URILIST。
使用newUri()创建从URI,特别是内容的片段:URI。


newIntent(标签,意图)
返回ClipData对象,其单ClipData.Item对象包含一个意图。该ClipDesc??ription对象的标签设置标签。 MIME类型设置为MIMETYPE_TEXT_INTENT。
使用newIntent()从一个Intent对象创建一个剪辑。


强迫剪贴板数据为文本


即使您的应用程序只能处理文字,你可以通过使用方法ClipData.Item.coerceToText转换从剪贴板复制非文本数据()。


此方法转换在ClipData.Item数据为文本,并返回一个的CharSequence。该ClipData.Item.coerceToText()返回的值是在ClipData.Item数据的形式:


文本
如果ClipData.Item是文本(的getText()不为null),coerceToText()返回文本。
URI
如果ClipData.Item是一个URI(getUri()不为null),coerceToText()试图使用它作为一个内容URI:
如果URI是一个内容URI和提供者可以返回文本流,coerceToText()返回一个文本流。
如果URI是一个内容URI,但供应商不提供一个文本流,coerceToText()返回URI的表示。的表示是相同的,通过Uri.toString()返回。
如果URI是不是内容的URI,coerceToText()返回的URI的表示。的表示是相同的,通过Uri.toString()返回。
意图
如果ClipData.Item是一个Intent(getIntent()不为null),coerceToText()将其转换为一个Intent URI并返回它。的表示是相同的,通过Intent.toUri(URI_INTENT_SCHEME)返回。
剪贴板框架总结于图1中要复制的数据,应用程序将一个ClipData对象上ClipboardManager全??局剪贴板。所述ClipData包含一个或多个ClipData.Item对象,一个ClipDesc??ription对象。要粘贴数据,应用程序获取ClipData,从ClipDesc??ription得到它的MIME类型,并且无论是从ClipData.Item或提供程序通过ClipData.Item提到的内容获取的数据。

\

图1. Android的剪贴板框架
复制到剪贴板
如前所述,将数据复制到剪贴板,你得到一个处理全球ClipboardManager对象,创建一个ClipData对象,添加剪辑描述以及一个或多个ClipData.Item对象给它,并添加完成ClipData反对ClipboardManager对象。这在下面详细过程描述:
如果您使用的是内容URI复制数据,建立一个内容提供商。
该笔记本示例应用程序是使用复制和粘贴内容提供商的一个例子。记事本Provider类实现了内容提供商。记事本类定义了供应商和其他应用程序,包括支持的MIME类型之间的契约。
获取系统剪贴板:

...

// if the user selects copy
case R.id.menu_copy:

// Gets a handle to the clipboard service.
ClipboardManager clipboard = (ClipboardManager)
    getSystemService(Context.CLIPBOARD_SERVICE);
将数据复制到一个新的ClipData对象:
对于文本

// Creates a new text clip to put on the clipboard
ClipData clip = ClipData.newPlainText("simple text","Hello, World!");
对于一个URI


该片段由编码记录ID到内容的URI提供商构建了一个URI。这种技术被覆盖在部分编码的URI标识符更多详细信息:

// Creates a Uri based on a base Uri and a record ID based on the contact's last name
// Declares the base URI string
private static final String CONTACTS = "content://com.example.contacts";

// Declares a path string for URIs that you use to copy data
private static final String COPY_PATH = "/copy";

// Declares the Uri to paste to the clipboard
Uri copyUri = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName);

...

// Creates a new URI clip object. The system uses the anonymous getContentResolver() object to
// get MIME types from provider. The clip object's label is "URI", and its data is
// the Uri previously created.
ClipData clip = ClipData.newUri(getContentResolver(),"URI",copyUri);
对于意向


这段代码构建了一个应用程序的意图,然后把它在剪辑对象:

// Creates the Intent
Intent appIntent = new Intent(this, com.example.demo.myapplication.class);

...

// Creates a clip object with the Intent in it. Its label is "Intent" and its data is
// the Intent object created previously
ClipData clip = ClipData.newIntent("Intent",appIntent);
将新的剪辑对象剪贴板上:

// Set the clipboard's primary clip.
clipboard.setPrimaryClip(clip);
从剪贴板粘贴
如前所述,您可以通过获取全局剪贴板对象,得到了剪辑对象,看着它的数据从剪贴板粘贴数据,如果可能从剪辑对象中的数据复制到自己的存储。本节详细介绍了如何为三种形式剪贴板数据的做到这一点。
粘贴纯文本
要粘贴纯文本,首先获得全局剪贴板并验证它是否可以返回纯文本。然后得到的剪辑对象和使用的getText()的文本复制到自己的存储,如下面的过程中所述:
获得使用getSystemService(CLIPBOARD_SERVICE)全球剪贴板管理对象。同时声明一个全局变量包含所粘贴的文本:

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

String pasteData = "";
接下来,确定是否要启用或禁用当前活动的“粘贴”选项。您应该验证剪贴板中包含一个剪辑,并可以处理由剪辑表示的数据的类型:

/ Gets the ID of the "paste" menu item
MenuItem mPasteItem = menu.findItem(R.id.menu_paste);

// If the clipboard doesn't contain data, disable the paste menu item.
// If it does contain data, decide if you can handle the data.
if (!(clipboard.hasPrimaryClip())) {

  mPasteItem.setEnabled(false);

  } else if (!(clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))) {

    // This disables the paste menu item, since the clipboard has data but it is not plain text
    mPasteItem.setEnabled(false);
  } else {

    // This enables the paste menu item, since the clipboard contains plain text.
    mPasteItem.setEnabled(true);
  }
}
将数据从复制到剪贴板。如果“粘贴”菜单项启用这一点在方案只到达,这样你就可以假定剪贴板包含纯文本。你还不知道它是否包含一个文本字符串或指向纯文本的URI。下面的代码片段测试,但它只是显示了处理纯文本格式的代码

// Responds to the user selecting "paste"
case R.id.menu_paste:

// Examines the item on the clipboard. If getText() does not return null, the clip item contains the
// text. Assumes that this application can only handle one item at a time.
ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

// Gets the clipboard as text.
pasteData = item.getText();

// If the string contains data, then the paste operation is done
if (pasteData != null) {
  return;

// The clipboard does not contain text. If it contains a URI, attempts to get data from it
} else {
  Uri pasteUri = item.getUri();

  // If the URI contains something, try to get text from it
  if (pasteUri != null) {

    // calls a routine to resolve the URI and get data from it. This routine is not
    // presented here.
    pasteData = resolveUri(Uri);
    return;
  } else {

  // Something is wrong. The MIME type was plain text, but the clipboard does not contain either
  // text or a Uri. Report an error.
  Log.e("Clipboard contains an invalid data type");
  return;
  }
}
从内容URI粘贴数据
该ClipData.Item对象包含内容的URI,你已经确定你可以处理它的MIME类型之一,创建一个ContentResolver的,然后调用相应的内容提供商的方法来检索数据。
以下过程介绍如何从内容提供商基于在剪贴板上的内容URI获取数据。它检查应用程序可以使用MIME类型可以从供应商:
声明一个全局变量包含MIME类型:

// Declares a MIME type constant to match against the MIME types offered by the provider
public static final String MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact"
获得全局剪贴板。还可以得到一个ContentResolver的,所以你可以访问内容提供商:

// Gets a handle to the Clipboard Manager
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

// Gets a content resolver instance
ContentResolver cr = getContentResolver();
获取剪贴板中的主要片段,并获得其内容为URI:

// Gets the clipboard data from the clipboard
ClipData clip = clipboard.getPrimaryClip();

if (clip != null) {

  // Gets the first item from the clipboard data
  ClipData.Item item = clip.getItemAt(0);

  // Tries to get the item's contents as a URI
  Uri pasteUri = item.getUri();
测试以查看该URI是一个内容URI通过调用的getType(URI)。如果URI不指向一个有效的内容提供商此方法返回null:

 // If the clipboard contains a URI reference
  if (pasteUri != null) {

    // Is this a content URI?
    String uriMimeType = cr.getType(pasteUri);
测试以查看的内容提供商支持的MIME类型,目前的应用可以理解的。如果是这样,调用ContentResolver.query()来获取数据。返回值是一个光标:

// If the return value is not null, the Uri is a content Uri
    if (uriMimeType != null) {

      // Does the content provider offer a MIME type that the current application can use?
      if (uriMimeType.equals(MIME_TYPE_CONTACT)) {

        // Get the data from the content provider.
        Cursor pasteCursor = cr.query(uri, null, null, null, null);

        // If the Cursor contains data, move to the first record
        if (pasteCursor != null) {
          if (pasteCursor.moveToFirst()) {

          // get the data from the Cursor here. The code will vary according to the
          // format of the data model.
          }
        }

        // close the Cursor
        pasteCursor.close();
      }
    }
  }
}
粘贴一个Intent


要粘贴一个Intent,首先获得全局剪贴板。检查ClipData.Item对象以查看它是否包含一个意图。然后调用getIntent()的意图复制到自己的存储。下面的代码演示这一点:

// Gets a handle to the Clipboard Manager
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

// Checks to see if the clip item contains an Intent, by testing to see if getIntent() returns null
Intent pasteIntent = clipboard.getPrimaryClip().getItemAt(0).getIntent();

if (pasteIntent != null) {

  // handle the Intent

} else {

  // ignore the clipboard, or issue an error if your application was expecting an Intent to be
  // on the clipboard
}
使用内容提供商能够复制复杂数据


内容提供商支持复制,如数据库记录或文件流复杂的数据。要复制的数据,你把剪贴板内容URI。粘贴应用程序然后从剪贴板中得到这个URI,并用它来检索数据库中的数据或文件流描述符。


由于粘贴应用程序只有为你的数据内容的URI,它需要知道要检索的数据块。您可以通过在URI本身编码为数据的标识符提供该信息,或者您也可以提供一个独特的URI,将返回要复制的数据。哪种技术选择取决于数据的组织。


以下各节描述了如何设置的URI,如何提供复杂的数据,以及如何提供文件流。该描述假定您熟悉内容提供商设计的一般原则。


编码的URI的标识符


为将数据复制到一个URI剪贴板一个有用的方法是进行编码的标识符的URI本身的数据。然后内容提供商可以从URI中的标识符,并使用它来检索数据。粘贴应用程序不必知道该标识符的存在;所有它做的是从剪贴板让你“参考”(URI中加上标识符),给它的内容提供商,并取回数据。


你通常通过它串联到URI的末尾标识符编码到URI的内容。例如,假设你定义你的供应商URI作为下面的字符串:

"content://com.example.contacts"
如果你想要的名称编码到这个URI,你可以使用下面的代码片段:

String uriString = "content://com.example.contacts" + "/" + "Smith"

// uriString now contains content://com.example.contacts/Smith.

// Generates a uri object from the string representation
Uri copyUri = Uri.parse(uriString);
如果您已经使用内容提供商,您可能要添加,表示URI是复制一个新的URI路径。例如,假设你已经拥有以下URI路径:

"content://com.example.contacts"/people
"content://com.example.contacts"/people/detail
"content://com.example.contacts"/people/images
你可以添加另一个路径是特定于复制的URI:

"content://com.example.contacts/copying"
然后,您可以通过模式匹配检测“复制”URI和代码,具体的复制和粘贴处理。


你通常如果你已经在使用一个内容提供商,内部数据库,或内部表来组织你的数据使用的编码技术。在这些情况下,您有多个作品,你要复制的数据,大概每件的唯一标识符。在回答粘贴申请查询时,您可以通过其标识符查找数据并将其返回。


如果没有多个数据,那么你可能不需要进行编码的标识符。你可以简单地使用URI所独有的提供商。在回应查询时,您的供应商将返回它目前包含的数据。


过得去ID一个记录在笔记本示例应用程序用于从笔记列表中打开一张纸条。该示例使用_id字段从一个SQL数据库,但你可以有你想要的任何数字或字符的标识符。


复制数据结构


您设置复制和粘贴复杂的数据内容提供商作为ContentProvider的组件的子类。你也应该编码URI你把剪贴板,使其指向要提供确切的记录。另外,你必须考虑你的应用程序的现有状态:


如果你已经有了一个内容提供商,您可以添加到它的功能。您可能只需要修改其查询()方法来处理的URI从要粘贴数据的应用程序来。你可能会想修改来处理“复制”URI模式的方法。
如果你的应用程序维护一个内部数据库,您可能希望该数据库移动到内容提供商,以便从它拷贝。
如果你目前没有使用数据库,可以实现一个简单的内容提供商,其唯一目的是提供数据的应用程序,从剪贴板粘贴。
在内容提供商,你将要覆盖至少有以下方法:


query()
粘贴的应用程序会认为他们可以通过使用此方法,你把剪贴板上的URI获取数据。为了支持复制,你应该有这种方法检测含有一种特殊的“复制”路径的URI。然后,应用程序可以创建一个“复制”URI放在剪贴板上,包含副本路径和一个指向要复制的准确记录。
getType()
这个方法应该返回的MIME类型或类型为你打算复制数据。该方法newUri(),以将MIME类型到新ClipData对象调用的getType()。
MIME类型复杂数据中的主题内容提供商描述。


注意,不必有任何的其他内容提供者的方法,如插入件()或更新()。一个粘贴应用程序只需要得到您的支持的MIME类型,并从供应商复制数据。如果你已经有了这些方法,他们不会复制操作干扰。


下面的代码片段demonsrate如何设置你的应用程序来复制复杂的数据:


在您的应用程序的全局常量,声明基本URI字符串,标识您正在使用复制数据的URI字符串的路径。同时声明MIME类型为复制的数据:

// Declares the base URI string
private static final String CONTACTS = "content://com.example.contacts";

// Declares a path string for URIs that you use to copy data
private static final String COPY_PATH = "/copy";

// Declares a MIME type for the copied data
public static final String MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact"
在从用户拷贝数据的活动,设置代码将数据复制到剪贴板。在回答一个副本的请求,把URI剪贴板上:

public class MyCopyActivity extends Activity {

  ...

// The user has selected a name and is requesting a copy.
case R.id.menu_copy:

  // Appends the last name to the base URI
  // The name is stored in "lastName"
  uriString = CONTACTS + COPY_PATH + "/" + lastName;

  // Parses the string into a URI
  Uri copyUri = Uri.parse(uriString);

  // Gets a handle to the clipboard service.
  ClipboardManager clipboard = (ClipboardManager)
    getSystemService(Context.CLIPBOARD_SERVICE);

  ClipData clip = ClipData.newUri(getContentResolver(), "URI", copyUri);

  // Set the clipboard's primary clip.
  clipboard.setPrimaryClip(clip);
在内容提供商在全球范围内,建立一个URI匹配,并添加一个URI模式将匹配你把剪贴板上的URI:

public class MyCopyProvider extends ContentProvider {

  ...

// A Uri Match object that simplifies matching content URIs to patterns.
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// An integer to use in switching based on the incoming URI pattern
private static final int GET_SINGLE_CONTACT = 0;

...

// Adds a matcher for the content URI. It matches
// "content://com.example.contacts/copy/*"
sUriMatcher.addURI(CONTACTS, "names/*", GET_SINGLE_CONTACT);
设置query()方法。这种方法可以处理不同的URL模式,这取决于你如何编写代码,但只显示为剪贴板复制操作模式:

// Sets up your provider's query() method.
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
  String sortOrder) {

  ...

  // Switch based on the incoming content URI
  switch (sUriMatcher.match(uri)) {

  case GET_SINGLE_CONTACT:

    // query and return the contact for the requested name. Here you would decode
    // the incoming URI, query the data model based on the last name, and return the result
    // as a Cursor.

  ...

}
设立的getType()方法返回一个适当的MIME类型复制的数据:

/ Sets up your provider's getType() method.
public String getType(Uri uri) {

  ...

  switch (sUriMatcher.match(uri)) {

  case GET_SINGLE_CONTACT:

      return (MIME_TYPE_CONTACT);
从内容的部分粘贴数据URI介绍了如何从剪贴板中获取内容URI,并使用它来获取和粘贴数据。


复制数据流


您可以复制并粘贴大量的文本和二进制数据流。该数据可以具有形式如下列:


存储在实际设备上的文件。
从插座流。
大量存储在提供商的基础数据库系统中的数据。
数据流的内容提供商提供了一个文件描述符对象访问其数据,如AssetFileDescriptor而不是光标对象。粘贴应用程序读取使用该文件描述符中的数据流。


要设置您的应用程序与供应商复制数据流,请按照下列步骤操作:


数据流你把剪贴板上设置了内容URI。这样做的选择包括以下内容:
编码数据流的识别符上的URI,如在部分编码的URI标识符描述,并且然后保持在提供商包含标识符和相应的流名称的表。
直接在URI编码流的名称。
使用唯一的URI总是返回从提供当前流。如果你使用这个选项,你要记得更新你的供应商,指向不同的流时,你流复制到通过URI剪贴板。
提供一个MIME类型为您计划提供每种类型的数据流。粘贴应用程序需要这些信息来确定是否可以粘贴剪贴板上的数据。
实施的一个返回文件描述符一个流的ContentProvider的方法之一。如果你的内容URI标识编码,使用这种方法来确定要打开的流。
到数据流复制到剪贴板,建设内容URI并将其放在剪贴板上。
要粘贴数据流,一个应用程序获取的剪辑从剪贴板,获取URI,并使用它到打开的流ContentResolver的文件描述符方法的调用。该方法ContentResolver的调用相应的ContentProvider方法,传递内容的URI。你的供应商返回的文件描述符ContentResolver的方法。粘贴然后应用程序有责任从流中读取数据。


下面的列表显示了内容提供商最重要的文件描述符的方法。每一个都有一个相应ContentResolver的方法与字符串“描述符”追加到方法名称;例如,openAssetFile()的ContentResolver的类似物是openAssetFileDescriptor():


openTypedAssetFile()
此方法应返回一个资产的文件描述符,但只有当提供MIME类型由提供者的支持。主叫方(应用程序做粘贴)提供了一个MIME类型模式。 (已复制了URI到剪贴板的应用程序)的内容提供商返回AssetFileDescriptor文件句柄,如果它可以提供MIME类型,或者抛出,如果它不能例外。
此方法处理文件的小节。你可以用它来阅读内容提供商已经复制到剪贴板资产。


openAssetFile()
这种方法是openTypedAssetFile的一个更一般的形式()。它不会过滤允许的MIME类型,但它可以读取文件的小节。
打开文件()
这是openAssetFile的一个更一般的形式()。它不能读取文件的小节。
您可以选择使用openPipeHelper()方法与你的文件描述符的方法。这使得应用程序粘贴在使用管道后台线程读取数据流。要使用此方法,您需要实现ContentProvider.PipeDataWriter接口。这样的例子在笔记本示例应用程序给定,在NotePadProvider.java的openTypedAssetFile()方法。


设计有效的复制/粘贴功能


要设计有效的复制和粘贴功能为您的应用程序,请记住以下几点:


在任何时候,只有一个在剪贴板剪辑。通过系统中的任何应用程序的新副本操作将覆盖以前的剪辑。由于用户可以导航到你的应用程序,距离返回前做一个副本,你不能假设剪贴板中包含了用户在应用程序中先前复制的剪辑。
每剪辑多个ClipData.Item对象的预期目的是支持多个选择的复制和粘贴,而不是不同的形式的参考单个选择。你通常希望所有在剪辑的ClipData.Item对象具有相同的形式,即,他??们都应该是简单的文本,内容URI或意向,但不是的混合物。
当您提供的数据,可以提供不同的MIME表示。添加您的ClipDesc??ription支持MIME类型,然后实现在内容提供商的MIME类型。
当您从剪贴板中获取数据,您的应用程序负责检查可用的MIME类型,然后决定使用哪一个,如果有的话。即使是在剪贴板上的夹子和用户请求糊状,您的应用程序不需要进行粘贴。你应该做的,如果贴的MIME类型是兼容的。您可以选择强迫剪贴板上的数据使用coerceToText()如果你选择文本。如果你的应用程序支持的可用MIME类型不止一个,你可以允许用户选择使用哪一个。

用户评论