Android 开发:如何在 Android 11 上监听 APP 之外的剪贴板变化?
Android development: How to listen to clipboard changes outside of an APP on Android 11?
我有一个主要为 Android 9 开发的个人应用程序,它监听剪贴板更改并在我复制 URL 的任何地方提示 window。实现如下:
ClipboardManager.OnPrimaryClipChangedListener listener = () -> {
Log.d("APP", "Detected clipboard change.");
if (manager.hasPrimaryClip() && manager.getPrimaryClip().getItemCount() > 0) {
CharSequence addedText = manager.getPrimaryClip().getItemAt(0).getText();
if (addedText != null) {
Log.d("APP", "copied text: " + addedText);
if ( addedText.toString().startsWith("http") ) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
AlertDialog newDialog = new AlertDialog.Builder(MainActivity.this)
.setMessage("Detected link, deal with it?")
.setPositiveButton("OK", (dialog, which) -> {
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_TEXT, addedText);
it.setClass(MainActivity.this, MainActivity.class);
startActivity(it);
finish();
})
.setNegativeButton("No", null)
.setCancelable(true)
.create();
newDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
newDialog.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
newDialog.show();
}
}
}
};
manager.addPrimaryClipChangedListener(listener);
这个功能在Android 9 下很好用,每当我在其他应用程序中复制一个URL。但是在Android11环境下同样的策略只响应APP内部的复制URL。在 Bing 上搜索后,我似乎没有发现有关剪贴板的任何 API 更改,但我知道 Android 11 增强了安全性和隐私性,例如,不允许获取我的 IMEI 号码手机。这是否说明我的应用程序在 Android 11 上无法检测应用程序外部的剪贴板更改。解决方法是什么?这是一个仅供个人使用并由我控制的APP。我对失去这些小小的便利感到越来越沮丧。
Does that account for failure of my APP on Android 11 to detect clipboard changes outside the APP
The change came in Android 10:“除非您的应用是默认输入法编辑器 (IME) 或者是当前具有焦点的应用,否则您的应用无法在 Android 10 或更高版本上访问剪贴板数据。”
What's the workaround?
也许可以实现您自己的 IME。
我有一个主要为 Android 9 开发的个人应用程序,它监听剪贴板更改并在我复制 URL 的任何地方提示 window。实现如下:
ClipboardManager.OnPrimaryClipChangedListener listener = () -> {
Log.d("APP", "Detected clipboard change.");
if (manager.hasPrimaryClip() && manager.getPrimaryClip().getItemCount() > 0) {
CharSequence addedText = manager.getPrimaryClip().getItemAt(0).getText();
if (addedText != null) {
Log.d("APP", "copied text: " + addedText);
if ( addedText.toString().startsWith("http") ) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
AlertDialog newDialog = new AlertDialog.Builder(MainActivity.this)
.setMessage("Detected link, deal with it?")
.setPositiveButton("OK", (dialog, which) -> {
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_TEXT, addedText);
it.setClass(MainActivity.this, MainActivity.class);
startActivity(it);
finish();
})
.setNegativeButton("No", null)
.setCancelable(true)
.create();
newDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
newDialog.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
newDialog.show();
}
}
}
};
manager.addPrimaryClipChangedListener(listener);
这个功能在Android 9 下很好用,每当我在其他应用程序中复制一个URL。但是在Android11环境下同样的策略只响应APP内部的复制URL。在 Bing 上搜索后,我似乎没有发现有关剪贴板的任何 API 更改,但我知道 Android 11 增强了安全性和隐私性,例如,不允许获取我的 IMEI 号码手机。这是否说明我的应用程序在 Android 11 上无法检测应用程序外部的剪贴板更改。解决方法是什么?这是一个仅供个人使用并由我控制的APP。我对失去这些小小的便利感到越来越沮丧。
Does that account for failure of my APP on Android 11 to detect clipboard changes outside the APP
The change came in Android 10:“除非您的应用是默认输入法编辑器 (IME) 或者是当前具有焦点的应用,否则您的应用无法在 Android 10 或更高版本上访问剪贴板数据。”
What's the workaround?
也许可以实现您自己的 IME。