Escuchar permanentemente los cambios en el portapapeles

Estoy construyendo una aplicación que lanzará un servicio capaz de escuchar los cambios en el portapapeles.

Lo que realmente quiero es grabar (y escribirlo en el almacenamiento) cada cambio en el portapapeles permanentemente, por lo que cuando lanzo mi aplicación puedo leer los archivos almacenados por escrito por ese servicio. Esto significa que no hay necesidad de comunicación directa entre mi aplicación y el servicio y no hay necesidad de usar wakelocks para mantener el dispositivo en alto (ya que el portapapeles apenas cambia mientras el dispositivo está dormido).

Estoy utilizando un controlador para revisar periódicamente el portapapeles, quiero saber cómo puedo implementar el clipboardListener para comprobar los cambios.

¡LO ENCONTRÉ!

He hecho esto, funciona impecablemente afaik, y el proceso en memoria sólo consume 3mb. Estoy publicando esto en caso de que alguien pueda necesitar algo similar.

Si hay algún error, por favor señale: 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(); } } } } } 
  • Relación de actividad y servicio de Android: después de Pausa, después de Parar
  • Notificación de IntentService - NullPointerException mientras obtiene Context
  • Diferencias entre intención y pendiente
  • El servicio de Android comienza de forma automática / automática
  • ¿Cómo puedo detener el servicio de otra aplicación en Android?
  • ¿Puede alguien explicar cuál es la diferencia entre el servicio no enlazado y enlazado en android
  • StopService () detendrá un servicio de primer plano?
  • Android: Detener / iniciar servicio creado en onCreate ()
  • ¿Es posible ejecutar el servicio en la plataforma android de forma continua incluso después de bloquear el dispositivo?
  • Android ResultReceiver a través de paquetes
  • Enviar datos de la actividad al servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.