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

本節(jié)目錄

使用通知

一般我們?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卡中的視頻了迈喉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市温圆,隨后出現(xiàn)的幾起案子挨摸,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拍皮,居然都是意外死亡探遵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)钙勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叭披,“玉大人颅筋,你說(shuō)我怎么就攤上這事置逻⊥品校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵券坞,是天一觀的道長(zhǎng)鬓催。 經(jīng)常有香客問(wèn)我,道長(zhǎng)恨锚,這世上最難降的妖魔是什么深浮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮眠冈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菌瘫。我一直安慰自己蜗顽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布雨让。 她就那樣靜靜地躺著雇盖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栖忠。 梳的紋絲不亂的頭發(fā)上崔挖,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音庵寞,去河邊找鬼狸相。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捐川,可吹牛的內(nèi)容都是我干的脓鹃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼古沥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘸右!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起岩齿,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤太颤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后盹沈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體龄章,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓦堵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片基协。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菇用,靈堂內(nèi)的尸體忽然破棺而出澜驮,到底是詐尸還是另有隱情,我是刑警寧澤惋鸥,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布杂穷,位于F島的核電站,受9級(jí)特大地震影響卦绣,放射性物質(zhì)發(fā)生泄漏耐量。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一滤港、第九天 我趴在偏房一處隱蔽的房頂上張望廊蜒。 院中可真熱鬧,春花似錦溅漾、人聲如沸山叮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屁倔。三九已至,卻和暖如春暮胧,著一層夾襖步出監(jiān)牢的瞬間锐借,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工往衷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钞翔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓炼绘,卻偏偏與公主長(zhǎng)得像嗅战,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俺亮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容