【问题标题】:Android: How to detect a change in MediaStore when connected over MTPAndroid:通过 MTP 连接时如何检测 MediaStore 的变化
【发布时间】:2012-09-14 20:19:00
【问题描述】:

我对 MediaStore 有很大的问题。当 MediaStore 通过 MTP 更改时,我需要处理事件。我已经有了android.intent.action.MEDIA_SCANNER_FINISHED 操作的接收器,但它仅对通用大容量存储(UMS)有用。扫描仪不会通过 MTP 启动,因为 MTP 会直接更改 MediaStore 数据库。

请您好心帮我如何检测此事件。非常感谢您的帮助!

【问题讨论】:

    标签: android events action mediastore mtp


    【解决方案1】:

    我终于找到了解决办法。我尝试使用 FileObserver 但是当你将它用于所有目录时......它非常消耗内存。所以现在我正在使用 ContentObserver,它运行良好:

    public static class UriObserver
    {
        private final Cursor mCursor;
        private final ContentObserver mObserver;
        private boolean mRunning = true;
    
        private class ObserverWithListener extends ContentObserver
        {
            private final OnChangeListener mListener;
    
            public ObserverWithListener(OnChangeListener listener)
            {
                super(new Handler());
    
                mListener = listener;
            }
    
            @Override
            public void onChange(boolean selfChange)
            {
                if (mRunning)
                {
                    log.d("Change triggered");
                    mListener.onChange();
                }
            }
        };
    
        public static UriObserver getInstance(ContentResolver contentResolver, Uri uri, OnChangeListener listener)
        {
            Cursor c = contentResolver.query(uri, new String[] { "*" }, null, null, null);
    
            if ((c = Dao.moveToFirst(c)) == null)
            {
                log.e("Cannot start observer for uri: " + uri);
                return null;
            }
    
            return new UriObserver(c, listener);
        }
    
        public UriObserver(Cursor c, final OnChangeListener listener)
        {
            mCursor = c;
            mObserver = new ObserverWithListener(listener);
            mCursor.registerContentObserver(mObserver);
        }
    
        public void stop()
        {
            mCursor.unregisterContentObserver(mObserver);
            Dao.closeCursor(mCursor);
            mRunning = false;
        }
    
        public interface OnChangeListener
        {
            public void onChange();
        }
    }
    

    标志 mRunning 出于某种原因必须存在,因为即使之前调用了 unregisterContentObserver(),有时也会调用 onChange。

    此代码与我想观察的 Uris 一起使用,即 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,...

    【讨论】:

    • 这个答案非常适合检测文件删除/文件替换,但通过 MTP 添加新文件不会触发观察者更改,至少对我在 Nexus 7 上而言
    • 嗯,它适用于我对这个光标的任何操作(即 MTP)。此 uri 仅适用于音频文件,也许您应该指定另一个 URI。
    【解决方案2】:

    创建一个内容观察者类

    class MyObserver extends ContentObserver {
        public MyObserver(Handler handler) {
    
            super(handler);
        }
    
        @Override
        public void onChange(boolean selfChange) {
            this.onChange(selfChange, null);
        }
    
        @Override
        public void onChange(boolean selfChange, Uri uri) {
         doYourWorkHere();
        }
    }
    

    在您的活动中注册观察者

    Handler handler;
        MyObserver observer;
    handler = new Handler();
    observer = new MyObserver(handler);
            this.getContentResolver().
                    registerContentObserver(
                            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                            true,
                            observer);
    

    不要忘记在 onDestroy() 函数中注销观察者

     this.getContentResolver().unregisterContentObserver(observer);
    

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多