<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

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

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

    Posted on 2009-11-04 13:48 瘋狂 閱讀(3188) 評論(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應該放在哪里?
    主站蜘蛛池模板: 国产在线观看免费观看不卡| 成全视频高清免费观看电视剧| 222www免费视频| 国产亚洲真人做受在线观看| 一级毛片免费在线| 久久亚洲中文字幕精品一区四| 天堂亚洲免费视频| 亚洲?v无码国产在丝袜线观看 | 亚洲最大在线观看| 久久久久av无码免费网| 亚洲免费福利视频| 日本特黄特黄刺激大片免费| 日本系列1页亚洲系列| 亚洲国产综合精品中文字幕| 九九久久国产精品免费热6| 亚洲精品色午夜无码专区日韩| a毛片免费在线观看| 亚洲精品综合久久中文字幕| 手机在线免费视频| 全部一级一级毛片免费看| 亚洲日韩欧洲无码av夜夜摸| 久久99精品视免费看| 亚洲色图激情文学| 亚洲国产成人久久综合碰| 国产真人无码作爱视频免费| 亚洲国产综合在线| 又粗又硬又黄又爽的免费视频| 99麻豆久久久国产精品免费| 亚洲第一成年网站大全亚洲| 日本人护士免费xxxx视频| 中文字幕a∨在线乱码免费看| 亚洲无砖砖区免费| 亚洲精品成a人在线观看| 四虎国产成人永久精品免费| 亚洲日韩精品无码专区加勒比☆| 亚洲一本大道无码av天堂| 亚洲电影免费观看| 老司机精品视频免费| 91情国产l精品国产亚洲区| 波多野结衣久久高清免费 | 久久成人18免费网站|