android - 从 API 级别 11 开始,通过 adb shell 设置剪贴板文本

标签 android api adb clipboard

在 API 级别 11 之前,可以使用 adb shell 上的 service 程序设置剪贴板的内容:

service call SERVICE CODE [i32 INT | s16 STR] ...
Options:
    i32: Write the integer INT into the send parcel.
    s16: Write the UTF-16 string STR into the send parcel.

有三个整数代码来定义方法:

1 TRANSACTION_getClipboardText
2 TRANSACTION_setClipboardText
3 TRANSACTION_hasClipboardText

例如这个命令

$ adb shell service call clipboard 2 i32 1 i32 1 s16 "Hello Android!"

将剪贴板的内容设置为 "Hello Android!"。从 API 级别 11 开始,列出的方法为 deprecated和新的采取ClipData作为论据。现在如何通过adb shell设置剪贴板内容?

最佳答案

您在这里提出了两个不同的问题。服务调用与 API 函数无关。

Android 通常过于激进地将 API 标记为已弃用。在这种情况下,它只意味着有更多功能的新功能。 getText()hasText()setText() 的功能仍然存在,这些功能将继续工作,但现在实现为新功能的简单包装器。

就服务调用而言,这些是内部实现细节,正如您所注意到的,不能保证在所有 Android 版本中都能正常工作。如果您凝视 Android source code ,您会发现这些事务当前已定义:

TRANSACTION_setPrimaryClip = 1
TRANSACTION_getPrimaryClip = 2
TRANSACTION_getPrimaryClipDescription = 3
TRANSACTION_hasPrimaryClip = 4
TRANSACTION_addPrimaryClipChangedListener = 5
TRANSACTION_removePrimaryClipChangedListener = 6
TRANSACTION_hasClipboardText = 7

源代码还指出了这些交易需要哪些参数。不幸的是,TRANSACTION_setPrimaryClip 需要一个 ClipData,它不是 i32 或 s16,因此与 service call 不兼容。然而,我们还有比这更大的问题;这些事务需要调用包名称作为参数,并且剪贴板服务验证指定的包名称是否与调用 uid 匹配。使用 adb shell 时,调用的 uid 是 UID_ROOT 或 UID_SHELL,两者都不拥有任何包,因此无法通过该检查。简单来说就是不能这样使用新的剪贴板服务。

你能做些什么呢?您可以创建自己的服务来从命令行操作剪贴板并将其安装到您的设备上。我不知道是否有任何方法可以扩展 service call,但您可以使用 am startservice 作为合适的替代品。如果您已经创建并安装了该自定义剪贴板服务,那么您可以调用它:

am startservice -a MySetClipboard -e text "clipboard text"

实现此服务的代码如下所示:

public MyService extends Service {
    public int onStartCommand(Intent intent, int flags, int startId) {
        String text = intent.getStringExtra("text");
        ClipboardManager.setText(text);
        stopSelf();
        return START_NOT_STICKY;
    }
}

服务应该有一个 Intent 过滤器,声明它能够处理 MySetClipboard Intent 操作。

关于android - 从 API 级别 11 开始,通过 adb shell 设置剪贴板文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243427/

相关文章:

android - 为什么 Android 的 "not the following character"正则表达式是 [!x] 而不是 [^x]?

android - MXQ-4K安卓盒子如何连接Linux上的Android Studio

java - 从抽屉导航启动 fragment 会导致应用程序崩溃

ruby-on-rails-3 - 如何在葡萄 api 应用程序中拆分东西?

Java - Android - ZIP 文件不断带回 println 需要消息错误

java - REST API Azure 事件中心 ExpiredToken

android - 在 API 小于 19 (Android) 中暂停/恢复动画?

Android:如何使用 ADB shell 启动应用程序

android - 使用 Gradle 同步 Android Studio 中的 Lint Config

具有不同 float 标签和占位符的Android EditText