需求:用户自选音乐作为消息推送的提示音。
解决思路:
- 获得用户手机里音乐列表,用户选择后,存入 path
- 消息到达后,播放音乐
- 点击消息后,停止播放
伪代码:
- 建个 listview,contentProvider 取音乐数据,用户点击,存入 SharedPreferences
- 建个播放音乐的 service
- 消息来了,播放
- 点击消息,停止
碰见的问题:播放时没声音,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" />