MediaPlayer 实现自选音乐作为消息提示音

来源:互联网 发布:斯伦贝谢软件研发中心 编辑:程序博客网 时间:2024/05/18 14:46

需求:用户自选音乐作为消息推送的提示音。

解决思路:

  1. 获得用户手机里音乐列表,用户选择后,存入 path
  2. 消息到达后,播放音乐
  3. 点击消息后,停止播放

伪代码:

  1. 建个 listview,contentProvider 取音乐数据,用户点击,存入 SharedPreferences
  2. 建个播放音乐的 service
  3. 消息来了,播放
  4. 点击消息,停止

碰见的问题:播放时没声音,logcat 提示:

android MediaPlayer-JNI QCMediaPlayer mediaplayer NOT present
Couldn’t open file on client side, trying server side
Should have subtitle controller already set

调试一下午,找了各种网站,又试了 soundPoor 结果发现。。。老子手机是静音模式。 笑cry,我都想给我一电炮 哈哈哈

上代码:

音乐bean文件:

public class Song {/** * 歌手 */ public String singer; /** * 歌曲名 */ public String song; /** * 歌曲的地址 */public String path; /** * 歌曲长度 */ public int duration; /** * 歌曲的大小 */ public long size;public String getSinger() {    return singer;}public void setSinger(String singer) {    this.singer = singer;}public String getSong() {    return song;}public void setSong(String song) {    this.song = song;}public String getPath() {    return path;}public void setPath(String path) {    this.path = path;}public int getDuration() {    return duration;}public void setDuration(int duration) {    this.duration = duration;}public long getSize() {    return size;}public void setSize(long size) {    this.size = size;} }

取音乐信息的工具类:

import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.provider.MediaStore;/** * 音乐工具类, */public class MusicUtils {/** * 扫描系统里面的音频文件,返回一个list集合 */public static List<Song> getMusicData(Context context) {    List<Song> list = new ArrayList<Song>();    // 媒体库查询语句(写一个工具类MusicUtils)    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,            null, MediaStore.Audio.AudioColumns.IS_MUSIC);    if (cursor != null) {        while (cursor.moveToNext()) {            Song song = new Song();            song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));            song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));            song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));            song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));            song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));            if (song.size > 1000 * 800) {                // 注释部分是切割标题,分离出歌曲名和歌手 (本地媒体库读取的歌曲信息不规范)                if (song.song.contains("-")) {                    String[] str = song.song.split("-");                    song.singer = str[0];                    song.song = str[1];                }                list.add(song);            }        }        // 释放资源        cursor.close();    }    return list;}/** * 定义一个方法用来格式化获取到的时间 */public static String formatTime(int time) {    if (time / 1000 % 60 < 10) {        return time / 1000 / 60 + ":0" + time / 1000 % 60;    } else {        return time / 1000 / 60 + ":" + time / 1000 % 60;    }}}

listview 和 adapter 比较简单就不写了

service:

package com.unicom.eom.rm.mobileterminal.platform.activity.personinfo;import com.unicom.eom.rm.mobileterminal.platform.R;import android.app.Service;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.net.Uri;import android.os.IBinder;import android.util.Log;public class MusciService extends Service {MediaPlayer mediaPlayer;@Overridepublic IBinder onBind(Intent intent) {    return null;}@Overridepublic void onCreate() {    System.out.println("onCreate");    super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {    System.out.println("onStart");             int musicid=0;             SharedPreferences sp = this.getSharedPreferences("user",Context.MODE_PRIVATE);             String path=sp.getString("alarmMusicPath","");             if(path.equals("")){                musicid=R.raw.police;                mediaPlayer = MediaPlayer.create(this, musicid);             }else{                mediaPlayer = MediaPlayer.create(this, Uri.parse(path));             }            mediaPlayer.setVolume(1.0f, 1.0f);            mediaPlayer.setLooping(false);            mediaPlayer.start();            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {                          @Override                           public void onCompletion(MediaPlayer mp) {                               // 在播放完毕被回调                             if (mediaPlayer != null ) {                                         mediaPlayer.stop();                                         mediaPlayer.release();                                         mediaPlayer = null;                             }                           }                      });            Log.e("whileReceive", "whileReceive  start");    super.onStart(intent, startId);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {    System.out.println("onStartCommand");    return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {    System.out.println("onDestroy");    Log.e("whileReceive", "whileReceive  end");    if (mediaPlayer != null ) {         mediaPlayer.stop();         mediaPlayer.release();         mediaPlayer = null;    }    super.onDestroy();}}

stopservice:

Intent intent = new Intent(getApplicationContext(),MusciService.class);stopService(intent);

startservice:

Intent intent = new Intent(context.getApplicationContext(),MusciService.class);    context.getApplicationContext().startService(intent);

权限:

<service android:name="com.unicom.eom.rm.mobileterminal.platform.activity.personinfo.MusciService" android:priority="1000"></service><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
1 0