일모도원(日暮途遠) 개발자

[안드로이드 개발] 클립보드에 텍스트가 있는데 hasPrimaryClip이 false가 날때 본문

안드로이드 개발/안드로이드

[안드로이드 개발] 클립보드에 텍스트가 있는데 hasPrimaryClip이 false가 날때

달님개발자 2023. 4. 19. 00:26

분명히 손으로 붙여넣기하면 텍스트가 붙여넣어지는데, 평소에 잘쓰던 아래 코드가 안먹는다. 보니까 hasPrimaryClip이 false를 리턴한다.

public static String getTextFromClipboard(Context context) {
    String str = "";
    ClipboardManager cm = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
    if ((cm != null) && (cm.hasPrimaryClip() == true)) {
        ClipData clip = cm.getPrimaryClip();
        ClipData.Item item = clip.getItemAt(0);
        if ((item != null) && (item.getText() != null)) {
            str = item.getText().toString();
        }
    }
    return str;
}

 

구글링을 해보니까, 이럴때는 딜레이를 좀 줘서 실행해보라고 한다. 이렇게 하니 정상적으로 된다.

//getTextFromClipboard가 안먹는 경우는 아래를 사용하자.
public interface CopyConvPracticeListener {
    public void countOfSentencesToCopy(int countToCopy);
}
public static void getTextFromClipboardWithDelay(Context context, final OnTextFromClipboardListener listener) {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            String str = "";
            ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
            if (cm != null && cm.hasPrimaryClip()) {
                ClipData clip = cm.getPrimaryClip();
                ClipData.Item item = clip.getItemAt(0);
                if (item != null && item.getText() != null) {
                    str = item.getText().toString();
                }
            }
            listener.onTextFromClipboard(str);
        }
    }, 1000);
}

부를때는 아래처럼 부르면 된다.

//부르는 쪽에서는 아래처럼 
CopyTextUtil.getTextFromClipboardWithDelay(this, new CopyTextUtil.OnTextFromClipboardListener() {
    @Override
    public void onTextFromClipboard(String text) {
	//text에는 클립보드의 내용이 들어가 있다.
    }
});

//람다를 이용하면 코드를 좀 줄일수 있다.
CopyTextUtil.getTextFromClipboardWithDelay(this, (text) -> {
  //text에는 클립보드의 내용이 들어가 있다.
});