如何使用Dagger2注入exoPlayer

时间:2017-08-18 23:50:45

标签: java android dagger-2

我有一个Android应用程序,我想用dagger2实现exoplayer。 目前我正在关注exoPlayer的这个例子: Simple exoPlayer example

对于

private SimpleExoPlayerView simpleExoPlayerView;
simpleExoPlayerView = (SimpleExoPlayerView)findViewById(R.id.mainSimpleExoPlayer);

我打算使用ButterKnife。

有关

private SimpleExoPlayer player;
player = ExoPlayerFactory.newSimpleInstance(this,trackSelector,loadControl);

private TrackSelector trackSelector;
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

private TrackSelection.Factory videoTrackSelectionFactory;
videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);

private DataSource.Factory dataSourceFactory;
dataSourceFactory = buildDataSourceFactory(bandwidthMeter);

private MediaSource videoSource;

videoSource = new ExtractorMediaSource(uri, dataSourceFactory, new DefaultExtractorsFactory(),mainHandler,null);

// Build Data Source Factory using DefaultBandwidthMeter and HttpDataSource.Factory
private DataSource.Factory buildDataSourceFactory(DefaultBandwidthMeter bandwidthMeter){
    return new DefaultDataSourceFactory(this, bandwidthMeter, buildHttpDataSourceFactory(bandwidthMeter));
}

// Build Http Data Source Factory using DefaultBandwidthMeter
private HttpDataSource.Factory buildHttpDataSourceFactory(DefaultBandwidthMeter bandwidthMeter){
    return new DefaultHttpDataSourceFactory(userAgent, bandwidthMeter);
}

如何使用Dagger将这些变量注入我的活动中? 提前谢谢。

问候

1 个答案:

答案 0 :(得分:0)

对于那些只喜欢投诉和投票的人,以下是如何使用exoPlayer和dagger2,欢迎您:

模块:

import android.content.Context;
import android.net.Uri;
import android.os.Handler;

import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveVideoTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import com.google.android.exoplayer2.upstream.HttpDataSource;
import com.google.android.exoplayer2.util.Util;

import dagger.Module;
import dagger.Provides;

@Module
public class ExoPlayerModule {
    private final Context context;
    private String videoUri;

    public ExoPlayerModule (Context context, String videoUri) {
        this.context  = context;
        this.videoUri = videoUri;
    }

    @Provides //scope is not necessary for parameters stored within the module
    public Context context() {
        return context;
    }

    @Provides
    public Handler provideMoviesClient() {
        Handler handler = new Handler();
        return handler;
    }

    @Provides
    public DefaultBandwidthMeter providesDefaultBandwidthMeter() {
        DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        return bandwidthMeter;
    }

    // Create player

    @Provides
    public TrackSelection.Factory providesVideoTrackSelection(DefaultBandwidthMeter bandwidthMeter) {
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
        return videoTrackSelectionFactory;
    }

    @Provides
    public TrackSelector providesTrackSelector(TrackSelection.Factory videoTrackSelectionFactory) {
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
        return trackSelector;
    }

    @Provides
    public LoadControl providesLoadControl() {
        LoadControl loadControl = new DefaultLoadControl();
        return loadControl;
    }

    @Provides
    public SimpleExoPlayer providesExoPlayer(
            Context context, TrackSelector trackSelector, LoadControl loadControl) {
        SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl);
        return player;
    }

    // Prepare player
    @Provides
    public String providesUserAgent(Context context) {
        return Util.getUserAgent(context, "AppName");
    }

    @Provides
    public HttpDataSource.Factory providesHttpDataSource(
            String userAgent, DefaultBandwidthMeter bandwidthMeter) {
        return new DefaultHttpDataSourceFactory(userAgent, bandwidthMeter);
    }

    @Provides
    public DataSource.Factory providesDataSource(
            Context context, DefaultBandwidthMeter bandwidthMeter, HttpDataSource.Factory httpDataSource) {
        return new DefaultDataSourceFactory(context, bandwidthMeter, httpDataSource);
    }

    @Provides
    public MediaSource providesMediaSource(DataSource.Factory dataSourceFactory, Handler mainHandler) {
        Uri uri = Uri.parse(videoUri);
        return new ExtractorMediaSource(uri, dataSourceFactory, new DefaultExtractorsFactory(), mainHandler, null);
    }

}

以下是组件:

@Module
public class ApplicationModule {
    private MvvmApplication application;

    public ApplicationModule(MvvmApplication application) {
        this.application = application;
    }
}

最后活动:

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;

import com.example.movies.R;
import com.example.movies.dependencyinjection.DaggerPlayerActivityComponent;
import com.example.movies.dependencyinjection.PlayerActivityComponent;
import com.example.movies.dependencyinjection.module.ExoPlayerModule;
import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.HttpDataSource;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import javax.inject.Inject;

@EActivity(R.layout.activity_player)
public class PlayerActivity extends AppCompatActivity {

    private PlayerActivityComponent component;

    @Inject
    Handler handler;

    @Inject
    DefaultBandwidthMeter bandwidthMeter;

    @ViewById(R.id.mainSimpleExoPlayer)
    SimpleExoPlayerView simpleExoPlayerView;

    // Create player
    @Inject
    TrackSelection.Factory videoTrackSelectionFactory;
    @Inject
    TrackSelector trackSelector;
    @Inject
    LoadControl loadControl;
    @Inject
    SimpleExoPlayer player;

    // Prepare player
    @Inject
    String userAgent;
    @Inject
    HttpDataSource.Factory httpDataSourceFactory;
    @Inject
    DataSource.Factory dataSourceFactory;
    @Inject
    MediaSource videoSource;

    // Not injectable
    public Uri uri;

    private static final String VIDEO_URI =
            "http://techslides.com/demos/sample-videos/small.mp4";


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

        component =
                DaggerPlayerActivityComponent
                        .builder()
                        .exoPlayerModule(new ExoPlayerModule(PlayerActivity.this, VIDEO_URI))
                        .build();

        component.inject(this);
    }

    @AfterViews
    void init() {
        attachPlayerView();
        preparePlayer();
    }

    // Set player to SimpleExoPlayerView
    public void attachPlayerView() {
        simpleExoPlayerView.setPlayer(player);
    }

    public void preparePlayer() {
        player.prepare(videoSource);
    }

    // Activity onStop, player must be release because of memory saving
    @Override
    public void onStop(){
        super.onStop();
        player.release();
    }
}