Android: намерение, когда SD-карта ДЕЙСТВИТЕЛЬНО смонтирована и читаема

У меня есть следующая установка:

SD-карта Mount Receiver (MountReceiver.java)

public IntentFilter getIntentFilter() {
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
    intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
    intentFilter.addDataScheme("file");
    return intentFilter;
}

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
        setMounted(true);
    } else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
        setMounted(false);
    }
}

private void setMounted(boolean isMounted) {
    if (isMounted) {
        doPerformQuery();
    }
}

И когда я регистрирую приемник, я делаю:

registerReceiver(mountInstance, mountInstance.getIntentFilter());

Все отлично, денди и работает, как и ожидалось. Я могу размонтировать и перемонтировать свою SD-карту, и мой метод setMounted запускается соответствующим образом. У меня проблема в том, что мой метод doPerformQuery() возвращает 0 результатов после установки SD-карты. Если я изменю код на:

Thread.sleep(5000);
doPerformQuery();

Тогда это будет работать, иногда. Это дает SD-карте 5 секунд, чтобы закончить «подготовку». Я хочу знать, когда SD-карта закончила подготовку и может быть прочитана. В настоящее время я получаю намерение, когда SD-карта установлена, но она еще не «подготовилась», поэтому ее невозможно прочитать. Есть ли такое намерение зарегистрироваться, когда SD-карта закончит «подготовку». Кстати, я говорю «подготовка», потому что это то, что мой телефон говорит в панели уведомлений. Я не уверен, что это стандартно для всех телефонов, поскольку я не могу найти в Интернете ничего о подготовке SD-карты.


person Nick    schedule 17.04.2011    source источник
comment
@Nick: Может ли быть так, что ваша SD-карта «сканируется» на наличие новых носителей (музыки и т. д.)? Пробовали ли вы проверить ACTION_MEDIA_SCANNER_STARTED и связанные с ним намерения? Просто дальний выстрел.   -  person Squonk    schedule 17.04.2011
comment
Возможно, вы попали в самую точку. Он ищет новую музыку (примерно 1200 песен на моем телефоне). И мой запрос, чтобы захватить песни с телефона. Я не знал о таком намерении, но это похоже именно на то, что я ищу. Спасибо. Я поиграю с этим и опубликую свои результаты.   -  person Nick    schedule 17.04.2011
comment
@Nick: Мне было бы интересно узнать, помогло ли это, и решает ли проблему ожидание завершения связанного сканирования.   -  person Squonk    schedule 17.04.2011
comment
@MisterSquonk, спасибо за помощь! ACTION_MEDIA_SCANNER_FINISHED был именно тем, что мне было нужно. Если хотите, вы можете сделать это ответом, чтобы я мог его принять. Спасибо еще раз.   -  person Nick    schedule 17.04.2011
comment
И для тех, у кого может быть такой же вопрос. Я только что добавил намерениеFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); по моему методу выше. Я добавил еще один else-if в свой метод onReceive, чтобы проверить, является ли действие этим новым действием. И ради забавы я добавил дополнительную проверку, чтобы убедиться, что сканер завершил работу с SD-картой: if (intent.getDataString().contains(Environment.getExternalStorageDirectory().toString())).   -  person Nick    schedule 17.04.2011
comment
@Nick: Рад, что смог указать тебе правильное направление. Я разместил ответ.   -  person Squonk    schedule 17.04.2011


Ответы (2)


В ответ на наши комментарии к вашему первоначальному вопросу...

Я думаю, что логика заключается в том, что когда SD-карта отключена, поставщик контента для различных AV-носителей (видео, музыка, фотографии и т. SD-карта вернется, и если да, будут ли на ней те же файлы. В результате при каждой установке SD-карты выполняется полное сканирование (в результате появляется уведомление о «подготовке»).

Таким образом, в вашем случае проверка ACTION_MEDIA_SCANNER_STARTED и, что наиболее важно, связанного с ним ACTION_MEDIA_SCANNER_FINISHED означает, что поставщик AV-медиаконтента будет иметь текущий список всего на карте.

person Squonk    schedule 17.04.2011
comment
Второй абзац — именно то, почему я слушаю это намерение. Мне нужно знать, какой контент изменился на SD-карте. - person Nick; 17.04.2011

Проверьте результат Environment.getExternalStorageState() (ссылка на API) .

Я почти уверен, что через несколько секунд вы получите MEDIA_CHECKING. Если это правильно, вы можете использовать простой цикл while, чтобы проверить это и продолжить, когда состояние изменится на MEDIA_MOUNTED

person Aleadam    schedule 17.04.2011
comment
К сожалению, я получаю MEDIA_MOUNTED, когда использую Environment.getExternalStorageState(). Но я не знал, что существует состояние MEDIA_CHECKING, поэтому я проведу небольшое исследование, чтобы убедиться. Спасибо за помощь. - person Nick; 17.04.2011
comment
@Ник, к сожалению, не слишком помог. Удачи. - person Aleadam; 17.04.2011
comment
Это всегда возвращает внутреннюю память для моего устройства. Как я могу получить истинное состояние внешнего (съемного) хранилища устройства? Как это работает для устройств с несколькими накопителями? - person gonzobrains; 08.06.2013