Android中ClipData中的“标签”参数到底是啥?

Posted

技术标签:

【中文标题】Android中ClipData中的“标签”参数到底是啥?【英文标题】:What exactly is "label" parameter in ClipData in Android?Android中ClipData中的“标签”参数到底是什么? 【发布时间】:2016-01-17 09:50:34 【问题描述】:

根据android documentation,ClipData 使用“标签”作为复制数据的一种表示。

ClippedData 是一种复杂类型,包含一个或多个 Item 实例,每个实例可以包含一个或多个数据项的表示。为了向用户显示,它还具有标签和图标表示。

然后在某些API docs 中进一步将“标签”解释为剪辑数据的用户可见标签。但是,我仍然对标签的使用感到困惑。

这个标签如何对用户可见?我应该如何使用它?当我调用 ClipData 工厂方法newPlainText(CharSequence label, CharSequence text) 时,我应该为这个标签设置什么?例如:

private void copyToClipBoard() 

    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText(
            "text label", // What should I set for this "label"?
            "content to be copied");
    clipboard.setPrimaryClip(clip);
    Toast.makeText(AboutActivity.this, "Saved to clip board", Toast.LENGTH_SHORT).show();

【问题讨论】:

【参考方案1】:
ClipData clip = ClipData.newPlainText(
            "text label", 
            "content to be copied");

这里的文本标签描述了剪辑中的数据

例如。

ClipData clip = ClipData.newPlainText(
            "user Name",
            user.getName()); 

我们可以通过使用来检索它

clip.getDescription ();

【讨论】:

文档“剪辑数据的用户可见标签”中的术语User 是否实际上意味着开发人员而不是应用程序的用户?我认为应用程序的用户知道这个标签没有任何价值... 标签仅供开发者使用,不适用于应用用户 不错!我对“用户可见”的描述感到困惑......但现在很清楚了。【参考方案2】:

文档中的“剪辑数据的用户可见标签”描述似乎应该被解释为您作为开发人员可以设置然后自己显示给用户的内容,而不是 Android 系统将显示给用户的内容用户。

查看 Android 源代码时,ClipDescription.getLabel() 方法似乎在 Android 5.0 之前未使用。在 5.0 RemoteInput 中,RemoteInputCompatJellybean 和 com.android.mail.compose.ComposeActivity 声明为 using the method。

如果您查看使用情况,所有这些都会设置一个标签,该标签不会被用户看到,而是用于以编程方式识别代码中不同位置的剪辑。

查看 Android 中 ClipData.newPlainText() is used 的方式时,大多数情况下 null 作为标签给出,这表明标签实际上并没有用于任何用途。

在某些情况下,某些手机制造商或其他应用程序开发人员当然可能会获取标签并将其显示给用户。但一般来说,如果您自己显示剪辑的标签,则应该安全地假设它只会在您的应用中显示给用户。

【讨论】:

【参考方案3】:

今天在开发我的应用程序时,我发现了 ClipData 标签的一个用例。一些应用程序将其设置为 null,而其他应用程序几乎使用它。

就我的应用而言,我正在收听 ClipManager 的 addPrimaryClipChangedListener

我在几乎一直在后台运行的服务类中执行此操作。我想将在我的应用程序中添加到 primaryClip 的数据与在另一个应用程序中添加的数据区别对待(比如说在网络浏览器中复制的文本)。

这是我的代码摘录以及我如何使用 ClipData 标签:

mClipBoardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() 
            @Override
            public void onPrimaryClipChanged() 
                String clipLabel = "default";
                if (mClipBoardManager.getPrimaryClip().getDescription().getLabel() != null) 
                    clipLabel = mClipBoardManager.getPrimaryClip().getDescription().getLabel().toString();
                
                if (clipLabel.equals("auto_copy_text")) 
                    //TODO: Text from my app do stuffs you will do with text from my app
                 else 
                    //TODO: Text from some other app
                

            
        );

在我的应用程序中,当我向 primaryClip 添加数据时,我会包含如下标签:

private void addToClipboard(String text) 
        mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        mClipboardManager.setPrimaryClip(ClipData.newPlainText("auto_copy_text", text));
    

希望对你有帮助

【讨论】:

【参考方案4】:

我注意到的另一件事是,如果用户再次复制具有相同标签的数据,那么之前具有相同标签的文本将被覆盖。因此,一个标签只能保留一份数据副本,有助于清除以前的混乱。 标签还可用于识别您的唯一文本,即使它不是用户复制的最后一件事,也可用于检索您的文本数据。

【讨论】:

以上是关于Android中ClipData中的“标签”参数到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何从 ClipData 获取图像?

android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/picFolder/1.jpg 通过 ClipData.

通过 ClipData.Item.getUri 暴露在应用程序之外

android.os.FileUriExposedException:file:///storage/emulated/0/Pictures/picFolder/1.jpg通过ClipData.Ite

exposed beyond app through ClipData.Item.getUri()

android 7.0拍照问题file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri