Kon*_*che 17 api clipboard android adb
在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.
Run Code Online (Sandbox Code Playgroud)
有三个整数代码来定义方法:
1 TRANSACTION_getClipboardText
2 TRANSACTION_setClipboardText
3 TRANSACTION_hasClipboardText
Run Code Online (Sandbox Code Playgroud)
例如这个命令
$ adb shell service call clipboard 2 i32 1 i32 1 s16 "Hello Android!"
Run Code Online (Sandbox Code Playgroud)
将剪贴板的内容设置为"Hello Android!".从API级别11开始,不推荐使用列出的方法,新的方法将ClipData作为参数.你如何通过现在设置剪贴板内容adb shell?
j__*_*__m 10
你在这里问了两个不同的问题.服务调用与API函数无关.
对于将API标记为已弃用,Android通常过于激进.在这种情况下,它只意味着有更多功能的新功能.的功能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
Run Code Online (Sandbox Code Playgroud)
源代码还指出了这些事务所需的参数.不幸的是,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"
Run Code Online (Sandbox Code Playgroud)
实现此服务的代码可能如下所示:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
该服务应该有一个intent-filter,声明它能够处理MySetClipboardintent操作.
| 归档时间: |
|
| 查看次数: |
6072 次 |
| 最近记录: |