安卓环境下PHP自动播放音乐,android实现音乐播放器

需求描述: 拥有播放,暂停,重新播放和停止等功能。 并且随着音乐的进度,进图条会自动更新。手动拖动进度条也会更新音乐的进度。

效果展示

fc50906ac90446973fd47bb61f08262f.gif

示例代码

MainActivity

package com.example.www.musicdemo;

import android.Manifest;

import android.content.ComponentName;

import android.content.Intent;

import android.content.ServiceConnection;

import android.media.MediaPlayer;

import android.os.Handler;

import android.os.IBinder;

import android.os.Message;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.SeekBar;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

private Iservice mIservice;

private static SeekBar mSeekBar;

public static Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

//获取我们携带的数据

Bundle data = msg.getData();

//获取歌曲的总时长 和 当前进度

int duration = data.getInt("duration");

int currentPosition = data.getInt("currentPosition");

mSeekBar.setMax(duration);

mSeekBar.setProgress(currentPosition);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// requestPermissions(new String[]{Manifest.permission.INTERNET}, 100);

mSeekBar = (SeekBar) findViewById(R.id.seekBar);

Intent intent = new Intent(this, MyService.class);

startService(intent);

bindService(intent, conn, BIND_AUTO_CREATE);

// 设置seekbar的拖动时间监听

mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

mIservice.callSeekTo(seekBar.getProgress());

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

}

});

}

public void playmusic(View view) {

mIservice.callPlayMusic();

}

public void onPause(View view) {

mIservice.callPauseMusic();

}

public void stopMusci(View view) {

mIservice.stopMusic();

}

public void replaymusic(View view) {

mIservice.callRePlayMusic();

}

ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

mIservice = (Iservice) service;

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

};

@Override

protected void onDestroy() {

unbindService(conn);

super.onDestroy();

}

}

MyService

package com.example.www.musicdemo;

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.Binder;

import android.os.Bundle;

import android.os.IBinder;

import android.os.Message;

import java.util.Timer;

import java.util.TimerTask;

public class MyService extends Service {

private MediaPlayer mMp;

public MyService() {

}

@Override

public IBinder onBind(Intent intent) {

// TODO: Return the communication channel to the service.

return new MyBinder();

}

@Override

public void onCreate() {

mMp = new MediaPlayer();

super.onCreate();

}

@Override

public void onDestroy() {

super.onDestroy();

}

public void playMusic(){

try {

mMp.setDataSource("/resource/n1/77/39/2163816420.mp3");

mMp.prepare();

mMp.start();

updateSeekBar();

} catch (Exception e) {

e.printStackTrace();

}

}

public void pauseMusic(){

mMp.pause();

}

public void stopMusic(){

mMp.stop();

}

public void updateSeekBar(){

final int duration = mMp.getDuration();

final Timer timer = new Timer();

final TimerTask timerTask = new TimerTask() {

@Override

public void run() {

int currentPosition = mMp.getCurrentPosition();

Message msg = Message.obtain();

Bundle bundle = new Bundle(); // map

bundle.putInt("duration", duration);

bundle.putInt("currentPosition", currentPosition);

msg.setData(bundle);

MainActivity.mHandler.sendMessage(msg);

}

};

timer.schedule(timerTask, 100, 1000);

// 监听音乐播放完毕

mMp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

System.out.println("歌曲播放完成了");

timer.cancel();

timerTask.cancel();

}

});

}

//实现指定播放的位置

public void seekTo(int position){

mMp.seekTo(position);

}

private class MyBinder extends Binder implements Iservice{

@Override

public void callPlayMusic() {

playMusic();

}

@Override

public void callPauseMusic() {

pauseMusic();

}

@Override

public void callRePlayMusic() {

mMp.start();

}

@Override

public void stopMusic() {

MyService.this.stopMusic();

}

@Override

public void callSeekTo(int position) {

seekTo(position);

}

}

}

Iservice

package com.example.www.musicdemo;

/**

* @author Administrator

* @name mutilMedia

* @class name:com.example.www.musicdemo

* @class describe

* @time 2019/4/8 11:23

* @change

* @chang time

* @class describe

*/

public interface Iservice {

//把想暴露的方法都定义在接口中

public void callPlayMusic();

public void callPauseMusic();

public void callRePlayMusic();

public void stopMusic();

public void callSeekTo(int position);

}

activity_main.xml

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:onClick="playmusic"

android:text="播放"

app:layout_constraintEnd_toStartOf="@+id/button2"

app:layout_constraintHorizontal_bias="0.5"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent" />

android:id="@+id/button2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="暂停"

app:layout_constraintEnd_toStartOf="@+id/button3"

app:layout_constraintHorizontal_bias="0.5"

app:layout_constraintStart_toEndOf="@+id/button"

app:layout_constraintTop_toTopOf="@+id/button"

android:onClick="onPause"/>

android:id="@+id/button3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="重新播放"

app:layout_constraintEnd_toStartOf="@+id/button4"

app:layout_constraintHorizontal_bias="0.5"

app:layout_constraintStart_toEndOf="@+id/button2"

app:layout_constraintTop_toTopOf="@+id/button2"

android:onClick="replaymusic"/>

android:id="@+id/button4"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="停止播放"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.5"

app:layout_constraintStart_toEndOf="@+id/button3"

app:layout_constraintTop_toTopOf="@+id/button3"

android:onClick="stopMusci"/>

android:id="@+id/seekBar"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginStart="8dp"

android:layout_marginTop="32dp"

android:layout_marginEnd="8dp"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="1.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/button2" />

AndroidManifest.xml

package="com.example.www.musicdemo">

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">

android:name=".MyService"

android:enabled="true"

android:exported="true">

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值