1. 程式人生 > >Android實現播放音訊

Android實現播放音訊

在Android平臺上實現一個播放音訊檔案還是比較簡單的,本文將使用Android權威指南的hellomoon例子來介紹下如何構建播放音訊專案。首先新建一個Android專案,本例中使用Android studio為例。在嚮導結束後,會建立一個預設的activity,將此類 HelloMoonActivity,並修改整合基類 FragmentActivity,建立後並修改程式碼如下:

package com.example.hehao.hellomoon;

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

public class HelloMoonActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_moon);
    }
}
通過這段程式碼,系統會載入activity_hello_moon佈局檔案,在這個佈局檔案中,我們只聲名一個fragment,並制定name屬性,這個屬性例項化的fragment,此佈局檔案如下:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/helloMoonFragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:name="com.example.hehao.hellomoon.HelloMoonFragment">

</fragment>

通過上面的佈局檔案,可以看出例項化了HelloMoonFragment類,接下來我們來編寫此類檔案,並建立此檔案的佈局類,由於要實現播放音訊檔案,所以佈局檔案應該有播放和停止按鈕,此佈局使用TableLayout佈局,並使用了一個阿姆斯特朗登月的圖片作為背景圖片,此佈局檔案如下:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    
  <ImageView 
    android:src="@drawable/armstrong_on_moon"
    android:contentDescription="@string/hellomoon_image_description"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerInside"
    android:layout_weight="1"
    />        
  <TableRow 
    android:gravity="center|bottom"
    android:layout_weight="0"
    >
    <Button android:id="@+id/hellomoon_playButton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/hellomoon_play" 
      />
    
    <Button android:id="@+id/hellomoon_stopButton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/hellomoon_stop"
      />
   </TableRow>

</TableLayout>

下面,需要我們編寫相應的fragment類
package com.example.hehao.hellomoon;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * Created by 浩 on 2016/12/26.
 */

public class HelloMoonFragment extends Fragment {
    private AudioPlayer mPlayer = new AudioPlayer();
    private Button mPlayButton;
    private Button mStopButton;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_hello_moon,container,false);

        mPlayButton =(Button)v.findViewById(R.id.hellomoon_playButton);
        mPlayButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                mPlayer.play(getActivity());
            }
        });
        mStopButton =(Button)v.findViewById(R.id.hellomoon_stopButton);
        mStopButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                mPlayer.stop();
            }
        });
        return v;
    }

    @Override
    public void onDestroyView() {
        super.onDestroy();
        mPlayer.stop();
    }
}

此fragment例項類中使用佈局檔案定義的播放和停止按鈕,並新增相應的按鈕監聽事件,此處不再贅述,此類中使用另外定義的AudioPlayer類,此處貼出:
/**
 * Created by 浩 on 2016/12/26.
 */

public class AudioPlayer {
    private MediaPlayer mPlayer;

    public void stop(){
        if(mPlayer!=null){
            mPlayer.release();
            mPlayer=null;
        }
    }

    public void play(Context c){
        stop();
        mPlayer = MediaPlayer.create(c,R.raw.one_small_step);
        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stop();
            }
        });

        mPlayer.start();
    }
}