Toda la respuesta se basa en el hecho de que cuando se hace esta consulta:
https://play.google.com/store/apps/details?id=PKG_NAME # PKG_NAME is the package name of an app
entre otras cosas, el código HTTP en las cabeceras devueltas en la mayoría de los casos sería o bien:
- 404 (recurso no encontrado) - aplicación no disponible
- 200 (éxito) - aplicación disponible
- 403 (prohibido): la aplicación no está disponible en su región o no está autorizado a acceder al recurso.
He utilizado dicha información en las dos soluciones propuestas aquí.
Automatización
He encontrado Tasker ( guía del usuario ) aptos y flexibles para el trabajo. Los detalles sobre el perfil se darán más adelante. Por el momento, siga estas instrucciones para el núcleo.
Cree una tarea llamada App Status y cree las siguientes acciones en ella:
-
Código→ Ejecutar Shell
- Comando:
pm list packages -3 -i | grep -e "com.android.vending" -e "com.google.android.feedback"
- Almacenar Salida In:
%Pkgs
- seleccione Continuar tarea tras error
Esto almacenará la lista de todos los nombres de paquetes de aplicaciones instaladas desde Play Store, en la variable Pkgs. Eliminar
-i | grep -e "com.android.vending" -e "com.google.android.feedback"
desde Comando si no quieres restringir la tarea a las aplicaciones instaladas sólo desde Play Store.
-
Variables → Conjunto de variables
- Nombre:
%ret
- Para: pulse una vez la tecla Intro del teclado
Aprendí este paso del post aquí por plepleus. Este paso es necesario porque tenemos la intención de copiar cada línea (tiene un nombre de paquete de una aplicación) de Pkgs en una variable separada. Es para facilitar su uso.
-
Variables → Partición de variables
- Nombre:
%Pkgs
- Splitter:
%ret
Este paso divide los Pkgs, hace un array de Pkgs y cada línea se asigna a un índice de ese array. Por lo tanto, el tamaño del array es el número de líneas que tenía Pkgs.
-
Variables → Conjunto de variables
- Nombre:
%Count
- Para:
%Pkgs(#)
Vamos a crear una variable llamada Count y asignarle la longitud del array Pkgs, con el propósito de hacer un bucle.
-
Variables → Conjunto de variables
- Nombre:
%Tmp
- Para:
%Pkgs(%Count)
Ahora que estamos en un bucle, almacenamos el valor asignado al índice de Pkgs en una nueva variable llamada Tmp. Este paso es necesario porque Tasker tiene una funcionalidad limitada cuando se trata de nombres de variables complejas.
-
Variables → Partición de variables
Este paso divide la línea en espacios en blanco y almacena los campos anteriores y posteriores en Tmp1 y Tmp2. Tmp1 contiene, entre otras cosas, el nombre del paquete.
-
Variables → Partición de variables
- Nombre:
%Tmp1
- Splitter:
:
Este paso extrae finalmente el nombre del paquete de Tmp1 y lo almacena en Tmp12. Tenga en cuenta que si Tmp no se hubiera declarado en la acción 5, nos habríamos visto obligados a dividir %Pkgs(%Count)1, que es un nombre de variable no válido para Tasker.
-
Net → HTTP Get
- Servidor:Puerto:
https://play.google.com/store/apps/details?id=%Tmp12
- Tipo Mime:
text/html
- seleccione Continuar tarea tras error
Este paso consulta el estado de la aplicación en Play Store y guarda el código HTTP devuelto automáticamente en HTTPR.
-
Aplicación → Aplicación de prueba
- Tipo: Nombre de la aplicación
- Datos:
%Tmp12
- Guardar resultado en:
%Label
- seleccione Continuar tarea tras error
Este paso busca la etiqueta de la aplicación a partir de su nombre de paquete y la almacena en Label.
-
Variables → Restar variables
Este paso decrementa la variable Count para que podamos pasar al siguiente ciclo del bucle.
-
Tarea → Goto
- Tipo: Número de acción
- Número:
5
- Si:
%Count
!=
0
Este paso implementa finalmente el bucle. Cuando se ejecuta esta acción se comprueba si Count es 0 o no. Hemos asumido que todas las líneas en Pkgs tenían nombre de paquete por lo que es razonable que el bucle se ejecute hasta que Count sea cero, en cuyo caso, simplemente sale.
Dejo que usted decida cómo desea que se le notifique. Sea cual sea su intención con el fin de notificarse a sí mismo el estado de una aplicación en Play Store, hacerlo sólo entre la acción 9 y 10. Por ejemplo, puede configurar la tarea Estado de la aplicación para que muestre una notificación cuando no se encuentre una aplicación en Play Store. Puede añadir la acción Alerta → Notificar:
- Título: Play Store: App no disponible
- Texto: %Etiqueta
- Prioridad: 5
- Si:
%HTTPR
eq
404
Puede utilizar AutoNotificaciones para evitar la funcionalidad limitada de Tasker de crear notificaciones.
Teniendo en cuenta que un reinicio provoca la pérdida de todas las notificaciones recibidas, puede escribir el resultado final de la tarea en un archivo. Utilice la acción Archivo → Escribir archivo y utilícela en modo append. Es sólo un consejo por el comentario de Izzy en la pregunta. No podré ofrecerte ninguna ayuda al respecto.
En cuanto al Perfil, elige el número de activadores que quieras. Recomiendo un disparador basado en el tiempo, pero también puedes optar por crear un acceso directo en la pantalla de inicio.
Eso es todo para la automatización aquí.
Línea de comandos
No podía ignorar la línea de comandos que hace que el objetivo sea tan fácil de conseguir en este caso concreto.
Dependencias
Mi pequeño guión
#!/system/bin/sh
# Check if the busybox binary exists under /data/local/tmp/ or /system/xbin.
# Set the detected binary's path into the variable busybox or exit if file
# doesn't exist or executable permission is not set
if \[\[ -x /data/local/tmp/busybox \]\]; then
busybox=/data/local/tmp/busybox;
elif \[\[ -x /system/xbin/busybox \]\]; then
busybox=/system/xbin/busybox;
else
date +'busybox binary not found or executable permission is not set. Exiting';
exit;
fi
# Check if the aapt binary exists under /data/local/tmp or /system/bin or /system/xbin.
# Set the detected binary's path into the variable aapt or exit if file
# doesn't exist or executable permission is not set
if \[\[ -x /data/local/tmp/aapt \]\]; then
aapt=/data/local/tmp/aapt;
elif \[\[ -x /system/bin/aapt \]\]; then
aapt=/system/bin/aapt;
elif \[\[ -x /system/xbin/aapt \]\]; then
aapt=/system/xbin/aapt;
else
date +'aapt binary not found or executable permission is not set. Exiting';
exit;
fi
# List packages which were installed from Play Store and store the package names under /sdcard/acc\_assoc\_packages.txt.
# Remove -i | grep -e "com.android.vending" -e "com.google.android.feedback" if you don't want to restrict the script to apps installed only from Play Store.
pm list packages -3 -i | grep -e "com.android.vending" -e "com.google.android.feedback" | $busybox sed 's/package://g'| $busybox awk '{print$1}' > /sdcard/acc\_assoc\_packages.txt
$busybox printf "List of installed apps not available in Play Store:\\n\\n" > /sdcard/rm\_packages.txt; # rm\_packages.txt would show the list of apps not available in Play Store
# For each package name in acc\_assoc\_packages.txt, find whether the package is available in Play Store.
# If not, the HTTP return code would be 404 in curl's output. Use it for any processing you want.
while read line; do
ID="https://play.google.com/store/apps/details?id=";
ret\_http\_code=$(curl -skI $ID$line | awk 'FNR==1{print $2}'); # -s is for silent mode, -k is use ignore certificates for SSL connection, -I is to show only header information
path=$(pm path $line | $busybox sed 's/^package://g'); # get location of APK of package. Required for finding app's label
label=$($aapt d badging $path 2>&1 | $busybox sed -ne '/application: label=/p' | $busybox cut -d "'" -f2); # Get app label using $path
# If returned HTTP code is 404, write into rm\_pacakges.txt the corresponding app label, package name and print to standard output.
# Else simply print to standard output.
case $ret\_http\_code in
404)
$busybox printf "Status: Not Available - $label ($line)\\n";
$busybox printf "$label ($line)\\n" >> /sdcard/rm\_packages.txt;
;;
403)
$busybox printf "Status: Not authorized to access resource - $label ($line)\\n";
;;
200)
$busybox printf "Status: Available - $label ($line)\\n";
;;
\*)
$busybox printf "An unknown error occurred. Are we online?\\n";
exit;
esac
done < /sdcard/acc\_assoc\_packages.txt
Guarde el script en /sdcard
en un archivo llamado app_status.sh
y ejecutar ese archivo desde una aplicación emuladora de terminal de esta manera:
sh /sdcard/app_status.sh
Salida de demostración:
(Haga clic en la imagen para ampliarla)
Atajo
Si usted ha busybox y aapt binario instalado y funcionando en el dispositivo, puede reducir drásticamente los pasos necesarios en la tarea App Status.
Guarde la siguiente secuencia de comandos en un archivo llamado app_status.sh
en /sdcard
.
#!/system/bin/sh
pm list packages -3 -i | grep -e "com.android.vending" -e "com.google.android.feedback" | $busybox sed 's/package://g'| $busybox awk '{print$1}' > /sdcard/acc\_assoc\_packages.txt
$busybox printf "List of installed apps not available in Play Store:\\n\\n" > /sdcard/rm\_packages.txt;
while read line; do
ID="https://play.google.com/store/apps/details?id=";
ret\_http\_code=$(curl -skI $ID$line | awk 'FNR==1{print $2}');
path=$(pm path $line | $busybox sed 's/^package://g');
label=$($aapt d badging $path 2>&1 | $busybox sed -ne '/application: label=/p' | $busybox cut -d "'" -f2);
case $ret\_http\_code in
404)
$busybox printf "Status: Not Available - $label ($line)\\n";
$busybox printf "$label ($line)\\n" >> /sdcard/rm\_packages.txt;
;;
403|200)
# Intentionally left blank
;;
\*)
$busybox printf "An unknown error occurred. We'll be victorious next time.\\n" >> /sdcard/rm\_packages.txt;
exit;
esac
done < /sdcard/acc\_assoc\_packages.txt
Ahora elimina cualquier acción que tengas en la tarea y configura las siguientes:
-
Código → Ejecutar Shell
- Comando:
sh /sdcard/app_status.sh
- Almacenar Salida In:
%Pkgs
- seleccione Continuar tarea tras error
Este paso escribirá en el archivo rm_packages.txt las entradas como las aplicaciones no disponibles en Play Store. Esta es la acción principal. Las siguientes acciones son opcionales y sólo con el propósito de notificar a ti mismo.
-
Tarea → Si: %Pkgs
Set
-
Alertar → Notificar
- Título: Comprobar el estado de las aplicaciones
- Icono: opcional
- Prioridad:
5
- Acciones: Acción → Aplicación → Iniciar aplicación → seleccione una aplicación de editor de texto como, por ejemplo QuickEdit → Datos:
file:///sdcard/rm_packages.txt
Ejemplo de notificación:
1 votos
¿Está dispuesto a ensuciarse un poco las manos? AFAIK, un usuario de Play Store oficialmente no puede llegar a saber por qué una aplicación ha sido eliminada de Play Store. Sólo el desarrollador de la aplicación estaría al tanto de esta información. La única forma de saber que una aplicación no existe es visitando su página. Si la aplicación no existe, el servidor devolverá el código HTTP 404. Podemos utilizar tasker para consultar la URL (que contiene el nombre del paquete de una aplicación instalada) y comparar el código HTTP devuelto. Si es 404, notifique al usuario de la forma que desee. Puede ejecutar esta consulta todos los días o después de cualquier número de horas/días.
1 votos
@Firelord que requeriría una tarea bastante compleja para configurar en Tasker (pero me da una buena idea para una nueva función en Adebar - ver github.com/IzzySoft/Adebar/issues/17 ;) Habría que recopilar los nombres de los paquetes de todas las apps instaladas por el usuario, consultar las páginas correspondientes de playstore y, cada vez que aparezca un 404, realizar "alguna acción" (notificación y algo más permanente en caso de reinicio del dispositivo, etc.). Sea bienvenido a la configuración de dicha respuesta :)