通过ADB shell设置剪贴板中的文本作为API级别11(Set clipboard text v

2019-07-18 01:04发布

API级别11之前,有可能通过设置将剪贴板中的内容service上的程序adb shell

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的上市方法是过时和新的需要ClipData作为参数。 如何通过现在设置剪贴板内容adb shell

Answer 1:

你在这里问了两个不同的问题。 服务呼叫不相关的API函数。

Android是一般过于激进大约为过时标记的API。 在这种情况下,它仅仅意味着有更多功能的新功能。 的功能getText() hasText()setText()仍然存在,这些功能将继续工作,但他们现在实现为各地新功能琐碎的包装。

至于服务电话去,这些都是内部的实现细节,因为你已经注意到了,不能保证在Android版本。 如果窥视了Android 的源代码 ,你会发现当前定义的这些交易:

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

源代码还指示什么参数,这些交易需要。 不幸的是,TRANSACTION_setPrimaryClip需要ClipData ,这是不是一个123-132或S16,因而是不兼容service call 。 我们比不过更大的问题; 这些交易需要调用包名作为参数,并剪贴板服务验证指定的包名调用UID匹配。 当使用亚行外壳,调用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;
    }
}

该服务应该有一个意图过滤器声明它能够处理MySetClipboard意图动作。



文章来源: Set clipboard text via adb shell as of API level 11