Dagger and ButterKnife - Могу ли я внедрить экземпляр Android AudioManager

Как внедрить экземпляр AudioManager? Мне нужен контекст, а у меня его нет?

Вот мой класс, который использует инъекцию кинжала:

public abstract class ListPageActivity extends BaseActivity {

private SoundPool mSoundPool;
private int mSoundID;
boolean plays = false, loaded = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//ButterKnife.inject(this);
}


public void loadBrandSound(){
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        loaded = true;
    }
});
mSoundID = mSoundPool.load(this, R.raw.ducksound, 1);

}

@Inject AudioManager am; //i want to inject this
public void playBrandSound() {



     /*AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE); commented out as i want to
inject it*/
    int volume_level= am.getStreamVolume(AudioManager.STREAM_MUSIC);

    // Is the sound loaded already ?
    if (loaded && !plays) {
        mSoundPool.play(mSoundID, volume_level, volume_level, 1, 0, 1f);
        plays = true;

    }
}

public void stopBrandSound() {

    if (mSoundPool != null && plays) {
        mSoundPool.stop(mSoundID);
        mSoundPool.release();
        plays = false;
    }

}

}

и вот мой неисправный модуль с именем ActivityModule.java, который я хочу объявить экземпляром audioManager, который можно внедрить в мою ListPageActivity:

@Module(
        library = true,
        injects= {
                ListPageActivity.class,
                MainActivity.class
        }
) public class ActivityModule {

    @Provides
    AudioManager provideAudioManager(){return (AudioManager) getSystemService(AUDIO_SERVICE);
//the above fails to compile as i need a context, how can i get one ?
}
}

Мои модули кинжала уже работают, так что я правильно настроил. Также есть ли более простой способ внедрить системные службы, поскольку они так распространены, а не таким образом? Я думал, что ButterKnife может иметь что-то, что я мог бы просто внедрить в systemService так же, как я могу внедрить представление.


person j2emanue    schedule 21.12.2014    source источник


Ответы (1)


Предполагая, что BaseActivity обрабатывает внедрение Activity за вас, вы сможете:

Передайте контекст в качестве параметра вашему методу "provideAudioManager", а затем используйте метод ProvideContext(), который предоставляет контекст либо из действия, либо из приложения.

Что-то вроде этого

private Activity mActivity;

public ActivityModule(Activity activity){
    mActivity = activity;
}

Context provideContext(){
    return mActivity;
}

AudioManager provideAudioManager(Context context){
   return (AudioManager) context.getSystemService(AUDIO_SERVICE);
}
person Michael Evans    schedule 21.12.2014