zoukankan      html  css  js  c++  java
  • 移动开发音乐播放器

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/cover"
            android:layout_width="match_parent"
            android:layout_height="600dp"
            android:layout_weight="1"
            android:src="@drawable/composer" />
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_weight="1">
    
            <TextView
                android:id="@+id/title"
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:layout_weight="1"
                android:ellipsize="marquee"
                android:marqueeRepeatLimit="marquee_forever"
                android:text="歌曲名"
                android:gravity="center"
                android:textColor="#000000"
                android:textSize="30dp" />
    
            <TextView
                android:id="@+id/author"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:text="艺术家"
                android:textSize="20dp" />
        </LinearLayout>
    
    
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:gravity="center"
            android:layout_marginBottom="10dp">
            <ImageButton
                android:id="@+id/pre"
                android:layout_width="wrap_content"
    
                android:layout_height="wrap_content"
                android:src="@drawable/pre"
                android:background="#FFFFFF"/>
            <ImageButton
                android:id="@+id/play"
                android:layout_width="wrap_content"
    
                android:layout_height="wrap_content"
                android:src="@drawable/play"
                android:background="#FFFFFF"/>
            <ImageButton
                android:id="@+id/next"
                android:layout_width="wrap_content"
    
                android:layout_height="wrap_content"
                android:src="@drawable/next"
                android:background="#FFFFFF"/>
            <ImageButton
                android:id="@+id/stop"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:src="@drawable/stop"
                android:background="#FFFFFF"/>
        </LinearLayout>
    </LinearLayout>

    music类:

    package com.example.mymusicbox;
    
    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.res.AssetFileDescriptor;
    import android.content.res.AssetManager;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.os.IBinder;
    
    import java.io.IOException;
    
    public class MusicService extends Service
    {
        MyReceiver serviceReceiver;
        AssetManager am;
        String[] musics = new String[] { "composer.mp3" +
                "", "bridge.mp3",
                "graininear.mp3" };
        MediaPlayer mPlayer;
        // 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停
        int status = 0x11;
        // 记录当前正在播放的音乐
        int current = 0;
        @Override
        public IBinder onBind(Intent intent)
        {
            return null;
        }
        @Override
        public void onCreate()
        {
            super.onCreate();
            am = getAssets();
            // 创建BroadcastReceiver
            serviceReceiver = new MyReceiver();
            // 创建IntentFilter
            IntentFilter filter = new IntentFilter();
            filter.addAction(MainActivity.CTL_ACTION);
            registerReceiver(serviceReceiver, filter);
            // 创建MediaPlayer
            mPlayer = new MediaPlayer();
            // 为MediaPlayer播放完成事件绑定监听器
            mPlayer.setOnCompletionListener(new OnCompletionListener() //
            {
                @Override
                public void onCompletion(MediaPlayer mp)
                {
                    current++;
                    if (current >= 3)
                    {
                        current = 0;
                    }
                    //发送广播通知Activity更改文本框
                    Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
                    sendIntent.putExtra("current", current);
                    // 发送广播,将被Activity组件中的BroadcastReceiver接收到
                    sendBroadcast(sendIntent);
                    // 准备并播放音乐
                    prepareAndPlay(musics[current]);
                }
            });
        }
        public class MyReceiver extends BroadcastReceiver
        {
            @Override
            public void onReceive(final Context context, Intent intent)
            {
                int control = intent.getIntExtra("control", -1);
                switch (control)
                {
                    // 播放或暂停
                    case 1:
                        // 原来处于没有播放状态
                        if (status == 0x11)
                        {
                            // 准备并播放音乐
                            prepareAndPlay(musics[current]);
                            status = 0x12;
                        }
                        // 原来处于播放状态
                        else if (status == 0x12)
                        {
                            // 暂停
                            mPlayer.pause();
                            // 改变为暂停状态
                            status = 0x13;
                        }
                        // 原来处于暂停状态
                        else if (status == 0x13)
                        {
                            // 播放
                            mPlayer.start();
                            // 改变状态
                            status = 0x12;
                        }
                        break;
                    // 停止声音
                    case 2:
                        // 如果原来正在播放或暂停
                        if (status == 0x12 || status == 0x13)
                        {
                            // 停止播放
                            mPlayer.stop();
                            status = 0x11;
                        }
                    case 3:
                        current--;
                        if(current < 0)
                            current = 0;
                        prepareAndPlay(musics[current]);
                    case 4:
                        current++;
                        if(current > musics.length-1)
                            current = 0;
                        prepareAndPlay(musics[current]);
                }
                // 广播通知Activity更改图标、文本框
                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
                sendIntent.putExtra("update", status);
                sendIntent.putExtra("current", current);
                // 发送广播,将被Activity组件中的BroadcastReceiver接收到
                sendBroadcast(sendIntent);
            }
        }
        private void prepareAndPlay(String music)
        {
            try
            {
                // 打开指定音乐文件
                AssetFileDescriptor afd = am.openFd(music);
                mPlayer.reset();
                // 使用MediaPlayer加载指定的声音文件。
                mPlayer.setDataSource(afd.getFileDescriptor(),
                        afd.getStartOffset(), afd.getLength());
                // 准备声音
                mPlayer.prepare();
                // 播放
                mPlayer.start();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.mymusicbox">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service android:name=".MusicService">
            </service>
        </application>
    
    </manifest>

    MainActivity.java:

    package com.example.mymusicbox;
    import android.support.v4.app.*;
    import android.os.Bundle;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class MainActivity extends Activity implements OnClickListener
    {
        // 获取界面中显示歌曲标题、作者文本框
        TextView title, author;
        // 播放/暂停、停止按钮
        ImageButton play, stop;
        // 上一首,下一首按钮
        ImageButton pre, next;
        // 获取封面
        ImageView cover;
    
        ActivityReceiver activityReceiver;
    
        public static final String CTL_ACTION =
                "org.crazyit.action.CTL_ACTION";
        public static final String UPDATE_ACTION =
                "org.crazyit.action.UPDATE_ACTION";
        // 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停
        int status = 0x11;
        String[] titleStrs = new String[] { "作曲家", "木桥小谣", "芒种" };
        String[] authorStrs = new String[] { "李荣浩", "王梓钰", "赵方婧" };
        Integer[] covers = new Integer[] { R.drawable.composer, R.drawable.bridge, R.drawable.graininear};
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 获取程序界面界面中的两个按钮
            play = (ImageButton) this.findViewById(R.id.play);
            stop = (ImageButton) this.findViewById(R.id.stop);
            title = (TextView) findViewById(R.id.title);
            author = (TextView) findViewById(R.id.author);
            cover = findViewById(R.id.cover);
            pre = this.findViewById(R.id.pre);
            next = this.findViewById(R.id.next);
    
            // 为两个按钮的单击事件添加监听器
            play.setOnClickListener(this);
            stop.setOnClickListener(this);
            // 为上一首、下一首的单击事件添加监听器
            pre.setOnClickListener(this);
            next.setOnClickListener(this);
    
            activityReceiver = new ActivityReceiver();
            // 创建IntentFilter
            IntentFilter filter = new IntentFilter();
            // 指定BroadcastReceiver监听的Action
            filter.addAction(UPDATE_ACTION);
            // 注册BroadcastReceiver
            registerReceiver(activityReceiver, filter);
    
            Intent intent = new Intent(this, MusicService.class);
            // 启动后台Service
            startService(intent);
        }
        // 自定义的BroadcastReceiver,负责监听从Service传回来的广播
        public class ActivityReceiver extends BroadcastReceiver
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                // 获取Intent中的update消息,update代表播放状态
                int update = intent.getIntExtra("update", -1);
                // 获取Intent中的current消息,current代表当前正在播放的歌曲
                int current = intent.getIntExtra("current", -1);
                if (current >= 0)
                {
                    title.setText(titleStrs[current]);
                    author.setText(authorStrs[current]);
                    cover.setImageResource(covers[current]);
                }
                switch (update)
                {
                    case 0x11:
                        play.setImageResource(R.drawable.play);
                        status = 0x11;
                        break;
                    // 控制系统进入播放状态
                    case 0x12:
                        // 播放状态下设置使用暂停图标
                        play.setImageResource(R.drawable.pause);
                        // 设置当前状态
                        status = 0x12;
                        break;
                    // 控制系统进入暂停状态
                    case 0x13:
                        // 暂停状态下设置使用播放图标
                        play.setImageResource(R.drawable.play);
                        // 设置当前状态
                        status = 0x13;
                        break;
                }
            }
        }
        @Override
        public void onClick(View source)
        {
            // 创建Intent
            Intent intent = new Intent("org.crazyit.action.CTL_ACTION");
            switch (source.getId())
            {
                // 按下播放/暂停按钮
                case R.id.play:
                    intent.putExtra("control", 1);
                    break;
                // 按下停止按钮
                case R.id.stop:
                    intent.putExtra("control", 2);
                    break;
                case R.id.pre:
                    intent.putExtra("control",3);
                case R.id.next:
                    intent.putExtra("control",4);
            }
            // 发送广播,将被Service组件中的BroadcastReceiver接收到
            sendBroadcast(intent);
        }
    }

    码云地址:https://gitee.com/zhcay/mobile_job_3
  • 相关阅读:
    go函数
    Linux 查看磁盘容量、查找大文件、查找大目录
    五分钟理解一致性哈希算法(consistent hashing)
    使用Java实现三个线程交替打印0-74
    Python实现IOC控制反转
    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数
    Yandex Big Data Essentials Week1 Scaling Distributed File System
    Yandex Big Data Essentials Week1 Unix Command Line Interface Processes managing
    Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration
    Yandex Big Data Essentials Week1 Unix Command Line Interface File System exploration
  • 原文地址:https://www.cnblogs.com/mryx/p/12729236.html
Copyright © 2011-2022 走看看