Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android copy/paste from clipboard manager

Is it possible to send past command so that it pastes text into currently focused edit text. Scenario:

  1. Background service listening for notification (done)
  2. When notification is received text needs to be copied to clipboard (done)
  3. Paste text to any currently focused field, if not possible just discard paste command.

I know how to copy text with ClipboardManager, but I don't know how to paste it.

like image 728
Damir Avatar asked Oct 04 '13 09:10

Damir


3 Answers

you can copy and paste text using following code :

  • for copy :

    ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("your_text_to_be_copied");
    clipboard.setPrimaryClip(clip);
    
  • And paste it :

    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    String pasteData = "";
    
     // If it does contain data, decide if you can handle the data.
    if (!(clipboard.hasPrimaryClip())) {
    
    } else if (!(clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))) {
    
        // since the clipboard has data but it is not plain text
    
    } else {
    
        //since the clipboard contains plain text.
        ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
    
        // Gets the clipboard as text.
        pasteData = item.getText().toString(); 
    }
    

for more details check here

like image 190
Mukesh Kumar Singh Avatar answered Nov 11 '22 09:11

Mukesh Kumar Singh


If you just want to "copy and paste" some code into your app, you can use the following.

#Copy

String textToCopy = etCodeWindow.getText().toString();

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(null, textToCopy);
if (clipboard == null) return;
clipboard.setPrimaryClip(clip);

#Paste

Get the text to paste

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard == null) return;
ClipData clip = clipboard.getPrimaryClip();
if (clip == null) return;
ClipData.Item item = clip.getItemAt(0);
if (item == null) return;
CharSequence textToPaste = item.getText();
if (textToPaste == null) return;

or

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
    CharSequence textToPaste = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
    return;
}

or the same in Kotlin:

val clipboard = (getSystemService(Context.CLIPBOARD_SERVICE)) as? ClipboardManager
val textToPaste = clipboard?.primaryClip?.getItemAt(0)?.text ?: return false

Inserting it at the cursor position

If there is a selection then the selection will be replaced with the paste text.

int start = Math.max(myEditText.getSelectionStart(), 0);
int end = Math.max(myEditText.getSelectionEnd(), 0);
myEditText.getText().replace(Math.min(start, end), Math.max(start, end),
            textToPaste, 0, textToPaste.length());

#Notes

  • This answer assumes that you are no longer supporting pre-API 11. If you are then see the edit history.
  • Import android.content.ClipboardManager and android.content.ClipData.
  • I used to just get the paste text in a one liner until I discovered that ClipData was giving a NPE crash sometimes. Now I would either use a try/catch block or check more carefully for nulls.
like image 29
Suragch Avatar answered Nov 11 '22 09:11

Suragch


a short summary of above after honeycomb >= API 13:

public String readFromClipboard() {
    ClipboardManager clipboard = (ClipboardManager) 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)) 
            return String.valueOf(data.getItemAt(0).getText());
    }
    return null;
}
like image 33
tom nobleman Avatar answered Nov 11 '22 09:11

tom nobleman