MediaController doesn't seem to show up

时间:2016-12-02 05:29:54

标签: android android-fragments android-mediaplayer mediacontroller

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();
                }
            }
        });

2 个答案:

答案 0 :(得分:1)

请检查以下代码以获取您的参考资料

在你的代码中你传递了mediaController中的TextView,需要传递SurfaceView而不是TextView,你需要在MediaController中设置MediaPlayer

JAVA文件。

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文件 -

<?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>

答案 1 :(得分:0)

我不得不调整Patrick的解决方案,从资源文件夹中播放文件,但它工作得很好,这里是重新格式化的java文件,如果有人需要它,可以轻松剪切和粘贴。

import android.content.res.AssetFileDescriptor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
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 MediaPlayer extends AppCompatActivity implements OnPreparedListener, MediaController.MediaPlayerControl {

private static final String TAG = "AudioPlayer";
private android.media.MediaPlayer mediaPlayer;
private MediaController mediaController;
private String audioFileName = "item1_audio1.mp3";;
private Handler handler = new Handler();


public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_audio_view);

    ((TextView) findViewById(R.id.now_playing_text)).setText(audioFileName);

    mediaPlayer = new android.media.MediaPlayer();
    mediaPlayer.setOnPreparedListener(this);

    mediaController = new MediaController(this);

    try {
        AssetFileDescriptor descriptor = MediaPlayer.this.getAssets().openFd(audioFileName);
        long start = descriptor.getStartOffset();
        long end = descriptor.getLength();
        mediaPlayer.setDataSource(descriptor.getFileDescriptor(), start, end);
        mediaPlayer.prepare();
        mediaPlayer.start();
    } catch (IOException e) {
        Log.e(TAG, "Could not open file " + audioFileName + " for playback.", e);
    }

}

@Override
public void onPrepared(android.media.MediaPlayer mp) {
    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();
        }
    });
}

@Override
protected void onStop() {
    super.onStop();
    mediaController.hide();
}

@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;
}

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;
}

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


@Override
public void onStart() {
    super.onStart();
}

}