ClipboardManager иногда не берет содержимое буфера обмена

У меня было странное поведение. Мое приложение случайным образом не может обнаружить / забрать содержимое буфера обмена (другие приложения обнаруживают и вставляют его правильно). Я следую этим правилам.

Мой код выглядит так.

public class ClipboardProvider {

    private final ClipboardManager clipboard;

    @Inject
    public ClipboardProvider(Context context) {
        clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    }

    /**
     * Copy some text to the clipboard.
     *
     * @param label User-visible label for the pasted data.
     * @param text The actual text to copy.
     */
    public void copy(String label, String text) {

        final ClipData clip = ClipData.newPlainText(label, text);

        clipboard.setPrimaryClip(clip);
    }

    /**
     * Grab some text from the clipboard.
     */
    public Optional<String> paste() {

        if (!clipboard.hasPrimaryClip()) {
            return Optional.empty();
        }

        final ClipData primaryClip = clipboard.getPrimaryClip();
        if (primaryClip.getItemCount() == 0) {
            return Optional.empty();
        }

        final ClipData.Item item = primaryClip.getItemAt(0);
        if (item == null) {
            return Optional.empty();
        }

        final CharSequence text = item.getText();
        if (text == null) {
            return Optional.empty();
        }

        return Optional.of(text.toString());
    }

    /**
     * Create an Observable that reports changes on the system clipboard (fires immediately upon
     * subscribe).
     */
    public Observable<String> watchPrimaryClip() {
        return Observable.using(
                ClipboardListener::new,

                clipboardListener -> Observable.create((Observable.OnSubscribe<String>)
                        (subscriber) -> {
                            clipboardListener.setSubscriber(subscriber);
                            clipboardListener.onPrimaryClipChanged();

                            clipboard.addPrimaryClipChangedListener(clipboardListener);
                        }
                ),

                clipboard::removePrimaryClipChangedListener

        ).distinctUntilChanged();
    }

    private class ClipboardListener implements ClipboardManager.OnPrimaryClipChangedListener {
        Subscriber<? super String> subscriber;

        public void setSubscriber(Subscriber<? super String> subscriber) {
            this.subscriber = subscriber;
        }

        @Override
        public void onPrimaryClipChanged() {
            if (subscriber != null && !subscriber.isUnsubscribed()) {
                subscriber.onNext(paste().orElse(""));
            }
        }
    }
}

Я использую android.content.ClipboardManager и используя targetSdk = 28 а также ClipboardProvider вводится с использованием Dagger. Это вводитсяapplicationContext.

В частности, я вижу, что watchPrimaryClip() излучает события с null потому что внутри paste(), clipboard.hasPrimaryClip() возвращается false.

Кто-нибудь испытывал нечто подобное? Не удалось найти ничего похожего на это. Есть идеи?

0 ответов

Другие вопросы по тегам