0

我有一個具有詳細信息活動的Android應用程序,該詳細信息活動包含幾個帶有基礎片段的選項卡。當我點擊播放單擊的音頻文件的每一行時,其中一個片段是帶有音頻文件名稱的普通列表。MediaController似乎不會顯示

一切工作正常,但我想有一些手段看到播放進度和停止播放的能力,我試圖添加MediaController,但即使我沒有錯誤地創建它沒有媒體控制是在屏幕上可見。

我不知道如果我以正確的方式做任何幫助,你將不勝感激。

非常感謝, 拉狄克

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

'TextView'並不像anchorView而是使用SurfaceView,TextureView等合適的組件... – adnbsr

回答

1

您refrence

請檢查下面的代碼在你的代碼已經在的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> 
+0

非常感謝帕特里克,這種做法真是棒極了! – Radek

0

我不得不調整帕特里克的解決方案位打從資產文件夾中的文件,但它的工作非常適合容易切,在這裏被重新格式化的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(); 
} 

}