6

MediaStore に大きな問題があります。MediaStore が MTP 経由で変更されたときにイベントを処理する必要があります。アクション用の受信機は既に持っていますが、android.intent.action.MEDIA_SCANNER_FINISHEDUniversal Mass Storage (UMS) にのみ役立ちます。MTP は MediaStore データベースを直接変更するため、スキャナは MTP 経由で起動されません。

このイベントを検出する方法を教えてください。助けてくれてありがとう!

4

2 に答える 2

12

私は最終的に解決策を見つけました。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();
    }
}

unregisterContentObserver() が以前に呼び出された場合でも onChange が呼び出されることがあったため、何らかの理由で mRunning フラグが存在する必要があります。

私が観察したいUrisで使用しているこのコード、つまりMediaStore.Audio.Media.EXTERNAL_CONTENT_URI、...

于 2012-10-12T18:06:21.437 に答える