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).
- Ejecutar un servicio con privilegios de root o agregar permisos con root
- Mostrar ProgressDialog en una clase de servicio
- OnStart () y onStartCommand () siguen llamados en 2.0 y superiores
- ¿Cómo manejar IPC entre un servicio y una actividad (y su subactividad)?
- Implementación de un grupo de subprocesos dentro de un servicio
Estoy utilizando un controlador para revisar periódicamente el portapapeles, quiero saber cómo puedo implementar el clipboardListener para comprobar los cambios.
- Cómo ejecutar CountDownTimer en un servicio en Android?
- Cómo detener un servicio
- Android: ¿Cómo forzar onStartCommand () que se llama antes de onBind ()?
- ¿Qué es un JobService en Android?
- ¿Cómo registrar un servicio de reconocimiento de voz personalizado?
- ¿Cómo iniciar el servicio con Alarm Manager en Android?
- ¿Cómo ejecutar una aplicación Android en segundo plano?
- Notificación de primer plano en Android inicia nueva Actividad (vía pendingIntent) en lugar de una existente
¡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(); } } } } }
- Android: Pasar variables a un servicio ya en ejecución
- Extraer la guiñada, el tono y el rollo desde una matriz de rotación