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

在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开始,列出的方法已被弃用 ,新的方法将ClipData作为参数。 你如何通过adb shell设置剪贴板内容?

Related of "从API级别11开始,通过adb shell设置剪贴板文本"

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

对于将API标记为已弃用,Android一般过于激进。 在这种情况下,这只意味着有更多function的新function。 getText()hasText()setText()function仍然存在,这些function将继续工作,但是现在它们被实现为新function的简单包装。

就服务调用而言,这些是内部实现细节,因为您已经注意到不能保证在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 ,它不是一个i32或s16,因此与service call不兼容。 然而,我们有比这个更大的问题。 这些事务需要调用包名称作为参数,剪贴板服务validation指定的包名称与调用的uid相匹配。 当使用adb shell时,调用的uid是UID_ROOT或者UID_SHELL,它们都不拥有任何包,所以没有办法通过这个检查。 简而言之,新的剪贴板服务不能以这种方式使用。

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

 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; } } 

该服务应该有一个意图filter,声明它能够处理MySetClipboard意图操作。