Acerca de la aplicación de monitoreo de cambios de recursos multimedia de Android (ContentResolver)

fondo

El monitoreo de medios es una función muy común. Por ejemplo, la galería que viene con un teléfono móvil actualizará automáticamente la galería cuando monitoree la generación de imágenes fotografiadas. Se utiliza para mostrar los datos más recientes a los usuarios de manera oportuna. Por ejemplo , en la página de chat, monitorea el álbum de fotos, si hay nuevas imágenes, habrá una pequeña ventana emergente que le preguntará al usuario si desea enviar las fotografías tomadas, etc.
! ! ! ¡El código está al final del artículo! ! ! !
Este artículo mostrará cómo monitorear las imágenes y videos generados.

ambiente

win10
como 4.0+
jdk 1.8

Ideas

De hecho, el código para implementar el monitoreo no es más que el mismo tipo de código que va y viene, uno es la comparación de consultas y el otro es llamar a los métodos del sistema. Este artículo utilizará ContentResolver para el monitoreo.

lograr

Primero, para monitorear la generación de una imagen, puede monitorearla a través del método RegisterContentObserver de ContentReslver y, finalmente, volver a llamar al método onChange ().

El código central es el siguiente:

getBaseContext().getContentResolver().registerContentObserver(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
true, this);
getBaseContext().getContentResolver().registerContentObserver(
 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
true, this);

Como puede ver, la URL distingue entre interna y externa. El significado real es monitorear el almacenamiento corporal y el almacenamiento externo. Desde la perspectiva de la compatibilidad, ambos deben escribirse.
Mirando el código fuente:

    /**
     * Register an observer class that gets callbacks when data identified by a
     * given content URI changes.
     * <p>
     * Starting in {@link android.os.Build.VERSION_CODES#O}, all content
     * notifications must be backed by a valid {@link ContentProvider}.
     *
     * @param uri The URI to watch for changes. This can be a specific row URI,
     *            or a base URI for a whole class of content.
     * @param notifyForDescendants When false, the observer will be notified
     *            whenever a change occurs to the exact URI specified by
     *            <code>uri</code> or to one of the URI's ancestors in the path
     *            hierarchy. When true, the observer will also be notified
     *            whenever a change occurs to the URI's descendants in the path
     *            hierarchy.
     * @param observer The object that receives callbacks when changes occur.
     * @see #unregisterContentObserver
     */
    public final void registerContentObserver(@NonNull Uri uri, 
    		boolean notifyForDescendants,
            @NonNull ContentObserver observer) {
        Objects.requireNonNull(uri, "uri");
        Objects.requireNonNull(observer, "observer");
        registerContentObserver(
                ContentProvider.getUriWithoutUserId(uri),
                notifyForDescendants,
                observer,
                ContentProvider.getUserIdFromUri(uri, mContext.getUserId()));
    }

Para el parámetro booleano notifyForDescendants, se puede entender que si se establece en verdadero, se volverá a llamar el monitoreo de cambios relacionados con el tipo de medio, se puede entender que es una configuración generalizada y muy relevante. Si se establece en falso, se considera que solo se especifica esta clase. La configuración puede entenderse como un directorio específico. La correlación es baja. Algunos modelos pueden fallar debido a este parámetro.

De manera similar, para el monitoreo por video, el código central es el siguiente:

getBaseContext().getContentResolver().registerContentObserver(
MediaStore.Video.Media.INTERNAL_CONTENT_URI, true, this);
getBaseContext().getContentResolver().registerContentObserver(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, this);

Asimismo, la diferencia es que la configuración de Uri es diferente.

Aviso

(1) Tenga en cuenta que si hay registro, debe haber liberación; de lo contrario, se producirán pérdidas de memoria. No escribir sobre pérdidas de memoria es la cualidad básica de un desarrollador de Android. Saber cómo modificar las pérdidas de memoria es el umbral para un desarrollador de Android calificado.
(2) Al registrarse, el controlador puede personalizar el hilo entrante, que está relacionado con el tipo de hilo durante la devolución de llamada. El código fuente de devolución de llamada es el siguiente:

    /** @hide */
    public final void dispatchChange(boolean selfChange, @NonNull Collection<Uri> uris,
            @NotifyFlags int flags, @UserIdInt int userId) {
        if (mHandler == null) {
            onChange(selfChange, uris, flags, userId);
        } else {
            mHandler.post(() -> {
                onChange(selfChange, uris, flags, userId);
            });
        }
    }

Puede ver que durante la devolución de llamada, si pasamos un controlador que no es nulo, se llamará.
(3) El retraso de devolución de llamada pertenece al nivel del código fuente del sistema y no se puede modificar si no es una sala personalizada. Aquí sólo puedo sugerir que no utilice el controlador que pasa para evitar retrasos en algunos sistemas. Porque en algunos sistemas, el controlador que usted pase tendrá una operación retrasada.

Dirección de código
Buscar clase CtxObserverManager

eso es todo------------------------------------------------ ----------------------------

Supongo que te gusta

Origin blog.csdn.net/motosheep/article/details/130542075
Recomendado
Clasificación