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
?
你在这里问了两个不同的问题。 服务呼叫不相关的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
意图动作。