¿Cómo copiar texto al portapapeles en Android?

313

¿Alguien puede decirme cómo copiar el texto presente en una vista de texto particular al portapapeles cuando se presiona un botón?

    @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 :)

            }
        });
    }

}

Quiero copiar el texto en TextView textView en el portapapeles cuando bCopyse presiona el botón .

Darshan Gowda
fuente
stackoverflow.com/q/48791271/9274175 Responda estas preguntas en coppy
Yash Kale

Respuestas:

590

utilizar ClipboardManager

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

asegúrese de haber importado android.content.ClipboardManagery NO android.text.ClipboardManager. Este último está en desuso. Consulte este enlace para obtener más información.

stinepike
fuente
3
Esto es para API11 + solo no funciona para GB y versiones inferiores
Javier
48
¿Para qué se usa la "etiqueta"?
Desarrollador de Android el
19
@androiddeveloper Explicación del parámetro "etiqueta": stackoverflow.com/questions/33207809/…
smg
3
@smg ¿Entonces es más para desarrolladores? ¿Pero cómo dice que se muestra a los usuarios?
Desarrollador de Android
77
En androidx se convierte en realidadClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain
72

Aquí el método para copiar texto al portapapeles:

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);
  }
}

Este método funciona en todos los dispositivos Android.

vuhung3990
fuente
2
No entiendo qué significa "contexto". ¿Puedes agregar un ejemplo de cómo llamar correctamente a ese método? Gracias.
E_Blue
1
También parece que el valor de "contexto" no se utiliza. Entonces, ¿por qué debe pasarse como parámetro?
E_Blue
Hola chico, se requiere un contexto fragmentado para llamar a getSystemService
vuhung3990
@E_Blue context.getSystemService (Context.CLIPBOARD_SERVICE) ??? ¿¿¿De Verdad???
androidStud
1
@E_Blue parece que eres un ingenuo desarrollador de Android que pregunta sobre el contexto. Bueno, eso tampoco es un problema, pero solo importa tu tono y estudia un poco / investiga sobre cosas también.
androidStud
57

Ayer hice esta clase. Tómelo, es para todos los niveles de 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 "";
    }

}
COMO
fuente
¿Puedes agregar las declaraciones de importación necesarias para que esta clase funcione?
merlin2011 01 de
@ merlin2011 lo hizo, creo que olvidé el método coerceToText (...). Sry por eso
COMO
¿Qué hace "coerceToText"? Además, ¿es posible copiar / pegar otros tipos de datos en el portapapeles (ejemplo: mapa de bits)?
Desarrollador de Android el
1
@AS ¿por qué escribiste el método corceToText? ! ya está disponible con api, vea developer.android.com/reference/android/content/…
Hardik
Pero creo que hay tiempo para que los desarrolladores dejen de admitir cosas antes sobre API17. ¿No quedan muchas unidades de los tipos mayores y no tienden a descargar nuevas aplicaciones? Por ejemplo, uso unidades mayores para la navegación en mi velero, y todo lo demás se borra. ¿No me importa lanzar esas unidades por la borda por error?
Jan Bergström
23

Como una práctica extensión de Kotlin:

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

Actualizar:

Si usa ContextCompat debe usar:

ContextCompat.getSystemService(this, ClipboardManager::class.java)
crgarridos
fuente
1
La API ahora ha cambiado a clipboardManager = getSystemService (context, ClipboardManager :: class.java)
Por Christian Henden
en realidad cambió a context.getSystemService(ClipboardManager::class.java)usted está apuntando a una firma de ContextCompat, ¿no es así? Gracias por los comentarios
crgarridos
13

Solo usa esto. Solo funciona para Android api> = 11 antes de eso tendrás que usar un ClipData.

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

Espero que te haya ayudado :)

[ACTUALIZACIÓN 19/03/2015] Al igual que Ujjwal Singh dijo que el método setTextestá en desuso ahora, debe usar, tal como lo recomiendan los documentos, setPrimaryClip (clipData)

Ektos974
fuente
1
Ese es el nombre de mi variable. Si está en su actividad, simplemente use (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974
1
Desaprobado - no use setTextuse ClipData+setPrimaryClip
Ujjwal Singh
1
Para mí también muestra un error al usar setPrimaryClip
Praneeth
11

Esto se puede hacer en Kotlin así:

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

¿Dónde file.readText()está tu cadena de entrada?

Nikhil Katekhaye
fuente
7

usa este código

   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(); 
        }
    });
}
SKG
fuente
Muchas gracias, es muy fácil de usar.
iamkdblue
7

use esta función para copiar al portapapeles

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");
}
Vimal Gajera
fuente
6
@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();
    }   
}
Himanshu Aggarwal
fuente
2

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();
    }
Pankaj Singh
fuente
2

usa este método:

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

en el lugar de setPrimaryClip también podemos usar los siguientes métodos:

void    clearPrimaryClip()

Borra cualquier clip primario actual en el portapapeles.

ClipData    getPrimaryClip()

Devuelve el clip primario actual en el portapapeles.

ClipDescription getPrimaryClipDescription()

Devuelve una descripción del clip primario actual en el portapapeles pero no una copia de sus datos.

CharSequence    getText()

Este método está en desuso. Utilice getPrimaryClip () en su lugar. Esto recupera el clip primario e intenta forzarlo a una cadena.

boolean hasPrimaryClip()

Devuelve verdadero si actualmente hay un clip primario en el portapapeles.

Pradeep Kumar
fuente
1
    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();
Keshav Gera
fuente
0

Prueba el siguiente código. Admitirá la última 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);
                            }}
Ranjith Guru
fuente
0

Método auxiliar de Kotlin para adjuntar clic para copiar textos en un TextView

Pon este método en algún lugar de la clase Util. Este método adjunta el detector de clics en la vista de texto a Copiar contenido de textView a un clipText al hacer clic en ese textView

/**
 * 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()
        }
    }

}
Hitesh Sahu
fuente
0

Puede realizar esta función de copiar al portapapeles cuando haga clic en el evento del botón. así que ponga estas líneas de código dentro de su botón en ClickListerner

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();
Malith Ileperuma
fuente
0

Solo escribe este código:

clipboard.setText(getstring);
raza raza
fuente
Olvidó inicializar clipboard. Pero gracias por setText. Está en desuso, así que úsalo val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind
-1

Para Kotlin

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