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



我正在制作一个应用程序,最终我想检查剪贴板的内容,当用户打开我的应用程序与一个正则表达式,以提供一个行动。我目前正试图确保我通过在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();

并在第三行崩溃,出现以下错误:

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()返回null。

onCreate()对于你的活动来说太早了,不能有输入焦点。您可以重写onWindowFocusChanged(),以便在有焦点时尝试读取剪贴板。

我发现的解决方案是运行访问onWindowFocusChanged()中的剪贴板的代码,因为自Android 10以来,应用程序需要有输入焦点才能访问剪贴板,如@laalto所指出的。

虽然这产生了另一个问题,因为我需要代码只运行在应用程序启动,而不是每次活动都有焦点(活动的变化,暂停应用程序和返回等)。

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

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

最新更新