关于安卓媒体资源变动监听(ContentResolver)应用

这篇具有很好参考价值的文章主要介绍了关于安卓媒体资源变动监听(ContentResolver)应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

媒体监听,是一个很常见的功能,例如手机自带的图库,监听到了拍照图片的生成,就会自动刷新一下图库,用于及时向用户展示最新的数据,还如聊天页面中,监听到相册有新的图片,则有个小弹窗询问用户是否发送该拍摄的图片等等。
!!!代码放文末!!!!
本文将会展示,如何对生成的图片和视频进行监听

环境

win10
as 4.0+
jdk 1.8

思路

其实实现监听的代码,无非来来去去都是那几种,一是查询对比,二是调用系统方法,而本文将会用ContentResolver进行监听。

实现

首先,监听一个图片的生成,可以通过ContentReslver的registerContentObserver方法进行监听,最后会回调到onChange()方法中。

核心代码如下:

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

可以看到,url区分了一个internal和external,实际的意思,就是监听机身存储以及外部存储,从兼容性角度考虑,两个都需要写。
在看源码:

    /**
     * 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()));
    }

对于boolean参数notifyForDescendants,可以理解为,如果设置为true,则跟该媒体类型有关变动的监听都会回调,可以理解为是一个广泛设置,关联度很高的设置。如果设置为false,则认为是仅仅指定了这种类,设置可以理解为是指定的某个目录,关联度低,某些机型会失效有可能是这个参数导致的。

同样地,视频的监听,核心代码如下:

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

同样地,区别就是在于Uri的设置不一样而已。

注意

(1)注意有注册,就应该要有释放,否则则会内存泄露。不写出内存泄露,是一个安卓开发者的基本素养,了解如何修改内存泄露,是一个合格安卓开发者的门槛。
(2)注册的时候,handler可以自定义传入的,这关乎到回调时候的线程种类。回调源码如下:

    /** @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);
            });
        }
    }

可以看到,回调的时候,如果我们传入的不是null的handler,则会调用。
(3)回调延时,属于系统源码层级,如果不是定制的room,是无法修改的。这里只能建议说,不使用自己传入的handler,规避某些系统的延时。因为某些系统下,自己传入的handler,会有一个delay的操作的。

代码地址
搜索CtxObserverManager类

that’s all----------------------------------------------------------------------------文章来源地址https://www.toymoban.com/news/detail-435846.html

到了这里,关于关于安卓媒体资源变动监听(ContentResolver)应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓设备监听全部输入信号

    最近团队收到一个产品需求,需要监听安卓设备上用户是否有输入行为,以免定制推荐的时候打搅到用户。这里指的是设备上所有应用的输入行为,而不是单指某一个应用。 这个需求还是蛮有挑战性的,需要涉及到很多FW层的知识,所以围绕着这个需求,定制了多个方案,并

    2024年02月16日
    浏览(28)
  • Android 14 新 API:直接监听截屏操作,不用再观察媒体文件了~

    截屏可以说是手机设备最常用的功能了,Android 系统非常重视截屏方面的体验,近几年的更新都不忘去优化这方面的体验。 从一开始仅在通知栏提醒已截屏,到 Android 11 支持在左下角生成截屏缩略图供编辑或分享,再到 Android 12 支持滚动截屏,以及这次的 Android 14 允许 App 直

    2023年04月15日
    浏览(32)
  • uniapp 安卓端实时监听网络状态

    写在uniapp的APP.vue的onShow方法中 uni.onNetworkStatusChange(function(res) {                 if (res.isConnected) {                     uni.showModal({                         title: \\\'系统提示\\\',                         content: \\\'当前设备网络已恢复\\\',                  

    2024年02月05日
    浏览(25)
  • Windows监听程序访问了哪些资源

    Winternals公司的SysInternals提供了很多方便工具,后来被微软收购,微软提供了该系列的工具 https://docs.microsoft.com/en-us/sysinternals/ 监听进程访问的资源用ProcessMonitor就可以了,但是数据太多了,后来发现 ProcessExplorer 用起来更方便,可以监听资源的访问,还可以监听User Object和GD

    2024年02月09日
    浏览(27)
  • uniapp 安卓如何获取通话权限,监听通话情况

    本篇文章还是主要讲解uniapp知识,那么在uniapp中如何去实现监听通话的权限?接下来请看代码 在页面中调用方法 监听通话状态

    2024年02月16日
    浏览(39)
  • uniapp app安卓 键盘监听(无input)

    如图: 要实现点击asdfhjkl任意键唤起答题说明弹窗,弹窗唤起的情况下点击enter键关闭弹窗,无弹窗的情况下点击enter键直接开始挑战   事件说明链接:HTML5+ API Reference

    2024年02月12日
    浏览(35)
  • uniapp ——苹果安卓系统——手机左滑返回监听

    监听安卓及苹果系统的物理返回上一页: 目前以下方法 只支持  APP   ,不支持小程序 / H5 等平台 安卓手机的物理返回键:只需要使用官方提供的  onBackPress  生命周期钩子函数 onBackPress  写在与 methods / onLoad 同级位置 参考网址: 页面简介 | uni-app官网 苹果手机上,是无法使

    2024年02月13日
    浏览(32)
  • 安卓手机APP开发__媒体开发部分__网络栈

    安卓手机APP开发__媒体开发部分__网络栈 目录 概述 配置ExoPlayer来使用一个特定的网络栈 支持的网络栈 Cronet OkHttp 安卓内嵌的网络栈 其它的网络栈

    2024年04月29日
    浏览(23)
  • 安卓手机APP开发__媒体开发部分__播放器的接口

    安卓手机APP开发__媒体开发部分__播放器的接口 目录 概述 组件之间的共同的接口 媒体3的播放的架构 播放器的状态 对改变的监听 当前的播放 定制的播放器实现 一个播放器是你的APP中完成媒体项的播放的组件. 媒体3的播放器接口提供了一个关于播放器处理的功能的总结. 这包

    2024年04月24日
    浏览(39)
  • 【python】fastapi response返回文本、音视频多媒体资源实现

    HTMLResponse 是FastAPI中自带的一个响应类,用于返回HTML格式的响应。使用方法如下: 在上面的例子中,我们在装饰器中指定了 response_class=HTMLResponse ,表示我们需要返回一个HTML响应。然后在函数中,我们返回了一个HTML格式的字符串。FastAPI会自动将这个字符串封装成一个 HTMLR

    2023年04月27日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包