參考資料: Amazon.com: Hello, Android: Introducing Google's Mobile Development Platform (Pragmatic Programmers) (9781934356562): Ed Burnette: Books
這段內容主要為:
第5章 多媒體
5.2 播放影片
[Note] Android所支援的聲音格式
[Note] 為何轉動銀幕後影片會重新播放?
5.2 播放影片
影片不僅僅是一張張顯示在銀幕上的圖片, 更有包含了與其同步的聲音. Android的MediaPlayer類別在播放影片時與播放聲音時在使用上雷同, 唯一不同的是你需要建立一個Surface讓播放器可以在上面"作畫"(把影片一張張"畫"上去). 你也可以使用start()與stop()來控制影片播放. 這邊不會展示另外一個MediaPlayer範例, 因為要嵌入影片到應用程式中有一個更簡單的方式: VideoView類別. 底下會以VideoView類別來做範例, 要撰寫這樣的範例先建立一個Android專案名稱叫做Video使用底下的參數:
Project name: Video
Build Target: Android 2.2
Application name: Video
Package name: org.example.video
Create Activity: Video
Min SDK Version: 8
首先修改layout檔案(res/layout/main.xml):
## Video/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<VideoView
android:id="@+id/video"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
打開Video.java修改onCreate( )方法:
## Video/src/org/example/video/Video.java
package org.example.video;
import android.app.Activity;
import android.os.Bundle;
import android.widget.VideoView;
public class Video extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Fill view from resource
setContentView(R.layout.main);
VideoView video = (VideoView) findViewById(R.id.video);
// Load and start the movie
video.setVideoPath("/data/samplevideo.3gp" );
video.start();
}
}
setVideoPath()方法用來讀取影片檔(此路徑為應用程式中的路徑), 調整影片的長寬比例以符合其播放的視窗容器(container), start()則是開始播放影片, 現在你需要上傳影片使其播放, 在命令提示字元敲下adb push命令上傳: (要執行這段命令時要先把Android模擬器跑起來, 不然會回傳錯誤error: device not found)
C:\> adb push c:\code\samplevideo.3gp /data/samplevideo.3gp
1649 KB/s (369870 bytes in 0.219s)
上面這個範例只能在模擬器中運作, 因為在真實的裝置上, 目錄是被保護起來的. 要注意的是, Android似乎不會去管副檔名為何, 你要做的就是單純的用Eclipse檔案總管把影片丟進Android專案中. 只是作者在這邊發現命令提示字元的方式更為簡單.
播放的效果會如下:
這邊還有另外一點要注意的: 我們在播放影片的時候會想要將影片放至全銀幕, 且去除標題列與狀態列, 要達到這樣的效果你需要在AndroidManifest.xml中指定正確的背景主題(theme):
## Video/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.video"
android:versionCode="1"
android:versionName="1.0" >
<application android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity android:name=".Video"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
</manifest>
當上面這些程式都完成後, 可以試試看執行程式看看播放影片的效果如何, 也可以將模擬器橫置看看不同的模式播放. 效果會類似下圖:
下一章節會回頭修改先前的數獨遊戲, 加入一點情境音樂.
[Note: Android支援的影片格式]
Android官方所支援的影片格式:
• MP4 (MPEG-4 low bit rate)
• H.263 (3GP)
• H.264 (AVC)
在Android 1.5時, H.263是推薦的影片格式, 因為幾乎所有的硬體平台都支援, 且其編碼與解碼的效率還不錯. H.263格式也相容於其他裝置如iPhone. 你可以使用QuickTime Pro (http://www.apple.com/quicktime/pro)來轉換影片格式, 但QuickTime Pro需要收費, 網路上也有許多免費的轉檔程式, 如Format Factory, Any Video Converter等等, Google搜尋"免費轉檔程式"即有很多可以下載使用, 轉換時可以用最低的解析度與位元率以節省空間, 當然要平衡影片播放品質可以看需求調整.
[Note: 為何轉動銀幕後影片會重新播放?]
Android預設你的程式完全不知到視窗的轉向(screen rotations), 假如有必要, 如硬體資源改變了, Android會結束Activity並整個重建. 代表onCreate()會被重新呼叫一次, 也代表著影片又會重播一次. 這個行為對於百分之90的應用程式是OK的, 所以大多數的開發者不需要擔心這個問題. 但是這也是用來測試你應用程式生命週期, 與狀態儲存/回復程式碼一個蠻有用的方式. 然而, 這邊有一些比較聰明且最佳化的方式來處理這種資源轉換.
最簡單的方式是在Activity中實作onRetainNonConfigurationInstance(), 用來在系統呼叫onDestory()與onCreate()間轉換時儲存一些資料. 當Activity回來時, 可以使用getLastNonConfigurationInstance()在新的Activity實體中回復存起來的資料. 在這邊可以儲存任何東西, 包括目前Intent的參考與正在執行的執行緒(Threads)的參考都可以.
另外一個較為複雜的方式是使用在AndroidManifest.xml中android:configChanges=property來告知Android哪一些改變需要處理. 舉例來說, 假如設定keyboardHidden|orientation, 當使用者翻動鍵盤, Android不會重建Activity. 取而代之, Android會呼叫onConfigurationChanged(Configuration)且假設你知道你在做什麼. (更詳細的參考資料: http://d.android.com/reference/android/app/Activity.html#ConfigurationChanges)
沒有留言:
張貼留言