版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章豐富你的程序,運(yùn)用手機(jī)多媒體使用通知通知的簡介通知是Android系統(tǒng)中比較有特色的一個(gè)功能,當(dāng)某個(gè)應(yīng)用程序希望向用戶發(fā)出一些提示信息,而該應(yīng)用程序又不在前臺(tái)運(yùn)行時(shí),就可以借助通知來實(shí)現(xiàn)。發(fā)出一條通知后,手機(jī)最上方的狀態(tài)欄中會(huì)顯示一個(gè)通知的圖標(biāo),下拉狀態(tài)欄后可以看到通知的詳細(xì)內(nèi)容。通知渠道Android8.0系統(tǒng)引入了通知渠道這個(gè)概念。什么是通知渠道呢?顧名思義,就是每條通知都要屬于一個(gè)對(duì)應(yīng)的渠道。每個(gè)應(yīng)用程序都可以自由地創(chuàng)建當(dāng)前應(yīng)用擁有哪些通知渠道,但是這些通知渠道的控制權(quán)是掌握在用戶手上的。用戶可以自由地選擇這些通知渠道的重要程度,是否響鈴、是否振動(dòng)或者是否要關(guān)閉這個(gè)渠道的通知。通知渠道對(duì)于每個(gè)應(yīng)用來說,通知渠道的劃分是非??季康?,因?yàn)橥ㄖ酪坏﹦?chuàng)建之后就不能再修改了,因此開發(fā)者需要仔細(xì)分析自己的應(yīng)用程序一共有哪些類型的通知,然后再去創(chuàng)建相應(yīng)的通知渠道。我們可以參考Twitter的通知渠道劃分,如右圖所示。創(chuàng)建通知渠道創(chuàng)建一個(gè)通知渠道至少需要渠道ID、渠道名稱以及重要等級(jí)這3個(gè)參數(shù),其中渠道ID可以隨便定義,只要保證全局唯一性就可以。渠道名稱是給用戶看的,需要可以清楚地表達(dá)這個(gè)渠道的用途。通知的重要等級(jí)主要有IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN這幾種,對(duì)應(yīng)的重要程度依次從高到低,不同的重要等級(jí)會(huì)決定通知的不同行為。示例代碼如下所示:if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){valchannel=NotificationChannel(channelId,channelName,importance)manager.createNotificationChannel(channel)}通知的基本用法想要讓手機(jī)彈出一條通知,只需要使用如下代碼:valmanager=getSystemService(Context.NOTIFICATION_SERVICE)asNotificationManagervalnotification=NotificationCompat.Builder(context,channelId).setContentTitle("Thisiscontenttitle").setContentText("Thisiscontenttext").setSmallIcon(R.drawable.small_icon).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon)).build()manager.notify(1,notification)通知的基本用法想要指定通知的點(diǎn)擊事件,只需要使用如下代碼:valintent=Intent(this,NotificationActivity::class.java)valpi=PendingIntent.getActivity(this,0,intent,0)valmanager=getSystemService(Context.NOTIFICATION_SERVICE)asNotificationManagervalnotification=NotificationCompat.Builder(context,channelId).setContentTitle("Thisiscontenttitle").setContentText("Thisiscontenttext").setSmallIcon(R.drawable.small_icon).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon)).setContentIntent(pi).build()manager.notify(1,notification)顯示長文字的通知使用setStyle()方法替代setContentText()方法,并在setStyle()方法中創(chuàng)建一個(gè)NotificationCompat.BigTextStyle對(duì)象,這個(gè)對(duì)象就是用于封裝長文字信息的,只要調(diào)用它的bigText()方法并將文字內(nèi)容傳入就可以了。valnotification=NotificationCompat.Builder(this,"normal")....setStyle(NotificationCompat.BigTextStyle().bigText("Learnhowtobuildnotifications,sendandsyncdata,andusevoiceactions.GettheofficialAndroidIDEanddevelopertoolstobuildappsforAndroid.")).build()顯示大圖片的通知仍然調(diào)用的setStyle()方法,在參數(shù)中創(chuàng)建一個(gè)NotificationCompat.BigPictureStyle對(duì)象,這個(gè)對(duì)象就是用于設(shè)置大圖片的,然后調(diào)用它的bigPicture()方法并將圖片傳入即可。valnotification=NotificationCompat.Builder(this,"normal")....setStyle(NotificationCompat.BigPictureStyle().bigPicture( BitmapFactory.decodeResource(resources,R.drawable.big_image))).build()調(diào)用攝像頭和相冊(cè)調(diào)用攝像頭拍照雖然Android賦予我們了在應(yīng)用程序中打開攝像頭拍照的能力,但是通常情況下并沒有必要這么做,因?yàn)槲覀兛梢灾苯哟蜷_系統(tǒng)的相機(jī)程序進(jìn)行拍照,然后獲取返回的圖片即可。示例代碼如下:classMainActivity:AppCompatActivity(){lateinitvarimageUri:UrilateinitvaroutputImage:FileoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)outputImage=File(externalCacheDir,"output_image.jpg")if(outputImage.exists()){outputImage.delete()}outputImage.createNewFile()imageUri=if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){FileProvider.getUriForFile(this,"com.example.cameraalbumtest.fileprovider",outputImage)}else{Uri.fromFile(outputImage)}
valintent=Intent("android.media.action.IMAGE_CAPTURE")intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri)startActivityForResult(intent,takePhoto)}overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent?){super.onActivityResult(requestCode,resultCode,data)when(requestCode){takePhoto->{if(resultCode==Activity.RESULT_OK){valbitmap=BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))imageView.setImageBitmap(bitmap)}}}}...}調(diào)用攝像頭拍照從Android7.0系統(tǒng)開始,直接使用本地真實(shí)路徑的Uri被認(rèn)為是不安全的,會(huì)拋出一個(gè)FileUriExposedException異常。而FileProvider則是一種特殊的ContentProvider,它可以選擇性地將封裝過的Uri共享給外部,從而提高了應(yīng)用的安全性。為此我們需要再額外配置一個(gè)Uri的共享路徑,右擊res目錄→New→Directory,創(chuàng)建一個(gè)xml目錄,接著右擊xml目錄→New→File,創(chuàng)建一個(gè)file_paths.xml文件。然后修改file_paths.xml文件中的內(nèi)容,如下所示:<?xmlversion="1.0"encoding="utf-8"?><pathsxmlns:android="/apk/res/android"><external-pathname="my_images"path="/"/></paths>調(diào)用攝像頭拍照然后在AndroidManifest中對(duì)FileProvider進(jìn)行注冊(cè)即可:<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.cameraalbumtest.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/></provider>現(xiàn)在就可以打開相機(jī)進(jìn)行拍照了,最終的運(yùn)行結(jié)果如右圖所示。從相冊(cè)中選擇圖片雖然調(diào)用攝像頭拍照既方便又快捷,但我們并不是每次都需要當(dāng)場(chǎng)拍一張照片的。因?yàn)槊總€(gè)人的手機(jī)相冊(cè)里應(yīng)該都會(huì)存有許多張圖片,直接從相冊(cè)里選取一張現(xiàn)有的圖片會(huì)比打開相機(jī)拍一張照片更加常用。示例代碼如下:classMainActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){
valintent=Intent(Intent.ACTION_OPEN_DOCUMENT)intent.addCategory(Intent.CATEGORY_OPENABLE)intent.type="image/*"startActivityForResult(intent,fromAlbum)}overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent?){super.onActivityResult(requestCode,resultCode,data)when(requestCode){fromAlbum->{if(resultCode==Activity.RESULT_OK&&data!=null){data.data?.let{uri->valbitmap=getBitmapFromUri(uri)imageView.setImageBitmap(bitmap)}}}}}privatefungetBitmapFromUri(uri:Uri)=contentResolver.openFileDescriptor(uri,"r")?.use{BitmapFactory.decodeFileDescriptor(it.fileDescriptor)}…}從相冊(cè)中選擇圖片現(xiàn)在就可以打開相冊(cè)選擇圖片了,最終的運(yùn)行結(jié)果如下圖所示。播放多媒體文件播放多媒體文件手機(jī)上最常見的休閑方式毫無疑問就是聽音樂和看電影了,隨著移動(dòng)設(shè)備的普及,越來越多的人可以隨時(shí)享受優(yōu)美的音樂,觀看精彩的電影。Android在播放音頻和視頻方面做了相當(dāng)不錯(cuò)的支持,它提供了一套較為完整的API,使得開發(fā)者可以很輕松地編寫出一個(gè)簡易的音頻或視頻播放器。播放音頻在Android中播放音頻文件一般都是使用MediaPlayer類實(shí)現(xiàn)的,它對(duì)多種格式的音頻文件提供了非常全面的控制方法,從而使播放音樂的工作變得十分簡單。下表列出了MediaPlayer類中一些較為常用的控制方法。方法名功能描述setDataSource()設(shè)置要播放的音頻文件的位置prepare()在開始播放之前調(diào)用,以完成準(zhǔn)備工作start()開始或繼續(xù)播放音頻pause()暫停播放音頻reset()將MediaPlayer對(duì)象重置到剛剛創(chuàng)建的狀態(tài)seekTo()從指定的位置開始播放音頻stop()停止播放音頻。調(diào)用后的MediaPlayer對(duì)象無法再播放音頻release()釋放與MediaPlayer對(duì)象相關(guān)的資源isPlaying()判斷當(dāng)前MediaPlayer是否正在播放音頻getDuration()獲取載入的音頻文件的時(shí)長播放音頻一個(gè)簡單的音樂播放器示例代碼如下:classMainActivity:AppCompatActivity(){privatevalmediaPlayer=MediaPlayer()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initMediaPlayer()play.setOnClickListener{if(!mediaPlayer.isPlaying){mediaPlayer.start()//開始播放}}pause.setOnClickListener{if(mediaPlayer.isPlaying){mediaPlayer.pause()//暫停播放}}stop.setOnClickListener{if(mediaPlayer.isPlaying){mediaPlayer.reset()//停止播放initMediaPlayer()}}}privatefuninitMediaPlayer(){valassetManager=assetsvalfd=assetManager.openFd("music.mp3")mediaPlayer.setDataSource(fd.fileDescriptor,fd.startOffset,fd.length)mediaPlayer.prepare()}overridefunonDestroy(){super.onDestroy()mediaPlayer.stop()mediaPlayer.release()}}播放視頻播放視頻文件其實(shí)并不比播放音頻文件復(fù)雜,主要是使用VideoView類來實(shí)現(xiàn)的。這個(gè)類將視頻的顯示和控制集于一身,我們僅僅借助它就可以完成一個(gè)簡易的視頻播放器。VideoView的用法和MediaPlayer也比較類似,下表列出了MediaPlayer類中一些較為常用的控制方法。方法名功能描述setVideoPath()設(shè)置要播放的視頻文件的位置start()開始或繼續(xù)播放視頻pause()暫停播放視頻resume()將視頻從頭開始播放seekTo()從指定的位置開始播放視頻isPlaying()判斷當(dāng)前是否正在播放視頻getDuration()獲取載入的視頻文件的時(shí)長播放視頻一個(gè)簡單的視頻播放器示例代碼如下:classMainActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)valuri=Uri.parse("android.resource://$packageName/${R.raw.video}")videoView.setVideoURI(uri)play.setOnClickListener{if(!videoView.isPlaying){videoView.start()//開始播放
}}pause.setOnClickListener{if(videoView.isPlaying){videoView.pause()//暫停播放
}}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030西南鄉(xiāng)村旅游業(yè)市場(chǎng)研究及農(nóng)旅融合發(fā)展趨勢(shì)與鄉(xiāng)村旅游開發(fā)規(guī)劃分析報(bào)告
- 2025-2030葡萄酒橡木桶市場(chǎng)分析投資評(píng)估行業(yè)布局研究
- 2025-2030葡萄牙葡萄酒釀造行業(yè)市場(chǎng)品牌競爭分析及投資發(fā)展優(yōu)化規(guī)劃解讀
- 押題寶典安全員A證考試題庫及參考答案詳解(綜合題)
- 常州2025年江蘇常州工學(xué)院招聘15人筆試歷年參考題庫附帶答案詳解
- 山東2025年山東體育學(xué)院公開招聘人員筆試歷年參考題庫附帶答案詳解
- 宿州2025年安徽宿州市埇橋區(qū)事業(yè)單位招聘工作人員149人筆試歷年參考題庫附帶答案詳解
- 安徽安徽醫(yī)科大學(xué)2025年度專職輔導(dǎo)員招聘12人筆試歷年參考題庫附帶答案詳解
- 安康2025年陜西安康學(xué)院碩士研究生招聘10人筆試歷年參考題庫附帶答案詳解
- 寧波浙江寧波市奉化區(qū)名山建設(shè)保障服務(wù)中心招聘工作人員筆試歷年參考題庫附帶答案詳解
- GA 1812.1-2024銀行系統(tǒng)反恐怖防范要求第1部分:人民幣發(fā)行庫
- AQ 3002-2005 阻隔防爆撬裝式汽車加油(氣)裝置技術(shù)要求
- 手衛(wèi)生規(guī)范與標(biāo)準(zhǔn)預(yù)防
- 胃癌術(shù)后快速康復(fù)的護(hù)理
- 馬工程社會(huì)學(xué)概論考試重點(diǎn)
- 鋼筋混凝土圓管涵圓管計(jì)算程序(2020規(guī)范)
- DL∕T 2340-2021 大壩安全監(jiān)測(cè)資料分析規(guī)程
- 《陸上風(fēng)電場(chǎng)工程概算定額》NBT 31010-2019
- GB/T 13789-2022用單片測(cè)試儀測(cè)量電工鋼帶(片)磁性能的方法
- GB/T 33092-2016皮帶運(yùn)輸機(jī)清掃器聚氨酯刮刀
- 中學(xué)主題班會(huì)課:期末考試應(yīng)試技巧點(diǎn)撥(共34張PPT)
評(píng)論
0/150
提交評(píng)論