Android では、Chrome、Gmail、および Inbox からテキストをコピーすると、onPrimaryClipChangedlistener メソッドが 3 回呼び出されますが、WhatsApp や Keep などの別のアプリでテキストをコピーすると、予想どおり、このメソッドは 1 回だけ呼び出されます。
例: Chrome でテキストをコピーすると、次の出力が得られます。
結果:ヌル
結果:テキスト
結果:テキスト
奇妙なことは、リンクまたはページの URL からテキストをコピーするときに、メソッドが 1 回だけ呼び出されることです。したがって、これは、Web サイトの「本文」からテキストをコピーした場合にのみ発生します。
これを解決するエレガントで「公式」な方法はありますか? ここのstackoverflowでこのトピックに関するいくつかの回答を読みましたが、何も私の問題を解決していないようです。
私が言ったように、この問題は特定のアプリにのみ影響を与えるように見えるので、これは他のアプリの問題であることを意味しますか?
ここに私のコード
ClipboardManager mClipboard;
static boolean bHasClipChangedListener = false;
ClipboardManager.OnPrimaryClipChangedListener mPrimaryChangeListener = new ClipboardManager.OnPrimaryClipChangedListener() {
public void onPrimaryClipChanged() {
updateClipData();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
registerPrimaryClipChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterPrimaryClipChanged();
}
void updateClipData() {
ClipData clip = mClipboard.getPrimaryClip();
ClipData.Item item = clip.getItemAt(0);
Log.d(LogUtils.BASIC_LOG, "result: " + item.getText());
}
private void registerPrimaryClipChanged(){
if(!bHasClipChangedListener){
mClipboard.addPrimaryClipChangedListener(mPrimaryChangeListener);
bHasClipChangedListener = true;
}
}
private void unregisterPrimaryClipChanged(){
if(bHasClipChangedListener){
mClipboard.removePrimaryClipChangedListener(mPrimaryChangeListener);
bHasClipChangedListener = false;
}
}