如何在 Android 中将文本复制到剪贴板?

Posted

技术标签:

【中文标题】如何在 Android 中将文本复制到剪贴板?【英文标题】:How to Copy Text to Clip Board in Android? 【发布时间】:2013-10-08 16:55:08 【问题描述】:

谁能告诉我当按下按钮时如何将特定文本视图中的文本复制到剪贴板?

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainpage);
    textView = (TextView) findViewById(R.id.textview);
    copyText = (Button) findViewById(R.id.bCopy);
    copyText.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub
            
            ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
            String getstring = textView.getText().toString();
            
            // Help to continue :)
        
    );

当按下按钮bCopy时,我想将TextView textView中的文本复制到剪贴板。

【问题讨论】:

How to copy text programmatically in my android app?的可能重复 ***.com/q/48791271/9274175 请在 coppy 上回答这个问题 【参考方案1】:

使用ClipboardManager

 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

确保您已导入 android.content.ClipboardManager 而不是 android.text.ClipboardManager。后者已弃用。 查看此link 了解更多信息。

【讨论】:

这仅适用于 API11+,不适用于 GB 及以下 “标签”是干什么用的? @androiddeveloper “label”参数解释:***.com/questions/33207809/… @smg 所以更适合开发人员?但它怎么会说它是为用户显示的呢? 在androidx中它实际上变成了ClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);【参考方案2】:

这里是复制文本到剪贴板的方法:

private void setClipboard(Context context, String text) 
  if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) 
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText(text);
   else 
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
    clipboard.setPrimaryClip(clip);
  

此方法适用于所有安卓设备。

【讨论】:

我不明白“上下文”是什么意思。您能否添加一个如何正确调用该方法的示例?谢谢。 嘿家伙,片段中需要上下文才能调用 getSystemService @E_Blue context.getSystemService(Context.CLIPBOARD_SERVICE) ???真的??? @E_Blue 看起来你是一个在询问上下文的天真 android 开发人员。嗯,这也不是问题,但请注意你的语气,也对事情进行一些研究/研究。【参考方案3】:

昨天我做了这门课。接受吧,它适用于所有 API 级别

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.net.Uri;
import android.util.Log;
import de.lochmann.nsafirewall.R;

public class MyClipboardManager 

    @SuppressLint("NewApi")
    @SuppressWarnings("deprecation")
    public boolean copyToClipboard(Context context, String text) 
        try 
            int sdk = android.os.Build.VERSION.SDK_INT;
            if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) 
                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                        .getSystemService(context.CLIPBOARD_SERVICE);
                clipboard.setText(text);
             else 
                android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context
                        .getSystemService(context.CLIPBOARD_SERVICE);
                android.content.ClipData clip = android.content.ClipData
                        .newPlainText(
                                context.getResources().getString(
                                        R.string.message), text);
                clipboard.setPrimaryClip(clip);
            
            return true;
         catch (Exception e) 
            return false;
        
    

    @SuppressLint("NewApi")
    public String readFromClipboard(Context context) 
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) 
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                    .getSystemService(context.CLIPBOARD_SERVICE);
            return clipboard.getText().toString();
         else 
            ClipboardManager clipboard = (ClipboardManager) context
                    .getSystemService(Context.CLIPBOARD_SERVICE);

            // Gets a content resolver instance
            ContentResolver cr = context.getContentResolver();

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

                String text = null;
                String title = 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 pointing to a note
                Uri uri = item.getUri();

                // If the contents of the clipboard wasn't a reference to a
                // note, then
                // this converts whatever it is to text.
                if (text == null) 
                    text = coerceToText(context, item).toString();
                

                return text;
            
        
        return "";
    

    @SuppressLint("NewApi")
    public CharSequence coerceToText(Context context, ClipData.Item item) 
        // If this Item has an explicit textual value, simply return that.
        CharSequence text = item.getText();
        if (text != null) 
            return text;
        

        // If this Item has a URI value, try using that.
        Uri uri = item.getUri();
        if (uri != null) 

            // First see if the URI can be opened as a plain text stream
            // (of any sub-type). If so, this is the best textual
            // representation for it.
            FileInputStream stream = null;
            try 
                // Ask for a stream of the desired type.
                AssetFileDescriptor descr = context.getContentResolver()
                        .openTypedAssetFileDescriptor(uri, "text/*", null);
                stream = descr.createInputStream();
                InputStreamReader reader = new InputStreamReader(stream,
                        "UTF-8");

                // Got it... copy the stream into a local string and return it.
                StringBuilder builder = new StringBuilder(128);
                char[] buffer = new char[8192];
                int len;
                while ((len = reader.read(buffer)) > 0) 
                    builder.append(buffer, 0, len);
                
                return builder.toString();

             catch (FileNotFoundException e) 
                // Unable to open content URI as text... not really an
                // error, just something to ignore.

             catch (IOException e) 
                // Something bad has happened.
                Log.w("ClippedData", "Failure loading text", e);
                return e.toString();

             finally 
                if (stream != null) 
                    try 
                        stream.close();
                     catch (IOException e) 
                    
                
            

            // If we couldn't open the URI as a stream, then the URI itself
            // probably serves fairly well as a textual representation.
            return uri.toString();
        

        // Finally, if all we have is an Intent, then we can just turn that
        // into text. Not the most user-friendly thing, but it's something.
        Intent intent = item.getIntent();
        if (intent != null) 
            return intent.toUri(Intent.URI_INTENT_SCHEME);
        

        // Shouldn't get here, but just in case...
        return "";
    


【讨论】:

你能添加必要的导入语句来使这个类工作吗? @merlin2011 做到了,我想我忘记了 coerceToText(...) 方法。对不起 “coerceToText”有什么作用?另外,是否可以将其他类型的数据复制/粘贴到剪贴板(例如:位图)? @A.S.为什么你自己写 corceToText 方法? !它已经与 api 一起可用,请参阅developer.android.com/reference/android/content/… 但我认为开发人员有时间停止支持 API17 之前的内容。老人家单位不多,不下载新应用?例如,我在我的帆船上使用老单位进行导航,而其他一切都被清除了。我不介意误把这些单位扔到船上?【参考方案4】:

作为一个方便的 kotlin 扩展:

fun Context.copyToClipboard(text: CharSequence)
    val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("label",text)
    clipboard.setPrimaryClip(clip)

更新:

如果你使用 ContextCompat,你应该使用:

ContextCompat.getSystemService(this, ClipboardManager::class.java)

【讨论】:

API 现在已更改为 clipboardManager = getSystemService(context, ClipboardManager::class.java) 它实际上已更改为context.getSystemService(ClipboardManager::class.java) 您指向的是 ContextCompat 签名,不是吗?感谢您的反馈 将最后一行改为clipboard.setPrimaryClip(clip)【参考方案5】:

对于 Jetpack Compose

val localClipboardManager = LocalClipboardManager.current
localClipboardManager.setText(AnnotatedString("Your text here"))

【讨论】:

【参考方案6】:

就用这个吧。它仅适用于 android api >= 11,在此之前您必须使用 ClipData。

ClipboardManager _clipboard = (ClipboardManager) _activity.getSystemService(Context.CLIPBOARD_SERVICE);
_clipboard.setText(YOUR TEXT);

希望对你有所帮助:)

[2015 年 3 月 19 日更新] 就像Ujjwal Singh 所说的那样,setText 方法现在已弃用,您应该使用,就像文档推荐的那样,setPrimaryClip(clipData)

【讨论】:

那个我的变量名。如果您正在进行活动,请使用 (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT); 已弃用 - 不要使用 setText 使用 ClipData+setPrimaryClip 对我来说,使用 setPrimaryClip 时也显示错误【参考方案7】:

这可以像这样在 Kotlin 中完成:

var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var clip = ClipData.newPlainText("label", file.readText())
clipboard.setPrimaryClip = clip

file.readText() 是您的输入字符串。

【讨论】:

从 API 级别 29 开始,在 Kotlin 中必须使用 setPrimaryClip 而不是 primaryClip【参考方案8】:

使用此代码

   private ClipboardManager myClipboard;
   private ClipData myClip;
   TextView textView;
   Button copyText;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainpage);
    textView = (TextView) findViewById(R.id.textview);
    copyText = (Button) findViewById(R.id.bCopy);
    myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);

    copyText.setOnClickListener(new View.OnClickListener() 


        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub


           String text = textView.getText().toString();
           myClip = ClipData.newPlainText("text", text);
           myClipboard.setPrimaryClip(myClip);
           Toast.makeText(getApplicationContext(), "Text Copied", 
           Toast.LENGTH_SHORT).show(); 
        
    );

【讨论】:

非常感谢,它非常易于使用。【参考方案9】:

使用此功能复制到剪贴板

public void copyToClipboard(String copyText) 
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) 
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager)
                getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(copyText);
     else 
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager)
                getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData clip = android.content.ClipData
                .newPlainText("Your OTP", copyText);
        clipboard.setPrimaryClip(clip);
    
    Toast toast = Toast.makeText(getApplicationContext(),
            "Your OTP is copied", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT, 50, 50);
    toast.show();
    //displayAlert("Your OTP is copied");

【讨论】:

【参考方案10】:
@SuppressLint( "NewApi", "NewApi", "NewApi", "NewApi" )
@SuppressWarnings("deprecation")
@TargetApi(11)
public void onClickCopy(View v)    // User-defined onClick Listener
    int sdk_Version = android.os.Build.VERSION.SDK_INT;
    if(sdk_Version < android.os.Build.VERSION_CODES.HONEYCOMB) 
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(textView.getText().toString());   // Assuming that you are copying the text from a TextView
        Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
    
    else  
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
        android.content.ClipData clip = android.content.ClipData.newPlainText("Text Label", textView.getText().toString());
        clipboard.setPrimaryClip(clip);
        Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
       

【讨论】:

【参考方案11】:

Kotlin 扩展功能 2021:

fun Context.copyToClipboard(text: CharSequence)
    val clipboard = ContextCompat.getSystemService(this,ClipboardManager::class.java)
    clipboard?.setPrimaryClip(ClipData.newPlainText("",text))

【讨论】:

【参考方案12】:

使用这个方法:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

在setPrimaryClip的地方我们还可以使用以下方法:

void    clearPrimaryClip()

清除剪贴板上的所有当前主剪辑。

ClipData    getPrimaryClip()

返回剪贴板上的当前主剪辑。

ClipDescription getPrimaryClipDescription()

返回剪贴板上当前主剪辑的描述,但不返回其数据的副本。

CharSequence    getText()

此方法已弃用。请改用 getPrimaryClip()。这会检索主剪辑并尝试将其强制转换为字符串。

boolean hasPrimaryClip()

如果剪贴板上当前有主剪辑,则返回 true。

【讨论】:

【参考方案13】:

使用 Jetpack Compose,这真的很容易:

AmbientClipboardManager.current.setText(AnnotatedString("Copied Text"))

【讨论】:

【参考方案14】:

int sdk = android.os.Build.VERSION.SDK_INT;

    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) 
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) DetailView.this
                .getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText("" + yourMessage.toString());
        Toast.makeText(AppCstVar.getAppContext(),
                "" + getResources().getString(R.string.txt_copiedtoclipboard),
                Toast.LENGTH_SHORT).show();
     else 
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) DetailView.this
                .getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData clip = android.content.ClipData
                .newPlainText("message", "" + yourMessage.toString());
        clipboard.setPrimaryClip(clip);
        Toast.makeText(AppCstVar.getAppContext(),
                "" + getResources().getString(R.string.txt_copiedtoclipboard),
                Toast.LENGTH_SHORT).show();
    

【讨论】:

【参考方案15】:
    String stringYouExtracted = referraltxt.getText().toString();
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", stringYouExtracted);

clipboard.setPrimaryClip(clip);
        Toast.makeText(getActivity(), "Copy coupon code copied to clickboard!", Toast.LENGTH_SHORT).show();

【讨论】:

【参考方案16】:

使用 Java 的简单易用的 Android。

copytext.setOnClickListener(v -> 
            ClipboardManager myClipboard;
            myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
            ClipData myClip;
            String Text = "Hello World!";
            myClip = ClipData.newPlainText("text", Text);
            myClipboard.setPrimaryClip(myClip);

            Toast.makeText(this, "Copy", Toast.LENGTH_SHORT).show();
        );

【讨论】:

【参考方案17】:
 ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

【讨论】:

不要忘记之前可以在mContext中定义的上下文......或者只是添加MyActivity.this,getAcplicationContext......还是一样的getApplicationContext.getSystemService【参考方案18】:

==>点击查看复制内容太容易了。

-> 将文本存储到字符串变量中。

-> 创建 ClipboardManager 的变量

-> 制作 ClipData 的变量

-> 必须从包中导入为“android.content”。

-> 将剪辑设置为clipboard.setPrimaryclick。

-> 完成。

例如

import android.content.ClipboardManager;

import android.content.ClipData;





    stringNodetxt.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            String stringNodeCopied= stringNodetxt.getText().toString();

            ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            ClipData clip = android.content.ClipData.newPlainText("Copied", stringNodeCopied);

            clipboard.setPrimaryClip(clip);
            Toast.makeText(getBaseContext(), "copied to clipboard!", Toast.LENGTH_SHORT).show();
        
    );

【讨论】:

【参考方案19】:

用于将文本复制到剪贴板的简单 Kotlin 扩展函数

fun Context.copyToClipboard(clipLabel: String, text: CharSequence)
    val clipboard = ContextCompat.getSystemService(this, ClipboardManager::class.java)
    clipboard?.setPrimaryClip(ClipData.newPlainText(clipLabel, text))

    toast("Copied $clipLabel")

【讨论】:

【参考方案20】:

试试下面的代码。它将支持最新的 API:

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                        if (clipboard.hasPrimaryClip()) 
                            android.content.ClipDescription description = clipboard.getPrimaryClipDescription();
                            android.content.ClipData data = clipboard.getPrimaryClip();
                            if (data != null && description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
                            
                                String url= (String) clipboard.getText();
                                searchText.setText(url);
                                System.out.println("data="+data+"description="+description+"url="+url);
                            

【讨论】:

【参考方案21】:

Kotlin 辅助方法在 TextView 上附加单击以复制文本

把这个方法放在 Util 类的某个地方。此方法将 textview 上的单击侦听器附加到单击该 textView 时将 textView 的内容复制到 clipText

/**
 * Param:  cliplabel, textview, context
 */
fun attachClickToCopyText(textView: TextView?, clipLabel: String, context: Context?) 
    if (textView != null && null != context) 
        textView.setOnClickListener 
            val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val clip = ClipData.newPlainText(clipLabel, textView!!.text)
            clipboard.primaryClip = clip
            Snackbar.make(textView,
                    "Copied $clipLabel", Snackbar.LENGTH_LONG).show()
        
    


【讨论】:

【参考方案22】:

您可以在 onclick 按钮事件时执行此复制到剪贴板功能。所以把这些代码行放在你的按钮 onClickListerner 中

android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clipData = android.content.ClipData.newPlainText("Text Label", ViewPass.getText().toString());
clipboardManager.setPrimaryClip(clipData);
Toast.makeText(getApplicationContext(),"Copied from Clipboard!",Toast.LENGTH_SHORT).show();

【讨论】:

【参考方案23】:

Kotlin 我有一个扩展

fun Context.copyToClipboard(text: String) 
  val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
  val clip =
    ClipData.newPlainText(getString(R.string.copy_clipboard_label, getString(R.string.app_name)),text)
  clipboard.setPrimaryClip(clip)

【讨论】:

【参考方案24】:

在 Android 中复制任何文本:

            TextView text = findViewById(R.id.text_id);
            ImageView icons = findViewById(R.id.copy_icon);

            icons.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
                    ClipData clipData = ClipData.newPlainText("text whatever you want", text.getText().toString());
                    clipboardManager.setPrimaryClip(clipData);

                    Toast.makeText(context, "Text Copied", Toast.LENGTH_SHORT).show();
                
            );

【讨论】:

【参考方案25】:

搜索剪贴板列表首先获取剪贴板对象,如下所示:

private val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

然后通过此函数检查剪贴板中是否有任何数据:

fun isClipboardContainsData() : Boolean
        return when
            !clipboard.hasPrimaryClip() -> false
            else -> true
        
    

然后使用此函数遍历剪贴板对象,如下所示:

fun searchClipboard() : ClipData.Item? 
        return if (isClipboardContainsData())

            val items = clipboard.primaryClip
            val clipboardSize = items?.itemCount ?: 0
            for (i in 0..clipboardSize) 
                val item = items?.getItemAt(i)
                return if (item != null)
                       return item
                else
                    null
            
            return null
        else
            null

    

在这里您可以看到 searchClipboard Item 将返回 ClipData.Item 类型的项目,剪贴板包含 ClipData.Item 列表,如果您通过剪贴板的实现,您会发现有关 ClipData.Item 的内容:

public static class Item 
    final CharSequence mText;
    final String mhtmlText;
    final Intent mIntent;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
    Uri mUri;

所以您可以在剪贴板项目中保存的内容可能是以下类型:

    字符序列 字符串 Intent(这支持复制应用程序快捷方式) Uri(用于从内容提供者复制复杂数据)

【讨论】:

【参考方案26】:

如果你想缩短使用时间:

ClipData clip = ClipData.newPlainText(label, text);
((ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(clip);

【讨论】:

【参考方案27】:

只要写下这段代码:

clipboard.setText(getstring);

【讨论】:

您忘记初始化clipboard。但感谢setText。它已被弃用,因此请使用val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip) 你需要先获取剪贴板对象

以上是关于如何在 Android 中将文本复制到剪贴板?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中将图像复制到剪贴板

Android 从剪贴板管理器复制/粘贴

Android 复制文本内容到系统剪贴板(自由复制)

Android:将文本复制到 API < 11 的剪贴板

如何在vim中将选定的行复制到剪贴板

使用 iOS 将文本复制到剪贴板