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

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

解决思路:

  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;
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    System.out.println("onCreate");
    super.onCreate();
}

@Override
public 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);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    System.out.println("onStartCommand");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值