23

我正在构建一个应用程序,它将启动一个能够监听剪贴板更改的服务。

我真正想要的是永久记录(并将其写入存储中)剪贴板中的每一个更改,因此当我启动我的应用程序时,我可以读取该服务写入的存储文件。这意味着,我的应用程序和服务之间不需要直接通信,也不需要使用唤醒锁来保持设备运行(因为剪贴板在设备处于睡眠状态时几乎不会改变)。

我正在使用处理程序来反复检查剪贴板,我想知道如何实现 clipboardListener 来检查这些更改。

4

1 回答 1

53

FOUND IT!

I have done this, it works flawlessly afaik, and the process in memory only consumes 3mb. I'm posting this in case someone might need something similar.

If there are any errors, please point them out :D

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;

import android.app.Service;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.ClipboardManager;
import android.content.ClipboardManager.OnPrimaryClipChangedListener;
import android.content.Intent;
import android.os.IBinder;

public class CBWatcherService extends Service {

    private final String tag = "[[ClipboardWatcherService]] ";  
    private OnPrimaryClipChangedListener listener = new OnPrimaryClipChangedListener() {
        public void onPrimaryClipChanged() {
            performClipboardCheck();
        }
    };

    @Override 
    public void onCreate() {
        ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).addPrimaryClipChangedListener(listener);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        File folder = new File(ClipboardCacheFolderPath);
        // ClipboardCacheFolderPath is a predefined constant with the path
        // where the clipboard contents will be written

        if (!folder.exists()) { folder.mkdir(); }
        return START_STICKY;
    }

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

    private void performClipboardCheck() {
        ClipboardManager cb = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        if (cb.hasPrimaryClip()) {
            ClipData cd = cb.getPrimaryClip();
            if (cd.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                try {
                    File folder = new File(ClipboardCacheFolderPath);
                    if (!folder.exists()) { folder.mkdir(); }
                    Calendar cal = Calendar.getInstance();
                    String newCachedClip = 
                        cal.get(Calendar.YEAR) + "-" +
                        cal.get(Calendar.MONTH) + "-" +
                        cal.get(Calendar.DAY_OF_MONTH) + "-" +
                        cal.get(Calendar.HOUR_OF_DAY) + "-" +
                        cal.get(Calendar.MINUTE) + "-" +
                        cal.get(Calendar.SECOND);

                    // The name of the file acts as the timestamp (ingenious, uh?)
                    File file = new File(ClipboardCacheFolderPath + newCachedClip);
                    file.createNewFile();
                    BufferedWriter bWriter = new BufferedWriter(new FileWriter(file));
                    bWriter.write((cd.getItemAt(0).getText()).toString());
                    bWriter.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }  
            }
        }
    }
}
于 2014-03-09T19:45:41.040 回答