MediaPlayer 实现自选音乐作为消息提示音
来源:互联网 发布:斯伦贝谢软件研发中心 编辑:程序博客网 时间:2024/05/18 14:46
需求:用户自选音乐作为消息推送的提示音。
解决思路:
- 获得用户手机里音乐列表,用户选择后,存入 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;@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
- MediaPlayer 实现自选音乐作为消息提示音
- mediaplayer实现音乐播放
- MediaPlayer实现带播放条的音乐播放和视频播放,可以作为程序参考
- Android MediaPlayer实现音乐播放
- MediaPlayer+MediaPlayerController+MediaPlayer.OnBufferingUpdateListener实现音乐播放器
- android如何长时间音乐播放实现MediaPlayer
- android如何长时间音乐播放实现MediaPlayer
- Android音乐播放器 -- MediaPlayer Service实现
- android MediaPlayer实现简单的音乐播放
- Android实现简单音乐播放器(MediaPlayer)
- Android实现简单音乐播放器(MediaPlayer)
- 播放音乐提示音
- Android之MediaPlayer播放音乐并实现进度条实例
- 【Android开发学习04】长时间的音乐播放实现MediaPlayer
- 本地MediaPlayer音乐播放器与歌词同步的实现
- Android之MediaPlayer播放音乐并实现进度条实例
- android开发---9.MediaPlayer实现音乐播放的demo
- Android MediaPlayer实现音乐播放一--简单播放
- 字符串操作之string.h
- 【LeetCode】path-sum i&ii
- 解决php 文件下载 IE 文件名中文乱码
- 数据结构与算法有用的知识链接-----不断更新
- 数据结构之栈模板实现(3)
- MediaPlayer 实现自选音乐作为消息提示音
- JS算法(获取斐波那契数列的前n项)
- 基于DragonBoard 410c的智能门铃系列一之系统总构架
- ubuntu16.04安装cuda8和opencv3.2
- DES加密算法工具类
- Spring EmptyResultDataAccessException异常的源码分析和解决方法
- 带返回值的Python多线程方法
- [leetcode: Python]122. Best Time to Buy and Sell Stock 2
- 验证java执行了默认初始化