瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          android學習(簡易音樂播放詳解)

          Posted on 2009-11-04 13:48 瘋狂 閱讀(3194) 評論(2)  編輯  收藏 所屬分類: android
                 學習android階段寫的一個例子,先將代碼和解析貼出來,如有不對,歡迎指示!

               最終界面很簡單:
               
            主要結構:
              activity 和service通過互相通話來保持播放和界面狀態:

             
            代碼主要代碼:MyPlayer.java(界面) ,MusicPlayService(service) ,IntentParam(參數)
            MyPlayer.java:
          package com.myplayer;

          import android.app.Activity;
          import android.app.AlertDialog;
          import android.content.BroadcastReceiver;
          import android.content.Context;
          import android.content.DialogInterface;
          import android.content.Intent;
          import android.content.IntentFilter;
          import android.net.Uri;
          import android.os.Bundle;
          import android.view.View;
          import android.view.View.OnClickListener;
          import android.widget.Button;
          import android.widget.EditText;
          import android.widget.TextView;

          public class MyPlayer extends Activity implements OnClickListener 

              
          // 實現onclickListener的方法
              public void onClick(View v) {
                  
          if (nowPlay == null{
                      
          return;
                  }

                  
          int cmd = 0;
                  Intent intent 
          = new Intent(IntentParam.TO_SERVICE);// 創建意圖,通知service
                  
          // 根據cmd命令控制后臺音樂的播放
                  switch (v.getId()) {
                  
          case R.id.palypause:// 如果點擊了暫停和播放按鈕
                      if (status == IntentParam.STATUS_PLAYING) {// 并且當前狀態時播放,就暫停
                          cmd = IntentParam.CMD_PAUSE;// 暫停命令
                      }
           else if (status == IntentParam.STATUS_STOPPED
                              
          || status == IntentParam.STATUS_PAUSED) {// 并且當前狀態時暫停或停止,就播放
                          intent.setData(nowPlay);// 給意圖添加數據,也就是將音樂uri傳給service
                          cmd = IntentParam.CMD_PLAY;// 播放命令
                      }
           else {
                          cmd 
          = IntentParam.CMD_STOP;
                      }

                      
          break;
                  
          case R.id.stop:
                      cmd 
          = IntentParam.CMD_STOP;// 停止命令
                  default:
                      
          break;
                  }

                  intent.putExtra(
          "cmd", cmd);// 將命令放入意圖
                  sendBroadcast(intent);// 播出意圖

              }


              
          // 廣播接收器接收service傳來的消息 根據service傳來的音樂播放狀態 來跟新界面
              public class UpdateReceiver extends BroadcastReceiver {
                  @Override
                  
          public void onReceive(Context context, Intent intent) {
                      status 
          = intent.getIntExtra("status"-1);// 獲取狀態
                      switch (status) {
                      
          case IntentParam.STATUS_PLAYING:// 播放狀態
                          playpausebn.setText(R.string.pause);// 這里簡單的修改按鈕的文字,
                          break;
                      
          case IntentParam.STATUS_PAUSED:
                      
          case IntentParam.STATUS_STOPPED:
                          playpausebn.setText(R.string.play);
                          
          break;
                      
          default:
                          
          break;
                      }

                  }


              }


          }
          MusicPlayService:
          package com.myplayer;

          import android.app.Service;
          import android.content.BroadcastReceiver;
          import android.content.Context;
          import android.content.Intent;
          import android.content.IntentFilter;
          import android.media.MediaPlayer;
          import android.media.MediaPlayer.OnCompletionListener;
          import android.net.Uri;
          import android.os.IBinder;

          public class MusicPlayService extends Service {
              
          int status;
              MediaPlayer mp;
              OnCompletionListener completionListener;
              CommandReceiver commandReceiver;
              @Override
              
          public IBinder onBind(Intent arg0) {
                  
          // TODO Auto-generated method stub
                  return null;
              }

              
              @Override
              
          public void onCreate() {
                  
          // TODO Auto-generated method stub
                  mp = new MediaPlayer();
                  
          //初始化播放狀態為停止
                  status = IntentParam.STATUS_STOPPED;
                  
          //注冊來自activity傳來的命令接收器
                  commandReceiver  = new CommandReceiver();
                  
          //添加過濾
                  IntentFilter filter1 = new IntentFilter();
                  filter1.addAction(IntentParam.TO_SERVICE);
                  filter1.addDataScheme(
          "http");
                  IntentFilter filter2 
          = new IntentFilter();
                  filter2.addAction(IntentParam.TO_SERVICE);
                  
          //注冊接收器
                  registerReceiver(commandReceiver, filter1);
                  registerReceiver(commandReceiver, filter2);
                  
          //初始化音樂播放完畢的處理事情,通知界面跟新
                  completionListener = new OnCompletionListener(){
                      
          public void onCompletion(MediaPlayer mplayer) {
                          mplayer.stop();
                          status 
          = IntentParam.STATUS_STOPPED;
                          updateUi();
                      }

                  }
          ;
              }


              

              
          //根據初始化狀態 初始化界面 這里可以根據status來控制
              @Override
              
          public void onStart(Intent intent, int startId) {
                 updateUi();
              }

              @Override
              
          public void onDestroy() {
                 
          //釋放資源
                  unregisterReceiver(commandReceiver);
                  mp.release();
              }

              
          //構建接收器
              public class CommandReceiver extends BroadcastReceiver {

                  @Override
                  
          public void onReceive(Context context, Intent intent) {
                      
          switch (intent.getIntExtra("cmd"-1)) {
                      
          case IntentParam.CMD_PLAY://如果界面傳來命令是播放
                          Uri media = intent.getData();//獲取activity傳來的intent里面的數據
                          if (media != null{//如果已經有音樂在播放 就釋放 才行構建
                              mp.release();
                              mp 
          = MediaPlayer.create(context, media);
                              mp.setOnCompletionListener(completionListener);
          //添加播放完畢的處理事件
                              try {
                                  mp.start();
          //開始播放
                              }
           catch (Exception e) {
                                  e.printStackTrace();
                              }

                          }
           else {
                              mp.start();
                          }

                          status 
          = IntentParam.STATUS_PLAYING;
                          
          break;
                      
          case IntentParam.CMD_PAUSE:
                          mp.pause();
                          status 
          = IntentParam.STATUS_PAUSED;
                          
          break;
                      
          case IntentParam.CMD_STOP:
                          mp.stop();
                          status 
          = IntentParam.STATUS_STOPPED;
                          
          break;
                      
          default:
                          
          break;
                      }

                      updateUi();
          //根據當前的狀態 通知界面跟新
                  }


              }

              
          //通知界面根性也就是將意圖發出去讓界面接收
              private void updateUi() {
                  Intent intent 
          = new Intent(IntentParam.TO_ACTIVITY);
                  intent.putExtra(
          "status", status);
                  sendBroadcast(intent);
              }

          }


          IntentParam:
          package com.myplayer;

          public class IntentParam {

              
          public static final int CMD_PLAY = 0;
              
          public static final int CMD_PAUSE = 1;
              
          public static final int CMD_STOP = 2;
              
          public static final int STATUS_PLAYING = 0;
              
          public static final int STATUS_PAUSED = 1;
              
          public static final int STATUS_STOPPED = 2;

              
          public static final String TO_SERVICE = "toService";
              
          public static final String TO_ACTIVITY = "toActivity";
          }

          另外就是AndroidManifest.xml
          <?xml version="1.0" encoding="utf-8"?>
          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                
          package="com.myplayer"
                android:versionCode
          ="1"
                android:versionName
          ="1.0">
              
          <application android:icon="@drawable/icon" android:label="@string/app_name">
                  
          <activity android:name=".MyPlayer"
                            android:label
          ="@string/app_name">
                      
          <intent-filter>
                          
          <action android:name="android.intent.action.MAIN" />
                          
          <category android:name="android.intent.category.LAUNCHER" />
                      
          </intent-filter>
                  
          </activity>
              
          <service android:name="MusicPlayService" android:process=":remote"></service>//添加service
          </application>
              
          <uses-sdk android:minSdkVersion="4" />
          <uses-permission android:name="android.permission.INTERNET"></uses-permission>//添加權限
          </manifest> 

          完整代碼下載:(暈,不知道這里什么地方可以放代碼下載!!!)
          放到google上不知道能不能下載:
          http://infojj.googlegroups.com/web/myplayer.rar?hl=zh-CN&gda=OQGoLz8AAABJFYDHK64yE3Lf8rmWTTkKKuZHDK1BZ-D4nJlRz2lseLjh9f496UMDItX0DkmsAJ2ccyFKn-rNKC-d1pM_IdV0&gsc=ccLByiEAAAAyTazefkXbIBkLj9dbvmKyYyEKXZEdBEdpC0MvbzBM00zfKN-m9S9niuHrq-IEXAE
           

          評論

          # re: android學習(簡易音樂播放詳解)  回復  更多評論   

          2009-11-04 15:02 by 咖啡妝
          不知道有這方面的高手沒共同學習下!

          # re: android學習(簡易音樂播放詳解)  回復  更多評論   

          2010-04-29 10:56 by aprode
          請問一下那個IntentParam應該放在哪里?
          主站蜘蛛池模板: 浑源县| 垫江县| 德令哈市| 兰溪市| 巴林右旗| 聂拉木县| 尤溪县| 浦县| 布尔津县| 临西县| 十堰市| 潜江市| 贵定县| 长子县| 正镶白旗| 太仆寺旗| 旺苍县| 盐源县| 福贡县| 田东县| 奉新县| 清徐县| 吴堡县| 巴青县| 莱西市| 黄大仙区| 永靖县| 惠安县| 富民县| 呼和浩特市| 西贡区| 湖口县| 沙坪坝区| 定西市| 广宗县| 建德市| 高密市| 德兴市| 大丰市| 苏尼特左旗| 沁阳市|