java 停止线程播放音频_Notification 播放 关闭 声音----转载

NotificationPlayer.java

定义一个播放Notification声音的player,本质上仍然是一个MediaPlayer,这个是多线程编程的很好的例子

public class NotificationPlayer implements OnCompletionListener {

//发送播放和停止的cmd

private static final int PLAY = 1;

private static final int STOP = 2;

//对于多线程处理来说,这个class用来线程之间传递数据

private static final class Command {

int code;

Context context;

Uri uri;

boolean looping;

int stream;

long requestTime;

public String toString() {

return "{ code=" + code + " looping=" + looping + " stream=" + stream

+ " uri=" + uri + " }";

}

}

//播放类构造函数

public NotificationPlayer(String tag) {

if (tag != null) {

mTag = tag;

} else {

mTag = "NotificationPlayer";

}

}

public void play(Context context, Uri uri, boolean looping, int stream) {

//创建用于进程之间传递数据的类。前面说的那个中间class

Command cmd = new Command();

//初始化信息

cmd.requestTime = SystemClock.uptimeMillis();

cmd.code = PLAY;

cmd.context = context;

cmd.uri = uri;

cmd.looping = looping;

cmd.stream = stream;

synchronized (mCmdQueue) {

//开始另外一个线程,用来解析用户设置cmd,然后才决定是play还是stop

enqueueLocked(cmd);

mState = PLAY;

}

}

//这表明CmdThread就是一个thread

private final class CmdThread extends java.lang.Thread {

CmdThread() {

super("NotificationPlayer-" + mTag);

}

public void run() {

while (true) {

Command cmd = null;

synchronized (mCmdQueue) {

//这一步很巧妙,直接用队列中删除返回删除数据的引用来获取刚才在play中设置的信息

cmd = mCmdQueue.removeFirst();

}

switch (cmd.code) {

case PLAY:

startSound(cmd);

break;

//主要是用户发出停止的命令的操作--非正常播放结束stop

case STOP:

……

//强制停止要释放focus

mAudioManager.abandonAudioFocus(null);

break;

}

//处理之后要释放wakelock

synchronized (mCmdQueue) {

if (mCmdQueue.size() == 0) {

mThread = null;

releaseWakeLock();

return;

}

}

}

}

}//end ofCmdThread

private void startSound(Command cmd) {

try {

if((mLooper != null)

&& (mLooper.getThread().getState() != Thread.State.TERMINATED)) {

mLooper.quit();

}

mCompletionThread = new CreationAndCompletionThread(cmd);

//开启播放线程

synchronized(mCompletionThread) {

mCompletionThread.start();

mCompletionThread.wait();

}

}

}

private final class CreationAndCompletionThread extends Thread {

public Command mCmd;

public CreationAndCompletionThread(Command cmd) {

super();

mCmd = cmd;

}

public void run() {

try {

//设置播放信息,并开始播放

MediaPlayer player = new MediaPlayer();

player.setAudioStreamType(mCmd.stream);

player.setDataSource(mCmd.context, mCmd.uri);

player.setLooping(mCmd.looping);

player.prepare();

if ((mCmd.uri != null) && (mCmd.uri.getEncodedPath() != null)

&& (mCmd.uri.getEncodedPath().length() > 0)) {

if (mCmd.looping) {

audioManager.requestAudioFocus(null, mCmd.stream,

AudioManager.AUDIOFOCUS_GAIN);

} else {

audioManager.requestAudioFocus(null, mCmd.stream,

AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);

}

}

//这一步是必须的,要释放focus

player.setOnCompletionListener(NotificationPlayer.this);

player.start();

}

}

}

public void onCompletion(MediaPlayer mp) {

if (mAudioManager != null) {

mAudioManager.abandonAudioFocus(null);

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java main是标识符吗_main方法的认识 、通配符、java的注释、java的符(标识符)【Java基础】...

main方法的认识print()和println()的区别print()打印不换行println()打印并换行通配符\n换行符\t制表符都应用于控制台\n换行\t以表格的形式显示System.out.println("----------英雄排行榜------------");System.out.println("\t|编号\t|名字\t|战力值\t|"…

对于半圆形的点击区域该怎么做_十堰混合型塑胶跑道怎么选,橡胶跑道卷材型号...

河北迈弘体育设施有限公司为您详细解读hVgkXc十堰混合型塑胶跑道怎么选的相关知识与详情,校园跑道、体育馆田径跑道等都是体育活动的首先场合。由于终年正在室外遭到风吹日晒,还要接受日常体育活动的摩擦、描写、化学物量腐蚀或重物挤压等因素&#xff0…

希望得到学术会议的及时回复该怎么说_张烨:在“选矿”博士的世界里,脚踏实地从来都不是说说而已!| 中南达人NO.188...

张烨资源加工与生物工程学院矿业工程2017级博士中南大学2019年大学生年度人物之一获奖经历(部分)2016年中南大学FMG奖励金优秀学生奖2017年中南大学优秀毕业生2018年中南大学优秀学生2019年中南大学优秀学生博士研究生国家奖学金中南大学大学生年度人物2017-2019年博士一等学业…

java编写一个集合类_Java集合类

数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关。刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈”对我说了一句:不会用集合类就等于没学过Java。然后…

python 当前文件路径获取方式_Python获取当前文件路径

一. Python 获取当前文件路径方法2. sys.path[0]获取文件当前工作目录路径(绝对路径)sys.argv[0]|获得模块所在的路径(由系统决定是否是全名)若显示调用python指令,如python demo.py,会得到绝对路径;若直接执行脚本,如./demo.py,会…

pdf不支持64位浏览器_4MLinux 31.0 发布,不支持32位

Zbigniew Konojacki宣布发布4MLinux 31.0,这是该项目极简发行版的新稳定版本,专注于四个功能:维护(作为系统救援Live CD),多媒体(用于播放视频DVD和其他多媒体文件),迷你服务器(使用inetd守护程序)和神秘的版本(提供几…

java期末考试2013及答案_java笔试经典(题及答案)2013.doc

java笔试经典(题及答案)2013.doc Java笔试经典(基础部分及答案和分析)1、一个“.java“源文件中是否可以包括多个类(不是内部类)?有什么限制?7答:可以包括多个类,但是最多只能有一个public修饰的类。2、Java有没有goto?7答:java中…

datatables 行分组信息展开与折叠的功能实现_[LaTeX 尝试] fancyvrb - 修复行引用的超链接跳转位置

本文已加入专栏文章目录,归入「进阶使用」文章系列。本文可以看作对这个发生于 2019 年 7 月中旬的 TeX-SX 上自问自答的展开说明。那个回答中避免了 python 的使用,而是利用 zref 宏包把位置信息以文本形式在 pdf 中呈现,好处是不用引入 pyt…

qtcreator摄像头显示时间_三星Galaxy S11 +渲染器展现出巨大的相机凹凸和四边形曲面显示...

我们正接近一年中三星宣布其Galaxy S系列最新设备的时间。Galaxy S10系列被认为是三星发布的最好的版本之一,因此在这方面他们有很多重要的事情。我们已经看到了Galaxy S11和Galaxy S11e的渲染,但是现在我们首先来看看Galaxy S11 。三星Galaxy S11 与其他…

php源码安装配置,php源码安装时configure配置参数 | 学步园

在Linux下安装PHP,源代码方式安装,总需要配置很多参数。这里列出常用配置参数,并详细用中文解释说明了。给大家一些参考./configure–prefix/usr/local/PHP php 安装目录–with-apxs2/usr/local/apache/bi…

python递归函数详解-讲解Python中的递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: ? 1 fact(n) n! 1 x2 x3 x ... x …

php 高效判断是否登录,php 判断用户是否登录

判断用户登陆主要分几个过程,第一步是用户登陆成功后把数据保存到session中,然后当用户访问需要登陆过的用户权限时就来判断session是否为空,如果不是就登录成功。下面来看个实例session_start();if(getconfig("chatroom_admin")$_…

php异步处理任务工具,php异步任务处理: gearman

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡准备软件包gearmand-1.1.12.tar.gzgearman-1.1.1.tgz php扩展安装支持组件yum -y install boost-devel* gperf* libevent-devel* libuuid-devel*./configu…

页面错误!请稍后再试_微信内嵌H5页面授权和分享

近期新上线项目,用到了微信授权获取用户信息和分享,掉坑无数次,遂写此篇,为后人指路项目情况技术选型项目语言:HTML、CSS、JavaScript项目框架:Vue.js项目搭建脚手架:vue-cli工程化工具&#xf…

电脑打字手指正确姿势_正确的弹琴手型,应该是怎样的?

手型是基础,手型规范才有助于练习出正确的指法,指法正确就可以提高练习质量。刚入门的时候,不能刻意的要求手型,但是我们要有一个基本的要求,就是手要保持放松。弹琴的时候,没有多余的身体的力量参与到触键…

php 开源 采集,迅睿CMS 火车头内容采集

采集工具:火车采集器 v7.6采集模块:新闻 News一、编写采集入库脚本接口新建:./api/caiji.php/*** 数据采集*/define(IS_API, basename(__FILE__, .php)); // 项目标识define(SELF, pathinfo(__FILE__, PATHINFO_BASENAME)); // 该文件的名称r…

英文数据集txt_YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)

点击上方“计算机视觉cv”即可“进入公众号”重磅干货第一时间送达前言随着人工智能的发展,现在越来越多的场景需要人工智能。在工厂的厂区中以安全为首,但工人普遍缺乏佩戴安全帽意识;工厂环境复杂,有各种各样的禁止进入的区域&a…

浪潮集团PHP,浪潮php实习第一天(初识php)

先推荐几个比较好的php初学者资料php manual.chm(可在csdn下载频道下载,可查到大部分函数)比较好的开发工具1 eclipse PDT(对eclipse比较熟悉的比较适应)2.zendStudio(公认的最好的php集成开发环境)php没有想象中的那么难学,不仅仅是它的语法&#xff0c…

检测到目标url存在内部ip地址泄露_Cendertron,动态爬虫与敏感信息泄露检测

Cendertron,动态爬虫与敏感信息泄露检测Cendertron Crawler RendertronCendertron https://url.wx-coder.cn/HinPM 是基于 Puppeteer 的 Web 2.0 动态爬虫与敏感信息泄露检测工具。其依托于 xe-crawler 的通用爬虫、调度与缓存模型,新增了 Monkey Test…

wamp2 php配置,wamp安装后自定义配置的方法

WampServer是目前应用非常广泛的PHP集成开发环境,本文就来讲述Wamp安装后自定义配置的方法。供大家参考借鉴。具体如下:wamp2.5安装完毕后,自己手动重新设置了apache的默认根目录。但是发现本机可以访问,别人不能访问。提示信息为…