我有一个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将这些变量注入我的活动中? 提前谢谢。
问候
答案 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();
}
}