<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
           學(xué)習(xí)android階段寫的一個(gè)例子,先將代碼和解析貼出來(lái),如有不對(duì),歡迎指示!

         最終界面很簡(jiǎn)單:
         
      主要結(jié)構(gòu):
        activity 和service通過(guò)互相通話來(lái)保持播放和界面狀態(tài):

       
      代碼主要代碼:MyPlayer.java(界面) ,MusicPlayService(service) ,IntentParam(參數(shù))
      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 

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

            
    int cmd = 0;
            Intent intent 
    = new Intent(IntentParam.TO_SERVICE);// 創(chuàng)建意圖,通知service
            
    // 根據(jù)cmd命令控制后臺(tái)音樂(lè)的播放
            switch (v.getId()) {
            
    case R.id.palypause:// 如果點(diǎn)擊了暫停和播放按鈕
                if (status == IntentParam.STATUS_PLAYING) {// 并且當(dāng)前狀態(tài)時(shí)播放,就暫停
                    cmd = IntentParam.CMD_PAUSE;// 暫停命令
                }
     else if (status == IntentParam.STATUS_STOPPED
                        
    || status == IntentParam.STATUS_PAUSED) {// 并且當(dāng)前狀態(tài)時(shí)暫停或停止,就播放
                    intent.setData(nowPlay);// 給意圖添加數(shù)據(jù),也就是將音樂(lè)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傳來(lái)的消息 根據(jù)service傳來(lái)的音樂(lè)播放狀態(tài) 來(lái)跟新界面
        public class UpdateReceiver extends BroadcastReceiver {
            @Override
            
    public void onReceive(Context context, Intent intent) {
                status 
    = intent.getIntExtra("status"-1);// 獲取狀態(tài)
                switch (status) {
                
    case IntentParam.STATUS_PLAYING:// 播放狀態(tài)
                    playpausebn.setText(R.string.pause);// 這里簡(jiǎn)單的修改按鈕的文字,
                    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();
            
    //初始化播放狀態(tài)為停止
            status = IntentParam.STATUS_STOPPED;
            
    //注冊(cè)來(lái)自activity傳來(lái)的命令接收器
            commandReceiver  = new CommandReceiver();
            
    //添加過(guò)濾
            IntentFilter filter1 = new IntentFilter();
            filter1.addAction(IntentParam.TO_SERVICE);
            filter1.addDataScheme(
    "http");
            IntentFilter filter2 
    = new IntentFilter();
            filter2.addAction(IntentParam.TO_SERVICE);
            
    //注冊(cè)接收器
            registerReceiver(commandReceiver, filter1);
            registerReceiver(commandReceiver, filter2);
            
    //初始化音樂(lè)播放完畢的處理事情,通知界面跟新
            completionListener = new OnCompletionListener(){
                
    public void onCompletion(MediaPlayer mplayer) {
                    mplayer.stop();
                    status 
    = IntentParam.STATUS_STOPPED;
                    updateUi();
                }

            }
    ;
        }


        

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

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

        
    //構(gòu)建接收器
        public class CommandReceiver extends BroadcastReceiver {

            @Override
            
    public void onReceive(Context context, Intent intent) {
                
    switch (intent.getIntExtra("cmd"-1)) {
                
    case IntentParam.CMD_PLAY://如果界面?zhèn)鱽?lái)命令是播放
                    Uri media = intent.getData();//獲取activity傳來(lái)的intent里面的數(shù)據(jù)
                    if (media != null{//如果已經(jīng)有音樂(lè)在播放 就釋放 才行構(gòu)建
                        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();
    //根據(jù)當(dāng)前的狀態(tài) 通知界面跟新
            }


        }

        
    //通知界面根性也就是將意圖發(fā)出去讓界面接收
        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>//添加權(quán)限
    </manifest> 

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

    評(píng)論

    # re: android學(xué)習(xí)(簡(jiǎn)易音樂(lè)播放詳解)  回復(fù)  更多評(píng)論   

    2009-11-04 15:02 by 咖啡妝
    不知道有這方面的高手沒(méi)共同學(xué)習(xí)下!

    # re: android學(xué)習(xí)(簡(jiǎn)易音樂(lè)播放詳解)  回復(fù)  更多評(píng)論   

    2010-04-29 10:56 by aprode
    請(qǐng)問(wèn)一下那個(gè)IntentParam應(yīng)該放在哪里?
    主站蜘蛛池模板: 免费一区二区三区在线视频| 无遮挡国产高潮视频免费观看| 特级一级毛片免费看| 亚洲日韩乱码中文字幕| 亚洲色中文字幕在线播放| 久久久久久国产a免费观看不卡| 亚洲一级免费视频| av无码东京热亚洲男人的天堂| 亚洲一级二级三级不卡| 理论片在线观看免费| 最近免费中文字幕mv电影| 午夜亚洲国产成人不卡在线| 激情内射亚洲一区二区三区| 午夜亚洲乱码伦小说区69堂| 91免费国产自产地址入| 亚洲午夜无码AV毛片久久| 亚洲五月综合网色九月色| a级午夜毛片免费一区二区| 日韩一级免费视频| 久久av无码专区亚洲av桃花岛| 色一情一乱一伦一视频免费看| 亚洲电影在线免费观看| 国产亚洲精品资在线| 欧洲 亚洲 国产图片综合| 免费在线中文日本| 亚洲AV无码之日韩精品| 亚洲中文无码mv| 久久国产乱子伦免费精品| 亚洲人成网77777亚洲色| MM1313亚洲精品无码久久| 69天堂人成无码麻豆免费视频| 亚洲午夜久久久久妓女影院| 亚洲国产成人久久精品大牛影视| 最近2019免费中文字幕视频三| 亚洲无码高清在线观看| 亚洲爆乳无码专区www| 美女视频黄免费亚洲| 亚洲精品天天影视综合网| xxxxx做受大片在线观看免费| 永久免费av无码网站大全| 亚洲人成激情在线播放|