Можно ли получить менеджер буфера обмена через фильтр намерений и широковещательный прием?

Можно ли получить скопированный текст через интент-фильтры и широковещательный приемник? Я хочу разработать приложение для словаря, и когда пользователь копирует текст в любое место на своем телефоне, я хочу показать значение текста. В настоящее время я пытался использовать базовую активность для регистрации слушателя, но он не отвечает моим потребностям.

 mClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

        listener = new ClipboardManager.OnPrimaryClipChangedListener() {
            public void onPrimaryClipChanged() {
                performClipboardCheck();
            }
        };
        mClipboard.addPrimaryClipChangedListener(listener);

Благодарю.

3 ответа

Вы можете написать service проверить буфер обмена и прикрепить приемник к ClipboardManager там. поэтому класс обслуживания должен быть таким:

class ClipBoardService : Service(), ClipboardManager.OnPrimaryClipChangedListener {
override fun onPrimaryClipChanged() {
    val manager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    if (manager.primaryClip.itemCount > 0) {
        val clip = manager.primaryClip.getItemAt(0).text.toString()
        toast(clip)
    }
}


override fun onBind(intent: Intent): IBinder {
    return Binder()
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    initReceiver()
    return START_STICKY
}

private fun initReceiver() {
    val manager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    manager.removePrimaryClipChangedListener(this)
    manager.addPrimaryClipChangedListener(this)
}
}

и вы можете создать широковещательный приемник с вашим собственным действием и зарегистрировать его в своей деятельности onStart и отмените регистрацию на активности onStop а затем в вашем сервисе с помощью sendBroadcast метод отправить намерение в вашу деятельность

не забудьте объявить службу в вашем файле манифеста

<service
        android:name=".clipboard.ClipBoardService"
        android:enabled="true"
        android:exported="true" />

надеюсь, это было полезно.

Вот как я это сделал, просто сначала откройте свое приложение, а затем закройте его, но вы также можете написать сервис, если хотите продолжить работу

для Java

final ClipboardManager clipboard = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.addPrimaryClipChangedListener( new ClipboardManager.OnPrimaryClipChangedListener() {
                public void onPrimaryClipChanged() {
                    String a = clipboard.getText().toString();
                    Toast.makeText(getBaseContext(),"Copy:\n"+a,Toast.LENGTH_LONG).show();
                }
            }); 

для котлина

  clipboard= this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
        clipboard.addPrimaryClipChangedListener (object : ClipboardManager.OnPrimaryClipChangedListener{
            override fun onPrimaryClipChanged() {
              Log.d(TAG,"Copy:\n= "+clipboard.primaryClip.toString())
            }

        })

Можно ли получить скопированный текст через интент-фильтры и широковещательный приемник?

Нет.

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