+-
Android:如何通过MTP连接时检测MediaStore中的更改
我对MediaStore有很大的问题.当MediaStore通过MTP进行更改时,我需要处理事件.我已经有了 android.intent.action.MEDIA_SCANNER_FINISHED动作的接收器,但它仅适用于Universal Mass Storage(UMS).扫描程序不通过MTP启动,因为MTP直接更改了MediaStore数据库.

请你如此善良,帮助我如何发现这一事件.非常感谢您的帮助!

最佳答案
我终于找到了解决方案.我尝试使用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,……

点击查看更多相关文章

转载注明原文:Android:如何通过MTP连接时检测MediaStore中的更改 - 乐贴网