안드로이드에서 클립 보드에 텍스트를 복사하는 방법?


313

버튼을 누를 때 특정 텍스트보기에있는 텍스트를 클립 보드에 복사하는 방법을 알려주시겠습니까?

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

            }
        });
    }

}

Button bCopy을 누르면 TextView textView의 텍스트를 클립 보드로 복사하고 싶습니다 .



stackoverflow.com/q/48791271/9274175 coppy에서이 질문에 대답하십시오
Yash Kale

답변:


590

ClipboardManager 사용

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

가져 android.content.ClipboardManager오고 NOT 했는지 확인하십시오 android.text.ClipboardManager. 나중에 더 이상 사용되지 않습니다. 자세한 내용은 이 링크 를 확인 하십시오.


3
이것은 API11 + 용이며 GB 이하에서는 작동하지 않습니다.
Javier

48
"라벨"이란 무엇입니까?
안드로이드 개발자

19
@androiddeveloper "label"매개 변수 설명 : stackoverflow.com/questions/33207809/…
smg

3
@smg 그래서 개발자를위한 것이 더 많습니까? 그러나 사용자에게 표시되는 것은 무엇입니까?
안드로이드 개발자

7
androidx에서는 실제로 다음과 같이됩니다.ClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain

72

다음은 텍스트를 클립 보드에 복사하는 방법입니다.

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

이 방법은 모든 안드로이드 장치에서 작동합니다.


2
나는 "문맥"의 의미를 이해하지 못한다. 해당 메소드를 올바르게 호출하는 방법에 대한 예를 추가 할 수 있습니까? 감사.
E_Blue

1
또한 "context"값이 사용되지 않은 것 같습니다. 그렇다면 왜 매개 변수로 전달해야합니까?
E_Blue

이봐, getSystemService를 호출하기 위해 컨텍스트에 컨텍스트가 필요합니다
vuhung3990

@E_Blue context.getSystemService (Context.CLIPBOARD_SERVICE) ??? 정말???
androidStud

1
@E_Blue는 컨텍스트에 대해 묻는 순진한 Android 개발자 인 것 같습니다. 글쎄, 그것은 또한 문제가 아니지만, 당신의 어조를 생각하고 사물에 대한 연구 / 연구도하십시오.
androidStud

57

어제 나는이 수업을했다. 가져 가라, 그것은 모든 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 "";
    }

}

이 클래스를 작동시키기 위해 필요한 import 문을 추가 할 수 있습니까?
merlin2011

@ merlin2011은 그것을했다, 내가 coerceToText (...) 메소드를 잊어 버렸다고 생각한다. 그것을 위해 Sry
AS

"coerceToText"는 무엇을합니까? 또한 다른 유형의 데이터를 클립 보드에 복사 / 붙여 넣기 (예 : 비트 맵) 할 수 있습니까?
안드로이드 개발자

1
@AS는 왜 corceToText 메서드를 직접 작성 했습니까? ! 그것은 이미 API와 함께 사용할 수 developer.android.com/reference/android/content/…
Hardik

그러나 API17에 대해 개발자가 지원을 중단해야 할 때가 있다고 생각합니다. 더 오래된 유형의 유닛이 많지 않고 새로운 앱을 다운로드하지 않는가? 예를 들어, 나는 요트에서 항해를 위해 장로를 사용하고 다른 모든 것은 지워집니다. 실수로 그러한 장치를 보드 위에 던지는 것이 마음에 들지 않습니까?
Jan Bergström

23

편리한 kotlin 확장 기능 :

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

최신 정보:

ContextCompat를 사용하는 경우 다음을 사용해야합니다.

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

1
API는 이제 clipboardManager = getSystemService (문맥, ClipboardManager :: class.java)로 변경되었습니다
당 기독교 Henden에게

그것은 실제로 context.getSystemService(ClipboardManager::class.java)당신에게 ContextCompat 서명을 가리키는 것으로 바뀌 었 습니까? 피드백 주셔서 감사합니다
crgarridos

13

이것을 사용하십시오. ClipData를 사용해야하기 전에 android api> = 11에서만 작동합니다.

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

그것이 당신을 도왔기를 바랍니다 :)

[업데이트 3/19/2015 ] Ujjwal Singh이 말한 것처럼 메소드 setText가 더 이상 사용되지 않는다고 말했듯 이 문서에서 권장하는 것처럼 setPrimaryClip (clipData)


1
그것은 내 변수의 이름입니다. 활동중인 경우 (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974

1
추천하지 않습니다 - 사용하지 않는 setText사용을 ClipData+setPrimaryClip
Ujjwal 싱

1
나에게 setPrimaryClip
Praneeth

11

이것은 Kotlin에서 다음과 같이 수행 할 수 있습니다.

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

file.readText()입력 문자열은 어디에 있습니까 ?


7

이 코드를 사용하십시오

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

사용하기 매우 쉬운 많은 감사합니다.
iamkdblue

7

이 기능을 사용하여 클립 보드에 복사

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

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

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

2

이 방법을 사용하십시오 :

 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를 반환합니다.


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

0

다음 코드를 시도하십시오. 최신 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);
                            }}

0

클릭하여 TextView에 텍스트를 복사하는 Kotlin 도우미 방법

이 메소드를 Util 클래스의 어딘가에 넣으십시오. 이 메소드는 textView의 클릭 리스너를 연결하여 textView의 클릭으로 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()
        }
    }

}

0

onclick 버튼 이벤트시 클립 보드로 복사 기능을 수행 할 수 있습니다. 이 코드 라인을 버튼 안에 넣습니다.

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

0

이 코드를 작성하십시오.

clipboard.setText(getstring);

초기화를 잊었습니다 clipboard. 하지만 감사합니다 setText. 더 이상 사용되지 않으므로을 사용하십시오 val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind

-1

코 틀린

 ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.