我正在制作一个应用程序,最终我想在用户使用正则表达式打开我的应用程序以进行操作时检查剪贴板的内容。我目前正在尝试通过在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
谢谢
我发现的解决方案是运行onWindowFocusChanged()
自Android 10起的访问剪贴板的代码,如@laalto所指出的,应用程序需要具有输入焦点才能访问剪贴板。
尽管这造成了另一个问题,因为我需要代码仅在应用程序启动时运行,而不是每次活动都具有焦点(活动更改,暂停应用程序并返回等)时运行。
我的解决方法是在类中创建一个静态布尔变量,然后将该变量onCreate()
设为true,并设置if条件,onWindowFocusChanged()
以仅在该变量为true时运行与剪贴板交互的代码。一旦访问完上的剪贴板onWindowFocusChanged()
,便将该变量设置为false。
这样,代码仅在应用程序启动时运行,而不是每次MainActivity都具有焦点时运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句