服务 - Android 剪贴板监听器

19

我需要一个简单的服务(在后台运行),当用户从浏览器或短信等复制任何内容时,会显示一个toast提示该文本。

例如: enter image description here

此服务必须在Android 2.1及更高版本上运行。

今天(从上午10:35到现在[晚上11:11]),我一直在搜索互联网并测试几个代码,但迄今为止还没有得出结论。

对于这样的问题,一些用户建议使用(my-clips)项目。我找到了该项目,但这个项目很复杂,让我感到困惑。

可以有人给我展示一个非常简单的例子吗? 谢谢


编辑:

这是在后台运行的简单应用程序,适用于Andoird操作系统。 当用户未打开此应用程序并从浏览器或短信等中复制任何文本时,此应用程序将处于活动状态,并显示如下的toast您复制了这个:...

3个回答

26

我所做的方法是:

final ClipboardManager clipboard = (ClipboardManager) this.getSystemService(CLIPBOARD_SERVICE);
clipboard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
    public void onPrimaryClipChanged() {
        String a = clipboard.getText().toString();
        Toast.makeText(getBaseContext(), "Copy:\n" + a, Toast.LENGTH_LONG).show();
    }
});

不使用服务、不添加到清单或任何其他方式,只需先打开您的应用程序,然后将其关闭,并从任何地方复制文本即可在应用程序中显示


我该如何删除addPrimaryClipChangedListener() @carlos-carrizales - Sp4Rx
1
@Sp4Rx 你可以使用 clipboard.removePrimaryClipChangedListener(listener), 参见 https://developer.android.com/reference/android/content/ClipboardManager.html#removePrimaryClipChangedListener(android.content.ClipboardManager.OnPrimaryClipChangedListener) - lucidbrot
2
此解决方案不符合以下要求:“这是一个简单的后台运行的安卓应用程序。当用户没有打开此应用程序并从浏览器或短信等复制任何文本时,此应用程序将处于活动状态并显示如下的提示:您已复制:…” - Aydinozkan
只有当我的应用程序在前台时,这对我才有效。一旦我切换到另一个应用程序,监视就不再起作用,直到我将我的应用程序带回前台。 - jho

6

1
请解释一下。 - Muhammad Muazzam

-5

这是对我有效的方法。

首先,广播:

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        ComponentName service = context.startService(
                new Intent(context, ClipboardMonitor.class));
        if (service == null) {
            Log.e("TAG", "Can't start service");
        }
    } else {
        Log.e("TAG", "Recieved unexpected intent " + intent.toString());
    }
}

然后这就是服务

private MonitorTask mTask = new MonitorTask();
private ClipboardManager mCM;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    mCM = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    mTask.start();
}


@Override
public void onDestroy() {
    mTask.cancel();
}

@Override
public void onStart(Intent intent, int startId) {
}

/**
 * Monitor task: monitor new text clips in global system clipboard and
 * new image clips in browser download directory
 */
private class MonitorTask extends Thread {

    private volatile boolean mKeepRunning = false;
    private String mOldClip = null;


    public MonitorTask() {
        super("ClipboardMonitor");
    }

    /** Cancel task */
    public void cancel() {
        mKeepRunning = false;
        interrupt();
    }

    @Override
    public void run() {
        mKeepRunning = true;

        while (true) {
            doTask();

            if (!mKeepRunning) {
                break;
            }
        }

    }

    private void doTask() {
        if (mCM.hasText()) {
            String newClip = mCM.getText().toString();
            if (!newClip.equals(mOldClip)) {

                mOldClip = newClip;
               // Toast.makeText(getApplicationContext(), "" +  newClip.toString(), Toast.LENGTH_SHORT).show();
                Log.i("TAG", "new text clip inserted: " + newClip.toString());
            }
        }
    }

另外,权限:

<uses-permission android:name="android.permission.GET_CLIPS" />
<uses-permission android:name="android.permission.READ_CLIPS" />
<uses-permission android:name="android.permission.WRITE_CLIPS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service android:name=".ClipboardMonitor" />
<receiver android:name=".ClipboardMonitorStarter">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

6
那些“X_CLIPS”权限是无意义的,在安卓系统中并不存在。 - Matthew Read
1
我在这里支持@MatthewRead。正如您所描述的那样,“对我有效”:您是否检查过在不授予这些权限的情况下它是否仍然有效? - Izzy
@MatthewRead,这就是我在想的。 - DiLDoST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接