Использование MediaPlayer в AppWidgetProvider? - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть простой виджет, который воспроизводит звуковой файл при нажатии.Прямо сейчас у меня есть этот код в методе onRecieve:

@Override
public void onReceive(Context context, Intent intent)
{
    super.onReceive(context, intent);

    int id = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    SharedPreferences prefs = context.getSharedPreferences(CreateWidget.PREFS, 0);
    Log.d("WORKING",SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id+" = "+prefs.getString(SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id, "FAILURE"));
    Log.d("WORKING", "Received Intent: " + intent.getAction());

    if (intent.getAction().equals(ACTION_PLAY_SOUND))
    {
        try
        {
            if(mPlayer != null)
            {
                mPlayer.stop();
                mPlayer.release();
                Uri sfxURI= Uri.parse(prefs.getString(SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id, "null"));
                mPlayer.setDataSource(context, sfxURI);
                mPlayer.prepare();
                mPlayer.start();
                Log.d("WORKING","MediaPlayer already existed, released it");
            }
            else
            {
                Uri sfxURI= Uri.parse(prefs.getString(SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id, "null"));
                mPlayer = MediaPlayer.create(context, sfxURI);
                mPlayer.start();
                Log.d("WORKING","MediaPlayer did not exist, making a new one");
            }
        } catch (IllegalStateException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (SecurityException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }

    }

}

Что происходит, так это то, что журнал постоянно сообщает, что создает новый экземпляр MediaPlayer каждый раз, когда я воспроизводю звук.Я предполагаю, что AppWidgetRecievers / BroadcastReceivers не должны иметь объекты или что-то?Кто-нибудь знает альтернативный способ воспроизведения звуков (желательно легкий, так как это всего лишь виджет. И я думаю, что может быть более эффективно использовать SoundPool, поскольку возможно иметь несколько разных звуков)?

1 Ответ

1 голос
/ 16 ноября 2011

Я предполагаю, что AppWidgetRecievers / BroadcastReceivers не предназначены для того, чтобы иметь объекты или что-то еще?

Зарегистрированный манифест BrodadcastReceivers, как AppWidgetProvider, живут только так долгокак и вызов onReceive().Для них небезопасно делать что-либо, что живет намного позже конца onReceive(), и они не используются повторно.

Любой знает альтернативный способ воспроизведения звуков (желательно легкий, так как он тольковиджет.

Если ваша цель - воспроизводить звук в течение длительного периода времени, попросите AppWidgetProvider делегировать произведение на Service, который управляет воспроизведением звука.

И я полагаю, что может быть более эффективно использовать SoundPool, так как возможно иметь несколько разных звуков)?

Могут быть сценарии, в которых SoundPool является лучшим вариантом, чем MediaPlayer, но маловероятно, что какой-либо из этих сценариев имеет какое-либо отношение к виджетам приложения.

...