• 移动开发音乐播放器


    布局文件:

    <?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
  • 相关阅读:
    POJ 3694 Network (求桥,边双连通分支缩点,lca)
    UVA 796
    UVA 315 315
    POJ 1236 Network of Schools (有向图的强连通分量)
    【转】有向图强连通分量的Tarjan算法
    HDU 3072 Intelligence System (强连通分量)
    【转】强大的vim配置文件,让编程更随意
    WORDPRESS登录后台半天都无法访问或者是访问慢的解决方法
    phpstorm+Xdebug断点调试PHP
    PHP性能调优---PHP调试工具Xdebug安装配置教程
  • 原文地址:https://www.cnblogs.com/mryx/p/12729236.html
Copyright © 2020-2023  润新知