0

Ich habe ein Fragment, wo ich Media Player verwende und meine eigene benutzerdefinierte Controller-Klasse verwendet. Ich bin nicht in der Lage, controller.setMediaPlayer im Fragment zu setzen. Ich habe VideoControllerView.MediaPlayerControl-Klasse in Fragment implementiert.Wie setze ich MediaPlayer innerhalb eines Fragments?

Mein Fragment Klasse ist:

public class HomeFragment extends Fragment implements SurfaceHolder.Callback, VideoControllerView.MediaPlayerControl { 

@BindView(R.id.videoSurfaceContainer) 
FrameLayout videoContainer; 
@BindView(R.id.videoSurface) 
SurfaceView videoSurface; 
@BindView(R.id.progress) 
ProgressBar progressBar; 
@BindView(R.id.errorTv) 
RelativeLayout relativeLayout; 
@BindView(R.id.errorTextView) 
TextView errorTextView; 


public MediaPlayer player; 
public VideoControllerView controller; 
private Context context; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_home, container, false); 
    ButterKnife.bind(this, v); 

    player = new MediaPlayer(); 

    controller = new VideoControllerView(getActivity()); 

    SurfaceHolder videoHolder = videoSurface.getHolder(); 
    videoHolder.addCallback(this); 

    progressBar.setVisibility(View.VISIBLE); 

    playVideo("http://202.166.200.170:8081/otv/aastha.stream/playlist.m3u8"); 

    relativeLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       relativeLayout.setVisibility(View.GONE); 
       player.reset(); 
       progressBar.setVisibility(View.VISIBLE); 
       playVideo("http://202.166.200.170:8081/otv/aastha.stream/playlist.m3u8"); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    return v; 
} 

@Override 
public void surfaceCreated(SurfaceHolder surfaceHolder) { 
    player.setDisplay(surfaceHolder); 
} 

@Override 
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 

} 


public void playVideo(String link) { 
    try { 
     videoSurface.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       if (controller.isShowing()) 
        controller.hide(); 
       else 
        controller.show(); 

       return false; 
      } 

     }); 

     player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       controller.setMediaPlayer(); 
       controller.setAnchorView((FrameLayout) getActivity().findViewById(R.id.videoSurfaceContainer)); 
       player.start(); 
       progressBar.setVisibility(View.GONE); 

       if (relativeLayout.isShown()) 
        relativeLayout.setVisibility(View.GONE); 
      } 
     }); 

     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setDataSource(getActivity(), Uri.parse(link)); 
     try { 

      player.prepareAsync(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     player.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 

       progressBar.setVisibility(View.GONE); 

       errorMessage("Streaming Error"); 
       player.reset(); 
       errorTextView.setText(getResources().getString(R.string.error_msg_video)); 
       return false; 
      } 
     }); 

     player.setScreenOnWhilePlaying(true); 
     Log.d("after click", "last try"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void errorMessage(String message) { 
    try { 
     relativeLayout.setVisibility(View.VISIBLE); 
     progressBar.setVisibility(View.GONE); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void start() { 

} 

@Override 
public void pause() { 

} 

@Override 
public int getDuration() { 
    return 0; 
} 

@Override 
public int getCurrentPosition() { 
    return 0; 
} 

@Override 
public void seekTo(int pos) { 

} 

@Override 
public boolean isPlaying() { 
    return false; 
} 

@Override 
public boolean canPause() { 
    return false; 
} 

@Override 
public boolean isFullScreen() { 
    return false; 
} 

@Override 
public void toggleFullScreen() { 

} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    context = activity; 

} 

wenn Sie in playvideo Methode siehe innen setOnpreparedListener i Störung erhalten in controller.setMediaPlayer(), weil ich nicht in der Lage bin hier sein, den Kontext zu übergeben.

Was kann hier getan werden, um den Fehler zu beheben?

+0

Verwenden Sie player.getContext() – Anonymous

Antwort

0

Dies ist, wie wir controller.setMediaPlayer()

// Implement MediaPlayer.OnPreparedListener 
@Override 
public void onPrepared(MediaPlayer mp) { 
controller.setMediaPlayer(this); 
controller.setAnchorView((FrameLayout) 
findViewById(R.id.videoSurfaceContainer)); 
player.start(); 
} 
// End MediaPlayer.OnPreparedListener 

This is example to use costume controller

0

Wenn Sie möchten, können Sie den Kontext von dort mit HomeFragment.this.getContext(), wie bekommen konnte:

player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      controller.setMediaPlayer(HomeFragment.this.getContext()); 
      controller.setAnchorView((FrameLayout) getActivity().findViewById(R.id.videoSurfaceContainer)); 
      player.start(); 
      progressBar.setVisibility(View.GONE); 

      if (relativeLayout.isShown()) 
       relativeLayout.setVisibility(View.GONE); 
     } 
    }); 
0

Ich habe gerade controller.setMediaPlayer(this); nach onCreateView verschoben und es hat funktioniert.

Verwandte Themen