使用通知
一般我們?cè)谑褂肁ndroid手機(jī)時(shí)下拉屏幕可以看到許多應(yīng)用發(fā)送的消息爷辱,這些消息包括標(biāo)題、內(nèi)容甚至是圖片朦肘,這就是通知饭弓。通知不同于Toast短消息,通知可以長(zhǎng)時(shí)間的存在與手機(jī)的狀態(tài)欄媒抠,當(dāng)通知到來(lái)時(shí)還可以讓手機(jī)發(fā)出提示音或者使用前置的led來(lái)提醒使用者弟断,所以通知是每一個(gè)應(yīng)用程序中必不可少的一項(xiàng)。
創(chuàng)建通知主要有以下三步驟:
第一步:創(chuàng)建一個(gè)NotificationManager對(duì)象來(lái)對(duì)通知進(jìn)行管理趴生,這個(gè)對(duì)象可以使用Context的getSystemService()方法得到阀趴。getSystemService()一般要傳入一個(gè)字符串用于確定獲取系統(tǒng)的哪一個(gè)服務(wù)。
第二步:創(chuàng)建Notification對(duì)象刘急。創(chuàng)建該對(duì)象需要使用Builder()構(gòu)造器叔汁。有了該對(duì)象以后我們就可以來(lái)使用多種方法來(lái)設(shè)置我們的通知了据块。
第三步:調(diào)用NotificationManager中的notify()方法將通知加載進(jìn)來(lái)瑰钮。notify()接收兩個(gè)參數(shù)浪谴,第一個(gè)參數(shù)是id苟耻,就是需要保證每一個(gè)通知的id都是不同的凶杖;第二個(gè)參數(shù)是Notification對(duì)象智蝠。傳入該對(duì)象之后我們就可以加載通知了。
我們來(lái)自己寫(xiě)一個(gè)小程序來(lái)測(cè)試一下吧解虱!漆撞,首先是創(chuàng)建一個(gè)空項(xiàng)目浮驳,然后為布局添加一個(gè)按鈕,之后修改主代碼:
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") //設(shè)置標(biāo)題
.setContentText("this is a content text") //設(shè)置內(nèi)容
.setWhen(System.currentTimeMillis()) //設(shè)置創(chuàng)建的時(shí)間
.setSmallIcon(R.mipmap.ic_launcher) //設(shè)置小標(biāo)志
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) //設(shè)置大標(biāo)志
.setDefaults(NotificationCompat.DEFAULT_ALL) //使用手機(jī)默認(rèn)的提醒方式
.setPriority(NotificationCompat.PRIORITY_DEFAULT) //設(shè)置通知的重要程度
.setAutoCancel(true) //設(shè)置通知自動(dòng)取消
.build();
manager.notify(1,notification);
}
}
我們創(chuàng)建通知時(shí)就是按照前面講的步驟來(lái)進(jìn)行的,首先就是創(chuàng)建NotificationManager對(duì)象健霹,然后是創(chuàng)建Notification對(duì)象并且在該對(duì)象里面我們?yōu)橥ㄖO(shè)定了各種的屬性糖埋,下面一個(gè)一個(gè)的來(lái)看吧:
setContentTitle():就是設(shè)置我們通知的標(biāo)題瞳别,一般是傳入一個(gè)字符串即可祟敛。
setContentText():設(shè)置我們通知中的內(nèi)容,也是傳入一個(gè)字符串即可埠巨。
setWhen():設(shè)置我們通知?jiǎng)?chuàng)建的時(shí)間辣垒,這里是以毫秒為單位印蔬,一般我們使用系統(tǒng)默認(rèn)的System.currentTimeMillis()
即可。
setSmallIcon():設(shè)置我們通知的小圖標(biāo),這里的小圖標(biāo)主要是在我們下拉狀態(tài)欄之前顯示在手機(jī)上方的狀態(tài)欄中的圖標(biāo)例驹。
setLargeIcon():設(shè)置我們通知的大圖標(biāo),這里的大圖標(biāo)是指我們下拉狀態(tài)欄之后顯示在標(biāo)題左邊的圖標(biāo)眠饮。
setDefaults():設(shè)置手機(jī)默認(rèn)的提醒通知的方式,包括鈴聲仪召、震動(dòng)和LED燈的閃爍,一般我們傳入默認(rèn)值即可扔茅。
setPriority():設(shè)置我們通知的重要程度,程度越高的則會(huì)排在越前面秸苗。有四個(gè)參數(shù)可供我們選擇:
NotificationCompat.PRIORITY_DEFAULT(默認(rèn)程度)
NotificationCompat.PRIORITY_MIN(低程度)
NotificationCompat.PRIORITY_HIGH(高程度)
NotificationCompat.PRIORITY_MAX(最高程度)
setAutoCancel():設(shè)置我們的通知在被點(diǎn)擊之后能夠自動(dòng)的取消不再顯示召娜。
設(shè)置完屬性之后我們最后調(diào)用NotificationManager的notify()方法來(lái)讓我們的通知加載惊楼。最后運(yùn)行程序檀咙,點(diǎn)擊按鈕即可成功發(fā)送通知。
播放多媒體
多媒體我們一般包括音頻和視頻棕诵。在Android里面為這兩種多媒體文件提供了很好的API支持裁良,我們一起來(lái)學(xué)習(xí)一下吧。
1.播放音頻
在Android中播放音頻所使用到的類(lèi)主要是MediaPlayer笛匙,這個(gè)類(lèi)中包含了許多的方法侨把,可以用一張圖來(lái)概括:
知道了這些方法,我們就可以親自來(lái)嘗試一下了膳算,還是先創(chuàng)建一個(gè)空項(xiàng)目座硕,然后為該項(xiàng)目的布局添加三個(gè)按鈕,分別表示播放涕蜂、暫停和停止华匾。接著修改主代碼:
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();
}
}
}
在這段代碼中我們是想要讀取手機(jī)中的SD卡的MP3文件來(lái)進(jìn)行播放,所以在開(kāi)始我們要申請(qǐng)讀取MP3的權(quán)限,否則就無(wú)法播放蜘拉,申請(qǐng)權(quán)限的步驟我們都很了解萨西,所以就不多說(shuō)了。當(dāng)權(quán)限申請(qǐng)完畢之后我們就來(lái)進(jìn)行初始化操作旭旭,我們先是創(chuàng)建一個(gè)File對(duì)象來(lái)獲得我們音頻文件的路徑谎脯,接著就是使用setDataSource()方法來(lái)將路徑導(dǎo)入,最后是使用prepare()方法讓mediaPlayer準(zhǔn)備就緒持寄。然后就是對(duì)按鈕的點(diǎn)擊方法了源梭,對(duì)于play鍵我們先判斷音頻文件是否在播放,如果沒(méi)有播放我們就是用start()進(jìn)行播放稍味;對(duì)于pause鍵我們也是先進(jìn)行判斷废麻,只有當(dāng)有音樂(lè)播放時(shí)我們才能進(jìn)行暫停;最后是stop鍵模庐,我們先使用stop()方法讓音樂(lè)停下來(lái)烛愧,然后使用reset()方法讓音頻回復(fù)到開(kāi)始時(shí)的狀態(tài),接著是重新初始化掂碱。最后是在onDestroy()方法中我們還需要調(diào)用stop()方法和release()方法將資源進(jìn)行釋放怜姿。
要注意需要先注冊(cè)權(quán)限哦:
<?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類(lèi)來(lái)進(jìn)行實(shí)現(xiàn)的,這個(gè)類(lèi)中所包含的方法和MediaPlayer類(lèi)中的很像疼燥,也可以用一張圖來(lái)概括:
我們來(lái)寫(xiě)一個(gè)demo嘗試一下播放音頻沧卢,仍然是空項(xiàng)目,然后來(lái)設(shè)置布局:
<?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>
我們是水平放置了三個(gè)按鈕分別代表:播放悴了、暫停和重新開(kāi)始搏恤,然后是使用組件VideoView,稍后的視頻就將在這里進(jìn)行播放湃交。接著我們來(lái)修改主代碼:
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();
}
}
}
其實(shí)這一段代碼和播放音頻的代碼很像熟空,這里就不詳細(xì)的說(shuō)了。主要是說(shuō)一下最后的onDestroy()方法中調(diào)用的suspend()方法搞莺,這個(gè)方法在圖中是沒(méi)有被提及到的息罗,它是指將videoView中的視頻資源給是釋放掉。
最后別忘了注冊(cè)權(quán)限才沧,然后運(yùn)行程序就能夠播放SD卡中的視頻了迈喉。