You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scrcpy剪贴板同步原理及Bash脚本实现方案咨询

实现Bash脚本同步剪贴板到Android设备(支持Unicode,兼容Android 9+)

scrcpy剪贴板同步的核心原理

scrcpy之所以能完美同步含Unicode的剪贴板,是因为它没有用adb shell input text这种模拟键盘输入的方式,而是直接对接Android系统的剪贴板服务:

  • 读取电脑剪贴板的原始文本(包括任意Unicode字符)
  • 通过adb的内部通信机制,调用Android的ClipboardManager系统服务,直接将文本写入设备剪贴板
  • 最后模拟系统粘贴事件触发粘贴动作,全程绕过了键盘输入的字符编码限制

Bash脚本实现方案

前置依赖

  • 已配置好adb与设备的USB调试连接
  • 电脑端安装剪贴板读取工具:Linux用xclip,macOS用pbpaste,Windows用powershell
  • 设备未限制adb对系统服务的调用(默认USB调试开启状态下满足)

完整脚本

#!/bin/bash

# 读取电脑剪贴板(根据系统替换命令)
# Linux: xclip -selection clipboard -o
# macOS: pbpaste
# Windows: powershell -Command "Get-Clipboard"
CLIPBOARD_CONTENT=$(xclip -selection clipboard -o)

if [ -z "$CLIPBOARD_CONTENT" ]; then
    echo "剪贴板为空,无需同步"
    exit 0
fi

# 尝试通过广播写入剪贴板(部分设备可用)
adb shell "am broadcast -a clipper.set -e text '$CLIPBOARD_CONTENT'" 2>/dev/null

# 广播失败则用app_process调用系统剪贴板服务(兼容Android 9+,scrcpy同款逻辑)
if [ $? -ne 0 ]; then
    adb shell "echo '
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;

public class SetClipboard {
    public static void main(String[] args) {
        Context ctx = Context.createPackageContext(\"android\", Context.CONTEXT_IGNORE_SECURITY);
        ClipboardManager cm = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE);
        String text = String.join(\" \", args);
        if (!TextUtils.isEmpty(text)) {
            cm.setPrimaryClip(cm.newPlainText(null, text));
        }
    }
}
' | app_process /system/bin com.android.commands.am.Am start -n com.android.shell/.Shell --es args '$CLIPBOARD_CONTENT'"
fi

# 发送系统粘贴按键事件(KEYCODE_PASTE=279)
adb shell input keyevent 279

关键细节说明

  1. 剪贴板读取:根据操作系统替换对应的读取命令,确保能获取到含Unicode的原始文本
  2. 双写入策略:
    • 广播方式轻量但兼容性有限,适合部分无限制的设备
    • app_process调用Java代码是scrcpy底层使用的方法,直接对接系统ClipboardManager,完美支持所有Unicode字符,兼容Android 9及更高版本
  3. 模拟粘贴:使用Android标准的KEYCODE_PASTE事件,比模拟Ctrl+V更适配不同厂商的设备

替代方案(更简单,需安装scrcpy)

如果已经安装了scrcpy,直接用官方提供的命令即可,这是最可靠的方式:

#!/bin/bash
CLIPBOARD_CONTENT=$(xclip -selection clipboard -o)
scrcpy --push-clipboard "$CLIPBOARD_CONTENT"
adb shell input keyevent 279

内容的提问来源于stack exchange,提问作者Tycho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:56:05