如何在打开应用程序时读取 Android 剪贴板(文本)?

How to read Android Clipboard (text) when opening an app?

我正在制作一个应用程序,最终我想在用户使用正则表达式打开我的应用程序以提供操作时检查剪贴板的内容。我目前正在尝试通过在 Toast 中显示数据来确保正确获取数据。

我在 MainActivity 的 OnCreate 函数上使用 ClipboardManager,如官方文档和许多其他地方所述,尽管我在尝试访问剪贴板数据时遇到空指针错误。

但是,如果我在尝试获取该数据之前设置了 1-2 秒的延迟(我使用 handler.postDelayed 作为延迟操作),我可以正确读取剪贴板的内容,这很奇怪.. .

为什么会发生这种情况以及如何在打开应用程序时立即访问剪贴板的数据?

我使用的代码是:

ClipboardManager clipboardManager = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);;
ClipData clipData = clipboardManager.getPrimaryClip();
ClipData.Item item = clipData.getItemAt(0);
String clipText = item.getText().toString();
Toast.makeText(getApplicationContext(), clipText, Toast.LENGTH_SHORT).show();

它在第 3 行崩溃并出现以下错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ClipData$Item android.content.ClipData.getItemAt(int)' on a null object reference

谢谢

从 Android 10 及更高版本开始,您的应用需要有输入焦点才能成功读取剪贴板。否则 getPrimaryClip() returns null.

onCreate() 对您的 activity 来说太早了,无法输入焦点。您可以覆盖 onWindowFocusChanged() 以尝试在有焦点时立即读取剪贴板。

我找到的解决方案是 运行在 onWindowFocusChanged() 中设置访问剪贴板的代码,因为自 Android 10 起,应用程序需要输入焦点才能访问剪贴板,正如@laalto 指出的那样。

虽然这造成了另一个问题,因为我只需要在应用程序启动时 运行 的代码,而不是每次 activity 获得焦点时(活动更改、暂停应用程序并返回等)。

我的方法是在 class 中创建一个静态布尔变量,然后在 onCreate() 中使该变量为真,并将 onWindowFocusChanged() 上的 if 条件设置为 运行 仅当该变量为真时才与剪贴板交互的代码。 在 onWindowFocusChanged() 上完成对剪贴板的访问后,我将该变量设置为 false。

通过这样做,代码 运行 仅在应用程序启动时而不是每次 MainActivity 获得焦点时。