Android入門(10)| 多媒體的使用

本節目錄
使用通知
一般我們在使用Android手機時下拉螢幕可以看到許多應用傳送的訊息,這些訊息包括標題、內容甚至是圖片,這就是通知。通知不同於Toast短訊息,通知可以長時間的存在與手機的狀態列,當通知到來時還可以讓手機發出提示音或者使用前置的led來提醒使用者,所以通知是每一個應用程式中必不可少的一項。
建立通知主要有以下三步驟:
第一步:建立一個NotificationManager物件來對通知進行管理,這個物件可以使用Context的getSystemService()方法得到。getSystemService()一般要傳入一個字串用於確定獲取系統的哪一個服務。
第二步:建立Notification物件。建立該物件需要使用Builder()構造器。有了該物件以後我們就可以來使用多種方法來設定我們的通知了。
第三步:呼叫NotificationManager中的notify()方法將通知載入進來。notify()接收兩個引數,第一個引數是id,就是需要保證每一個通知的id都是不同的;第二個引數是Notification物件。傳入該物件之後我們就可以載入通知了。
我們來自己寫一個小程式來測試一下吧!,首先是建立一個空專案,然後為佈局新增一個按鈕,之後修改主程式碼:
package com.example.yzbkaka.notificationtest; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.graphics.BitmapFactory; import android.support.v4.app.NotificationCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button send = (Button)findViewById(R.id.send); send.setOnClickListener(this); } @Override public void onClick(View view) { NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(this) .setContentTitle("this is a title")//設定標題 .setContentText("this is a content text")//設定內容 .setWhen(System.currentTimeMillis())//設定建立的時間 .setSmallIcon(R.mipmap.ic_launcher)//設定小標誌 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))//設定大標誌 .setDefaults(NotificationCompat.DEFAULT_ALL)//使用手機預設的提醒方式 .setPriority(NotificationCompat.PRIORITY_DEFAULT)//設定通知的重要程度 .setAutoCancel(true)//設定通知自動取消 .build(); manager.notify(1,notification); } }
我們建立通知時就是按照前面講的步驟來進行的,首先就是建立NotificationManager物件,然後是建立Notification物件並且在該物件裡面我們為通知設定了各種的屬性,下面一個一個的來看吧:
setContentTitle():就是設定我們通知的標題,一般是傳入一個字串即可。
setContentText():設定我們通知中的內容,也是傳入一個字串即可。
setWhen():設定我們通知建立的時間,這裡是以毫秒為單位,一般我們使用系統預設的 System.currentTimeMillis()
即可。
setSmallIcon():設定我們通知的小圖示,這裡的小圖示主要是在我們下拉狀態列之前顯示在手機上方的狀態列中的圖示。
setLargeIcon():設定我們通知的大圖示,這裡的大圖示是指我們下拉狀態列之後顯示在標題左邊的圖示。
setDefaults():設定手機預設的提醒通知的方式,包括鈴聲、震動和LED燈的閃爍,一般我們傳入預設值即可。
setPriority():設定我們通知的重要程度,程度越高的則會排在越前面。有四個引數可供我們選擇:
NotificationCompat.PRIORITY_DEFAULT(預設程度) NotificationCompat.PRIORITY_MIN(低程度) NotificationCompat.PRIORITY_HIGH(高程度) NotificationCompat.PRIORITY_MAX(最高程度)
setAutoCancel():設定我們的通知在被點選之後能夠自動的取消不再顯示。
設定完屬性之後我們最後呼叫NotificationManager的notify()方法來讓我們的通知載入。最後執行程式,點選按鈕即可成功傳送通知。
播放多媒體
多媒體我們一般包括音訊和視訊。在Android裡面為這兩種多媒體檔案提供了很好的API支援,我們一起來學習一下吧。
1.播放音訊
在Android中播放音訊所使用到的類主要是MediaPlayer,這個類中包含了許多的方法,可以用一張圖來概括:

方法
知道了這些方法,我們就可以親自來嘗試一下了,還是先建立一個空專案,然後為該專案的佈局新增三個按鈕,分別表示播放、暫停和停止。接著修改主程式碼:
package com.example.yzbkaka.mediaplayertest; import android.Manifest; import android.content.pm.PackageManager; import android.media.MediaPlayer; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity implements View.OnClickListener { MediaPlayer mediaPlayer = new MediaPlayer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button play = (Button)findViewById(R.id.play); Button pause = (Button)findViewById(R.id.pause); Button stop = (Button)findViewById(R.id.stop); play.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); } else{ initMediaPlayer(); } } public void initMediaPlayer(){ try{ File file = new File(Environment.getExternalStorageDirectory(),"music.mp3"); mediaPlayer.setDataSource(file.getPath()); mediaPlayer.prepare(); }catch(Exception e){ e.printStackTrace(); } } @Override public void onRequestPermissionsResult(int requestCode,String[] permission,int[] grantResults){ switch (requestCode){ case 1: if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ initMediaPlayer(); } else{ Toast.makeText(this, "you deny the request", Toast.LENGTH_SHORT).show(); } } } @Override public void onClick(View view) { switch(view.getId()){ case R.id.play: if(!mediaPlayer.isPlaying()){ mediaPlayer.start(); } break; case R.id.pause: if(mediaPlayer.isPlaying()){ mediaPlayer.pause(); } break; case R.id.stop: if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); mediaPlayer.reset(); initMediaPlayer(); } } } @Override public void onDestroy(){ super.onDestroy(); if(mediaPlayer != null){ mediaPlayer.stop(); mediaPlayer.release(); } } }
在這段程式碼中我們是想要讀取手機中的SD卡的MP3檔案來進行播放,所以在開始我們要申請讀取MP3的許可權,否則就無法播放,申請許可權的步驟我們都很瞭解,所以就不多說了。當權限申請完畢之後我們就來進行初始化操作,我們先是建立一個File物件來獲得我們音訊檔案的路徑,接著就是使用setDataSource()方法來將路徑匯入,最後是使用prepare()方法讓mediaPlayer準備就緒。然後就是對按鈕的點選方法了,對於play鍵我們先判斷音訊檔案是否在播放,如果沒有播放我們就是用start()進行播放;對於pause鍵我們也是先進行判斷,只有當有音樂播放時我們才能進行暫停;最後是stop鍵,我們先使用stop()方法讓音樂停下來,然後使用reset()方法讓音訊回覆到開始時的狀態,接著是重新初始化。最後是在onDestroy()方法中我們還需要呼叫stop()方法和release()方法將資源進行釋放。
要注意需要先註冊許可權哦:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yzbkaka.mediaplayertest"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2.播放視訊
播放視訊主要使用的是VideoView類來進行實現的,這個類中所包含的方法和MediaPlayer類中的很像,也可以用一張圖來概括:

方法
我們來寫一個demo嘗試一下播放音訊,仍然是空專案,然後來設定佈局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/play" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="play"/> <Button android:id="@+id/pause" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="pause"/> <Button android:id="@+id/replay" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="replay"/> </LinearLayout> <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
我們是水平放置了三個按鈕分別代表:播放、暫停和重新開始,然後是使用元件VideoView,稍後的視訊就將在這裡進行播放。接著我們來修改主程式碼:
package com.example.yzbkaka.videoviewtest; import android.Manifest; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import android.widget.VideoView; import java.io.File; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ VideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = (VideoView)findViewById(R.id.video_view); Button play = (Button)findViewById(R.id.play); Button pause = (Button)findViewById(R.id.pause); Button replay = (Button)findViewById(R.id.replay); play.setOnClickListener(this); pause.setOnClickListener(this); replay.setOnClickListener(this); if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); } else{ initVideoPath(); } } public void initVideoPath(){ File file = new File(Environment.getExternalStorageDirectory(),"movie.mp4"); videoView.setVideoPath(file.getPath()); } @Override public void onRequestPermissionsResult(int requestCode,String[] permission,int[] grantResults){ switch (requestCode){ case 1: if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ initVideoPath(); } else{ Toast.makeText(this, "you deny the request", Toast.LENGTH_SHORT).show(); } } } @Override public void onClick(View view) { switch(view.getId()){ case R.id.play: if(!videoView.isPlaying()){ videoView.start(); } break; case R.id.pause: if(videoView.isPlaying()){ videoView.pause(); } break; case R.id.replay: if(videoView.isPlaying()){ videoView.resume(); } break; } } @Override public void onDestroy(){ super.onDestroy(); if(videoView != null){ videoView.suspend(); } } }
其實這一段程式碼和播放音訊的程式碼很像,這裡就不詳細的說了。主要是說一下最後的onDestroy()方法中呼叫的suspend()方法,這個方法在圖中是沒有被提及到的,它是指將videoView中的視訊資源給是釋放掉。
最後別忘了註冊許可權,然後執行程式就能夠播放SD卡中的視訊了。