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.pswp.cn/news/534215.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534215.shtml
英文地址,請注明出處:http://en.pswp.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的默認根目錄。但是發現本機可以訪問,別人不能訪問。提示信息為…