使用原始資源

     除了前面介紹的個各類XML文件、圖片文件以外,Android應用可能還須要用到大量其餘類型的資源,好比聲音資源等。實際上,聲音對於Android應用很是重要,選擇合適的音效可讓Android應用增色很多。java

     相似聲音文件及其餘各類類型的文件,只要Android沒有爲之提供專門的支持,這種資源都被稱爲原始資源。Android的原始資源能夠放在以下兩個地方。android

  • 位於/res/raw目錄下,Android SDK會處理該目錄下原始資源,Android SDK會在R清單類中爲該目錄下的資源生成一個索引項。
  • 位於/assets/目錄下,該目錄下的資源是更完全的原始資源。Android應用須要經過AssetManager來管理該目錄下的原始資源。

     Android SDK會爲位於/res/raw/目錄下的資源在R類中生成一個索引項,接下來在XML文件中可經過以下語法格式來訪問它:app

     @[<package_name>:]raw/file_nameide

     在Java代碼中則按以下語法格式來訪問它:佈局

     [<package_name>.]R.raw.<file_name>   this

    經過上面的索引項,Android應用就能夠很是方便地訪問/res/raw目錄下的原始資源,至於獲取資源後如何處理,則徹底取決於實際項目的須要。spa

    AssetManager是一個專門管理/assets/目錄下原始資源的管理類,AssetManager提供了以下兩個方法來訪問Assets資源。code

  • InputStream open(String fileName):根據文件名來獲取原始資源對應的輸入流。
  • AssetFileDescriptor openFd(Stirng fileName):根據文件名來獲取原始資源對應的AssetFileDescriptor。AssetFileDescriptor表明了一項原始資源的描述,應用程序可經過AssetFileDescriptor來獲取原始資源。

     下面的程序示範瞭如何使用聲音,先在應用的/res/raw/目錄下放入一個bomp.mp3文件——Android SDK會自動處理該目錄下的資源,會在R清單類中爲它生成一個索引項:R.raw.bomp。xml

      接下來咱們再往/assets/目錄下放入一個shot.mp3文件——須要經過AssetManager進行管理。blog

      下面的程序中定義了兩個按鈕,一個按鈕用於播放/res/raw/目錄下的聲音文件,另外一個用於播放/assets/目錄下的聲音文件。

       界面佈局文件以下:

     

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
   >
<Button android:id="@+id/playRaw"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="播放Raw音樂"/>
   <Button android:id="@+id/playAsset"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="播放Asset音樂"/>
</LinearLayout>

後臺代碼文件以下:

package com.example.studyresources;

import java.io.IOException;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class RawResTest extends Activity {
    MediaPlayer mediaPlayer1=null;
    MediaPlayer mediaPlayer2=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_raw_res_test);
        //直接根據聲音文件的ID來建立MeidaPlayer
        mediaPlayer1=MediaPlayer.create(this, R.raw.bomb); //獲取該應用的AssetManager
        AssetManager am=getAssets();
        try
        {
            //獲取指定文件對應的AssetFileDescriptor
            AssetFileDescriptor afd=am.openFd("shot.mp3"); mediaPlayer2=new MediaPlayer(); //使用MediaPlayer加載指定的聲音文件
 mediaPlayer2.setDataSource(afd.getFileDescriptor()); mediaPlayer2.prepare();         }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        //獲取第一個按鈕,併爲它綁定事件監聽器
        Button playRaw=(Button)findViewById(R.id.playRaw);
        playRaw.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //播放聲音
                mediaPlayer1.start();
            }
            
        });
        //獲取第二個按鈕,併爲它綁定事件監聽器
        Button playAsset=(Button)findViewById(R.id.playAsset);
        playAsset.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mediaPlayer2.start();
            }});
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.raw_res_test, menu);
        return true;
    }

}

上面的程序中第一行粗體字代碼用於獲取/res/raw/目錄下的原始資源文件;第二段粗體字代碼則利用了AssetManager來獲取/assets/目錄下的原始資源文件。
  運行程序以下效果:

    

相關文章
相關標籤/搜索