Development/Android

안드로이드10에서 클립보드 내용 가져오기.

Jamie 2020. 9. 5. 16:23
반응형

안드로이드 앱을 개발중, 클립보드내용을 앱에서 붙여넣기 하는 기능을 구현해야했습니다.

 

안드로이드 8.0에서는 기존의 방식대로 정상적으로 작동합니다.

public String getClipboardText() {
  try {
      ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
      if(clipboard.hasPrimaryClip()) {
          ClipData clip = clipboard.getPrimaryClip();
          if(clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
              return clip.getItemAt(0).coerceToText(getApplicationContext()).toString();
          } else {
              return clip.getItemAt(0).coerceToHtmlText(getApplicationContext());
          }
      }
      return "";
  } catch (NullPointerException e) {
      return "";
  }
}

그러나, 안드로이드 10 디바이스에서는 위의 코드가 정상적으로 작동하지 않습니다.

 

위의 코드에서 clipboard에 아무 값도 들어있지 않습니다.

 

그래서 찾아보니, 안드로이드10에서는 다음과 같은 정책변경이 있습니다.

클립보드 데이터 액세스 제한

앱이 입력 방식 편집기(IME)이거나 현재 포커스가 있는 앱이 아닌 경우에는 앱에서 Android 10 이상의 클립보드 데이터에 액세스할 수 없습니다.

 

https://developer.android.com/about/versions/10/privacy/changes

Android 10의 개인정보 보호 변경사항  |  Android 개발자  |  Android Developers

Android 10(API 레벨 29)에는 사용자의 개인정보 보호 강화를 위해 많은 기능과 동작 변경사항이 도입되었습니다. 따라서 사용자가 앱에 제공하는 데이터와 기능을 더욱 투명하고 세밀하게 제어할 ��

developer.android.com

Android10에서는 입력방식편집기나 현재 앱의 포커스가 있을때만 작동한다고하네요.

 

아래의 블로그를 찾아보니, 내 앱의 View에서 onWindowFocusChanged 콜백이 작동할때만 Clipboard의 데이터를 읽을 수 있다고 합니다.

 

medium.com/@fergaral/working-with-clipboard-data-on-android-10-f641bc4b6a31

Working with clipboard data on Android 10

As part of a focus on privacy, Android 10 brought restrictions on apps accessing the clipboard. Now, only the app that currently has focus…

medium.com

Clipboard 데이터를 사용하는 뷰 (액티비티)에서 onWindowFocusChanged를 구현해줬고, onWindowFocusChanged에서 클립보드를 읽어오는 메서드를 호출했더니 정상작동합니다. 또한 클립보드 읽어오는 메서드도 변경하였더니 정상작동합니다.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);

  if (hasFocus) {
      Log.d(TAG, "clipboard: " + getClipboardText());
      // Application codes...
  }
}

 

확인한 내용

  1. 안드로이드 10 디바이스에서 ClipboardManager 사용시 내 앱의 뷰의 onWindowFocusChanged(boolean hasFocus)에서 사용가능. (hasFocus가 true일때 사용가능)

  2. EditText와 같은 입력방식편집기(IME)가 Focus되어야 사용가능 

 

 

참고URL

 

반응형