Search code examples
androidandroid-fragmentsandroid-mediaplayermediacontroller

MediaController doesn't seem to show up


I have an android app with a detail activity, that detail activity has few tabs with underlying fragments. One of these fragments is plain list with a name of audio files when I click each line I'm playing the clicked audio files.

Everything works OK, but I would like to have some means of seeing a progress of the playback and ability to stop a playback, I was trying to add MediaController but even though I'm creating it without errors no media control is visible on a screen.

I'm not sure if I'm doing it in a correct way any help you would be appreciated.

Thanks a lot, Radek

  @Override
public View getView(final int position, View convertView, ViewGroup parent) {
    try {
       if(convertView == null){
           convertView = layoutInflater.inflate(R.layout.audio_row,parent,false);
       }
        TextView textView = (TextView) convertView.findViewById(R.id.rowText);
        textView.setText("" + jsonAudio.getJSONObject(position).getString("description"));

        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    String audioFileName = jsonAudio.getJSONObject(position).getString("file");
                    Toast.makeText(context, "audio item clicked: " + audioFileName, Toast.LENGTH_SHORT).show();

                    AssetFileDescriptor descriptor = context.getAssets().openFd(audioFileName);
                    long start = descriptor.getStartOffset();
                    long end = descriptor.getLength();
                    MediaPlayer mediaPlayer=new MediaPlayer();
                    mediaPlayer.setDataSource(descriptor.getFileDescriptor(), start, end);
                    mediaPlayer.prepare();

                    // not doing really anything
                    MediaController mediaController = new MediaController(context);
                    mediaController.setAnchorView(v);

                    mediaPlayer.start();

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

Solution

  • Please check the below code for your refrence

    In your code you have passed the TextView in the mediaController need to pass the SurfaceView instead of TextView and you need to set the MediaPlayer in the MediaController

    JAVA file.

    import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.util.Log;
    
    import android.media.MediaPlayer.OnPreparedListener; import android.view.MotionEvent; import android.widget.MediaController; import android.widget.TextView;
    
    import java.io.IOException;
    
    public class AudioPlayer extends Activity implements OnPreparedListener, MediaController.MediaPlayerControl{ private static final String TAG = "AudioPlayer";
    
    public static final String AUDIO_FILE_NAME = "audioFileName";
    
    private MediaPlayer mediaPlayer; private MediaController mediaController; private String audioFile;
    
    private Handler handler = new Handler();
    
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.audio_player);
    audioFile = this.getIntent().getStringExtra(AUDIO_FILE_NAME);
    ((TextView)findViewById(R.id.now_playing_text)).setText(audioFile);
    
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnPreparedListener(this);
    
    mediaController = new MediaController(this);
    
    try {
    mediaPlayer.setDataSource(audioFile);
    mediaPlayer.prepare();
    mediaPlayer.start();
    } catch (IOException e) {
    Log.e(TAG, "Could not open file " + audioFile + " for playback.", e);
    }
    }
    
    @Override protected void onStop() { super.onStop(); mediaController.hide(); mediaPlayer.stop(); mediaPlayer.release(); }
    
    @Override public boolean onTouchEvent(MotionEvent event) { //the MediaController will hide after 3 seconds - tap the screen to make it appear again mediaController.show(); return false; }
    
    //--MediaPlayerControl methods---------------------------------------------------- public void start() { mediaPlayer.start(); }
    
    public void pause() { mediaPlayer.pause(); }
    
    public int getDuration() { return mediaPlayer.getDuration(); }
    
    public int getCurrentPosition() { return mediaPlayer.getCurrentPosition(); }
    
    public void seekTo(int i) { mediaPlayer.seekTo(i); }
    
    public boolean isPlaying() { return mediaPlayer.isPlaying(); }
    
    public int getBufferPercentage() { return 0; }
    
    public boolean canPause() { return true; }
    
    public boolean canSeekBackward() { return true; }
    
    public boolean canSeekForward() { return true; } //--------------------------------------------------------------------------------
    
    public void onPrepared(MediaPlayer mediaPlayer) { Log.d(TAG, "onPrepared"); mediaController.setMediaPlayer(this); mediaController.setAnchorView(findViewById(R.id.main_audio_view));
    
        handler.post(new Runnable() {
        public void run() {
        mediaController.setEnabled(true);
        mediaController.show();
        }
        });
    } }
    

    XML file-

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main_audio_view" android:layout_width="match_parent" 
    android:layout_height="wrap_content" android:layout_gravity="center" 
    android:orientation="vertical"> <TextView 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:layout_gravity="center" android:text="Now playing:" 
    android:textSize="25sp" android:textStyle="bold" /> <TextView 
    android:id="@+id/now_playing_text" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:layout_marginTop="20dip" 
    android:layout_marginLeft="10dip" android:layout_marginRight="10dip" 
    android:layout_gravity="center" android:text="Now playing.." 
    android:textSize="16sp" android:textStyle="italic" /> </LinearLayout>