<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應該放在哪里?
    主站蜘蛛池模板: 亚洲精品伊人久久久久| 亚洲福利电影一区二区?| 日日摸日日碰夜夜爽亚洲| 在线播放免费播放av片| 亚洲精品蜜夜内射| 国产无遮挡色视频免费视频 | 国产aⅴ无码专区亚洲av| 久久国产精品免费一区| 亚洲一区AV无码少妇电影☆| a级黄色毛片免费播放视频| 亚洲AV人无码综合在线观看| 100部毛片免费全部播放完整| 亚洲成a人片在线观看中文!!!| 国产v精品成人免费视频400条| 亚洲精品无码mⅴ在线观看| 日本免费中文字幕在线看| 美女裸免费观看网站| 中文字幕久久亚洲一区| 日韩精品极品视频在线观看免费| 亚洲国产精品成人综合久久久| 成人毛片免费网站| 国产va免费观看| 久久久久久亚洲Av无码精品专口| 成**人免费一级毛片| 一级毛片不卡免费看老司机| 亚洲成a人片77777老司机| 69成人免费视频无码专区| 无码人妻一区二区三区免费视频| 亚洲国产一区国产亚洲| 天天看片天天爽_免费播放| GOGOGO免费观看国语| 亚洲人成电影在线观看网| 日韩精品亚洲专区在线观看| 久草免费福利视频| 亚洲乱码日产精品一二三| 亚洲欧洲日产国码无码久久99| 两性刺激生活片免费视频| 人成午夜免费大片在线观看| 久久久久亚洲AV成人片| 亚洲国产天堂久久久久久| 老司机在线免费视频|