我一直在经历一些奇怪的行为。我的应用程序随机无法检测/拾取剪贴板内容(其他应用程序确实检测并正确粘贴)。我正在遵循这些准则。
我的代码看起来像这样。
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 = 28
并ClipboardProvider
使用Dagger
. 它正在被注入一个applicationContext
.
特别是,我看到的是使用因为 insidewatchPrimaryClip()
发出事件,返回。null
paste()
clipboard.hasPrimaryClip()
false
有人遇到类似的事情吗?找不到类似的东西。有任何想法吗?