2010-09-19 40 views
35

Làm cách nào để hiển thị số MediaController khi phát tệp âm thanh? Tôi đang tạo một thể hiện của MediaController và gọi phương thức show() của nó, nhưng nó không hiển thị. Có thể giúp tôi trong việc phân loại vấn đề này không?Tôi làm cách nào để hiển thị MediaController trong khi phát âm thanh trong Android?

+9

có biểu tượng dấu kiểm bên cạnh xếp hạng của mỗi câu trả lời (ở bên trái, bạn sẽ thấy nó), chỉ cần nhấp vào nó – Lope

+6

Vui lòng chấp nhận một trong các câu trả lời bên dưới. Nó giúp hiển thị một số đánh giá cao cho những người dành thời gian để trả lời câu hỏi của bạn. – Pieter

Trả lời

91

Dưới đây là ví dụ về Hoạt động sử dụng MediaPlayer và MediaController để phát âm thanh.

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

Đây là một bố cục có thể được sử dụng với các mã trên:

<?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="fill_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

hiện ai đã thử mã trên ?, nó không hoạt động, tôi không nghe thấy âm thanh hoặc hiển thị âm thanh, có tôi định nghĩa 'AUDIO_FILE_NAME' một cái gì đó như thế này "mysite.com/talk/1.mp3" –

+0

Cảm ơn điều này đã giúp tôi rất nhiều !!! – krisDrOid

+0

Tôi (cuối cùng) đã sửa phương thức onStop theo đề xuất của @ jp36. Cảm ơn bạn đã chỉnh sửa @ jp36! – user229487

18

tôi vẫn không có đủ đại diện để Bình luận vì vậy tôi có phải chỉ cần đăng bài này như một câu trả lời.

@ câu trả lời user229487 của

bạn cần phải thêm mediaController.hide(); với phương pháp onStop(). Nếu bạn không làm điều này và bạn tình cờ xoay cửa sổ hoặc đóng cửa sổ khi nó được hiển thị cho bạn sẽ nhận được một lỗi Activity x has leaked window

Phương pháp mới sẽ trông như thế này

@Override 
protected void onStop() { 
    super.onStop(); 
    mediaController.hide(); 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 
} 
1

tôi sao chép đoạn mã trên từ user229487 nguyên văn nhưng không thể làm cho nó hoạt động. Do tôi là người mới đến với nhà phát triển Android, tôi đã phát hiện ra một cách khó khăn mà bạn cần phải đặt ý định cũng như một vài thứ khác. Tôi cũng không hiểu chính xác làm thế nào ý định sẽ làm việc với một giao diện người dùng (một lần nữa tôi mới), nhưng sẽ làm việc trên nó.

vài điều cho noobs khác như tôi để lấy mã ở trên để làm việc (tôi ít nhất đã nhận nó để không sụp đổ ngay bây giờ và chơi một bài hát :)):

  • Sẽ không biên dịch mà không này:

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

  • để thiết lập âm thanh bằng tay: (dòng thay đổi :)

    public static final String AUDIO_FILE_NAME = Environment.getExternalStorageDirectory()+"/MusicFolder/Song.mp3";

  • Cài đặt ý định
    Thêm dòng này: this.getIntent().putExtra(AUDIO_FILE_NAME,AUDIO_FILE_NAME);
    Trước khi dòng này: audioFile = this.getIntent().getStringExtra(AUDIO_FILE_NAME);

nên biên dịch và chơi bài hát bây giờ.

0

Tôi chưa được phép bình luận ... do đó tôi viết ở đây. Đoạn mã trên là tuyệt vời. Tôi chỉ cần đưa ra số điện thoại

mediaPlayer.prepare();

bit trong lần thử, nếu không hoạt động sẽ bị lỗi. Không chắc chắn những gì bit này nên được làm, nó đang làm việc rất tốt mà không có nó. Cảm ơn!!

Các vấn đề liên quan