2017-02-08 1 views
0

Ich habe eine Android-App, die sowohl für Android-Telefon/-Tabletts als auch Amazon Fire TV gemacht wird. In der Mitte des Bildschirms befindet sich eine Schaltfläche zum Anhalten/Pausieren, die beim Drücken zwischen ihnen umgeschaltet wird. Das Videostreaming wird wiedergegeben und angehalten, wenn Sie diese Taste verwenden. Hier ist der erste Teil des Codes meiner ExoPlayerActivity Klasse:Was ist los mit meiner Wiedergabe/Pause-Logik für Amazon Fire TV-Fernbedienungstasten?

public class ExoPlayerActivity extends ActivityBase implements ExoPlayerView, PlaybackControlView.VisibilityListener, 
     ExoPlayer.EventListener, View.OnTouchListener { 
    private final static String TAG = " [ExoPlayerActivity] "; 
    private ExoPlayerPresenter exoplayerPresenter; 
    protected String userAgent; 
    private DataSource.Factory mediaDataSourceFactory; 
    private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter(); 
    private SimpleExoPlayerView simpleExoPlayerView; 
    private SimpleExoPlayer player; 
    private DefaultTrackSelector trackSelector; 

    private boolean shouldAutoPlay; 
    public static String playlink; 

    private LinearLayout debugRootView; 
    private TextView debugTextView; 
    private Button retryButton; 
    private Handler mainHandler; 
    private boolean playerNeedsSource; 

    // private ImageView channelPoster; 
    private TextView channelTitle; 
    private ImageView play, pause; 
    private ProgressBar progressBar; 
    private RelativeLayout channelDetail; 
    private RecyclerView channelRecyclerView; 
    private float x1,x2; 
    private View rootView; 

    private Timer timer; 
    private TimerTask timerTask; 
    private int delayTime; 
    private boolean isPaused; 

    @Inject 
    private Logger logger; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     InjectFactory.injectMembers(this); 
     exoplayerPresenter = new ExoPlayerPresenter(ExoPlayerActivity.this, this); 
     shouldAutoPlay = true; 
     mediaDataSourceFactory = buildDataSourceFactory(true); 
     userAgent = Util.getUserAgent(this, "ExoPlayer"); 
     mainHandler = new Handler(); 
     playlink = getIntent().getExtras().getString("playLink"); 
     logger.info(TAG+"Play Link is: " + playlink); 

     setContentView(R.layout.activity_exoplayer); 
     rootView = findViewById(R.id.root); 

     play = (ImageView) findViewById(R.id.play); 
     pause = (ImageView) findViewById(R.id.pause); 
     play.setVisibility(View.INVISIBLE); 

     simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view); 
     simpleExoPlayerView.requestFocus(); 
     simpleExoPlayerView.setOnTouchListener(this); 
     simpleExoPlayerView.setControllerVisibilityListener(this); 

     channelDetail = (RelativeLayout) findViewById(R.id.player_details); 
     channelTitle = (TextView) findViewById(R.id.airing_title); 

     channelRecyclerView = (RecyclerView) findViewById(R.id.airingRecyclerView); 
     progressBar = (ProgressBar) findViewById(R.id.player_loading); 
     progressBar.setVisibility(View.INVISIBLE); 

     isPaused = false; 
     // Button Listener 
     setListener(); 

     // keep screen on 
     getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

     // Timer Task 
     setTimerTask(); 

     // setting up channel titles, poster, and airing list at bottom 
     setFullScreen(); 
     setChannelRecyclerView(); 
     updatePlayerViewDetails(); 
    } 

    private void setListener() { 
     play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       player.setPlayWhenReady(true); 
       play.setVisibility(View.INVISIBLE); 
       pause.setVisibility(View.VISIBLE); 
      } 
     }); 

     pause.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       player.setPlayWhenReady(false); 
       play.setVisibility(View.VISIBLE); 
       pause.setVisibility(View.INVISIBLE); 
      } 
     }); 
     simpleExoPlayerView.setControllerVisibilityListener(new PlaybackControlView.VisibilityListener() { 
      @Override 
      public void onVisibilityChange(int visibility) { 
       simpleExoPlayerView.hideController(); 
      } 
     }); 
    } 

Beachten Sie, dass in dem setListener() -Methode, wenn die Pausetaste angeklickt wird, player.setPlayWhenReady (false) aufgerufen wird, die den Strom unterbricht, und Schaltet die Schaltfläche als Play-Symbol ein. Im Gegensatz dazu wird player.setPlayWhenReady (true) aufgerufen, wenn die Play-Taste gedrückt wird, wobei die Taste erneut als Pause-Symbol angezeigt wird.

Jetzt für meine onKeyUp-Methode, die ich verwende, um Amazon Fire TV-Eingänge zu registrieren. In meinem OnCreate habe ich zunächst isPaused = false gesetzt. Hier ist meine onKeyUp Methode:

@Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     boolean handled = false; 

     switch (keyCode) { 
      case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 
       //TODO: fix play pause logic 
       if(isPaused=false){ 
        player.setPlayWhenReady(true); 
        toggleControlsVisibility(); 
        isPaused=true; 
        handled=true; 
        break; 
       } 
       else if (isPaused=true){ 
        player.setPlayWhenReady(false); 
        toggleControlsVisibility(); 
        isPaused=false; 
        handled=true; 
        break; 
       } 
      case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 
       //go forward one channel 
       exoplayerPresenter.onSwipeLeft(); 
       handled=true; 
       break; 
      case KeyEvent.KEYCODE_MEDIA_REWIND: 
       //go back one channel 
       exoplayerPresenter.onSwipeRight(); 
       handled=true; 
       break; 
      case KeyEvent.KEYCODE_MENU: 
       toggleControlsVisibility(); 
       handled=true; 
       break; 
     } 
     return handled || super.onKeyUp(keyCode, event); 
    } 

Lassen Sie uns das erste sagen, if-Anweisung Fall # 1 und die else if ist Fall # 2. Wenn ich zum ersten Mal die Wiedergabe/Pause-Taste auf der Fernbedienung drücke, wird der Stream angehalten. Dieser Teil macht für mich wenig Sinn, da ich im onCreate isPause auf false gesetzt habe. Sollte Fall Nr. 1 nicht der Fall sein, der ausgeführt wird? In diesem Fall rufe ich setPlayWhenReady (true) auf, was das Streaming nur abspielen lassen sollte. Aber irgendwie hält es den Strom an. Sobald der Stream pausiert ist, drücke ich erneut die Play/Pause-Taste auf der Fernbedienung, aber der Stream wird nicht fortgesetzt.

Ich habe durch meine Logik gesucht und kann nicht herausfinden, was los ist. Ich habe versucht onKeyDown anstelle von onKeyUp zu verwenden, aber es gab keinen Unterschied in den Ergebnissen. Android Studio warnt mich auch, dass es pausiert = wahr ist immer wahr. Dies führt nur zu meiner Verwirrung, da isPaused in onCreate falsch ist. Es kann nur wahr werden, wenn ich den Knopf drücke (ich ändere nicht den Wert von isPause an anderer Stelle in meinem Code)

Edit: Sorry, wenn ich Maus über Fall # 1, warnt Android Studio, dass isPaused ist immer falsch. Wenn ich Maus über Fall # 2, warnt Android Studio, dass isPaused immer wahr ist. Immer noch nicht sicher, wie das hilft.

+0

sollte es sein 'if (isPaused == false) {'? – Offbeatmammal

+0

@Offbeatmammal ja .. das war es ... werde jetzt von einer Brücke springen. –

+0

:) nichts Schlimmeres als ein winziger Tippfehler und hämmern stundenlang auf der Tastatur, um es zu reparieren! – Offbeatmammal

Antwort

0

kleiner Tippfehler in obigen Code ... sollte

if(isPaused==false){ 
... 

(nicht nur ein einzelnes =)