4

我一直在经历一些奇怪的行为。我的应用程序随机无法检测/拾取剪贴板内容(其他应用程序确实检测并正确粘贴)。我正在遵循这些准则

我的代码看起来像这样。

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和使用 atargetSdk = 28ClipboardProvider使用Dagger. 它正在被注入一个applicationContext.

特别是,我看到的是使用因为 insidewatchPrimaryClip()发出事件,返回。nullpaste()clipboard.hasPrimaryClip()false

有人遇到类似的事情吗?找不到类似的东西。有任何想法吗?

4

0 回答 0