import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.ClipboardManager;
import android.util.Log;

/*
 * Receives broadcast commands and controls clipboard accordingly.
 * The broadcast receiver is active only as long as the application, or its service is active.
 *
# 写入内容到剪切板
adb shell am broadcast -a clipper.set -f 0x01000000 --es "text" "set content"
adb shell am broadcast -a clipper.set -f 0x01000000 --es "text" "测试信息"

# 获取剪切板内容
adb shell am broadcast -a clipper.get

 */
public class ClipperReceiver extends BroadcastReceiver {
    private static String TAG = "调试信息";

    public static String ACTION_GET = "clipper.get";
    public static String ACTION_GET_SHORT = "get";
    public static String ACTION_SET = "clipper.set";
    public static String ACTION_SET_SHORT = "set";
    public static String EXTRA_TEXT = "text";
    private ICallBack iCallBack;

    public static boolean isActionGet(final String action) {
        return ACTION_GET.equals(action) || ACTION_GET_SHORT.equals(action);
    }

    public static boolean isActionSet(final String action) {
        return ACTION_SET.equals(action) || ACTION_SET_SHORT.equals(action);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ClipboardManager cb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
        Log.i("调试信息", "onReceive:  " + intent.getAction());
        if (isActionSet(intent.getAction())) {
            String text = intent.getStringExtra(EXTRA_TEXT);
            Log.d(TAG, "将文本设置为剪贴板 = " + text);
            if (text != null) {
                cb.setText(text);
                setResultCode(Activity.RESULT_OK);
                setResultData("文本被复制到剪贴板.");
                if (iCallBack != null) {
                    iCallBack.callBack(text);
                }
            } else {
                setResultCode(Activity.RESULT_CANCELED);
                setResultData("没有提供文本. 使用 -e text \"要粘贴的文本\"");
            }
        } else if (isActionGet(intent.getAction())) {
            Log.d(TAG, "从剪贴板获取文本");
            CharSequence clip = cb.getText();
            if (clip != null) {
                Log.d(TAG, String.format("剪贴板 text: %s", clip));
                setResultCode(Activity.RESULT_OK);
                setResultData(clip.toString());
            } else {
                setResultCode(Activity.RESULT_CANCELED);
                setResultData("");
            }
        }
    }

    /**
     * 发送广播
     */
    public void sendOrderedBroadcast(Context context, String content) {
        Intent intent = new Intent();
        intent.putExtra(ClipperReceiver.EXTRA_TEXT, content);
        intent.setAction(ClipperReceiver.ACTION_GET);
        intent.setAction(ClipperReceiver.ACTION_GET_SHORT);
        intent.setAction(ClipperReceiver.ACTION_SET);
        intent.setAction(ClipperReceiver.ACTION_SET_SHORT);
        context.sendOrderedBroadcast(intent, null);
    }

    /**
     * 注册广播
     */
    public void registerReceiver(Context context, ICallBack iCallBack) {
        this.iCallBack = iCallBack;
        IntentFilter filters = new IntentFilter();
        filters.addAction(ClipperReceiver.ACTION_GET);
        filters.addAction(ClipperReceiver.ACTION_GET_SHORT);
        filters.addAction(ClipperReceiver.ACTION_SET);
        filters.addAction(ClipperReceiver.ACTION_SET_SHORT);
        context.registerReceiver(this, filters);
    }

    /**
     * 剪切回调
     */
    public interface ICallBack {
        void callBack(String content);
    }
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐