編輯:關於Android編程
釋放相機
想機是被設備上的應用們共享的資源.你的應用可以在獲取相機實例後使用它,並且你的應用必須在用完後釋放它,而且在暫停時(Activity.onPause())也要釋放它.如果你的應用沒有適當的釋放相機,所有後續試圖獲取相機使用權的操作,包括你自己的應用,都會失敗並且導致那些應用關閉.
要釋放一個相機對象實例,使用方法Camera.release(),如下代碼所示:
[java]
public class CameraActivity extends Activity {
private Camera mCamera;
private SurfaceView mPreview;
private MediaRecorder mMediaRecorder;
...
@Override
protected void onPause() {
super.onPause();
releaseMediaRecorder(); // if you are using MediaRecorder, release it first
releaseCamera(); // release the camera immediately on pause event
}
private void releaseMediaRecorder(){
if (mMediaRecorder != null) {
mMediaRecorder.reset(); // clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
mCamera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (mCamera != null){
mCamera.release(); // release the camera for other applications
mCamera = null;
}
}
}
public class CameraActivity extends Activity {
private Camera mCamera;
private SurfaceView mPreview;
private MediaRecorder mMediaRecorder;
...
@Override
protected void onPause() {
super.onPause();
releaseMediaRecorder(); // if you are using MediaRecorder, release it first
releaseCamera(); // release the camera immediately on pause event
}
private void releaseMediaRecorder(){
if (mMediaRecorder != null) {
mMediaRecorder.reset(); // clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
mCamera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (mCamera != null){
mCamera.release(); // release the camera for other applications
mCamera = null;
}
}
}
保存媒體文件
用戶創建的媒體文件,比如圖片或視頻,應該被保存到設備的外部存儲中(SD Card) ,這樣可以保留系統空間並且使得用戶可以不通過設備也能獲取這些文件.一個設備上有很多可以存放媒體文件的路徑位置,然而只有兩個標准的路徑對於開發者來說是必須考慮的:
· Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) - 此方法返回標准的,共享的,並且是推薦的存儲位置.此路徑是被共享的(公開的),所以其它應用可以輕松發現然後讀取,修改以及刪除此路徑下的文件們.如果你的應用被用戶卸載,保存在此路徑下的文件將被刪除.要避免與干涉已存在的圖片或視頻文件,你應該在路徑下為你的應用創建一個子文件夾,如後面例子中所示.此方法從Android 2.2 (API Level 8)中開始可以使用,對於等價的早期API的調用,見"保存共享文件"一節.
· Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) - 此方法返回一個標准的存儲圖像和視頻位置,並且此位置與你的應用會關聯起來.如果你的應用被刪除,所有此位置下的文件們都將被刪除.此位置下的文件不會強制應用安全特性,所以其它應用可以讀取,修改以及刪除它們.
下面的代碼示例演示了如何為一個媒體文件創建一個文件或Uri位置.這個文件可以在通過intent調用一個設備的相機或在創建一個相機應用時使用:
[java]
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
/** 創建一個文件Uri來存儲一個圖像或視頻 */
private static Uri getOutputMediaFileUri(int type){
return Uri.fromFile(getOutputMediaFile(type));
}
/** 創建一個文件用於存儲圖像或視頻 */
private static File getOutputMediaFile(int type){
// 為了安全,你應該檢查SDCard是否被mounted,
// 所以應先調用Environment.getExternalStorageState().
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
//如果你想創建圖像並在應用之間共享,還想讓你的圖像在你的應用卸載後依然存在,
// 這個位置是最好的選擇.
// 如果存儲位置不存在,創建它.
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// 創建媒體文件的名字
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else if(type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
/** 創建一個文件Uri來存儲一個圖像或視頻 */
private static Uri getOutputMediaFileUri(int type){
return Uri.fromFile(getOutputMediaFile(type));
}
/** 創建一個文件用於存儲圖像或視頻 */
private static File getOutputMediaFile(int type){
// 為了安全,你應該檢查SDCard是否被mounted,
// 所以應先調用Environment.getExternalStorageState().
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
//如果你想創建圖像並在應用之間共享,還想讓你的圖像在你的應用卸載後依然存在,
// 這個位置是最好的選擇.
// 如果存儲位置不存在,創建它.
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// 創建媒體文件的名字
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else if(type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
注:Environment.getExternalStoragePublicDirectory()只能用於Android 2.2 (API Level 8)或更高版本中.如果你的目標設備使用早期版本,應用用Environment.getExternalStorageDirectory()代替.
相機特性 Features
Android支持大量的相機特性,你可以在你的應用中調節它們.比如圖像格式,閃光模式,焦點設置,以及更多.本節列出常用的相機特性,並且簡要說明如何使用它們.大多數相機特性可以使用Camera.Parameters 對象取得或設置.然而,有一些重要的特性需要比Camera.Parameters更復雜的方式進行設置,這些特性在以下各節中說明:
· 測光與聚焦區域
· 面部檢測
· 定時拍攝視頻
對於如何使用那些通過Camera.Parameters控制的一般特性,請見後面的"使用相機特性"一節.
表1. 各版API中引入的常用相機特性表
Feature
API Level
Description
Face Detection
14
檢測人臉位置並用結果來計算焦點,測光和白平衡
Metering Areas
14
在一個圖像內指定一個或多個區域來計算白平衡
Focus Areas
14
在一個圖像中設置一個或多個聚焦區域
White Balance Lock
14
停止或開始自動白平衡調整
Exposure Lock
14
停止或開始自動曝光調整
Video Snapshot
14
在拍視頻時抓取一個圖像
Time Lapse Video
11
定時錄像
Multiple Cameras
9
在一個設備上支持一個或多個相機,包括正面和反面的相機。
Focus Distance
9
焦距
Zoom
8
設置圖像的放大率
Exposure Compensation
8
減小或增大曝光級別
GPS Data
5
圖像中包含或不包含地理位置信息
White Balance
5
設置白平衡的模式
Focus Mode
5
設置在一個物體上如何聚焦,比如自動,固定,微距,無限遠.
Scene Mode
5
場景模式,比如晚上,海灘,雪地或燭光.
JPEG Quality
5
設置JPEG圖像的壓縮級別.
Flash Mode
5
設置閃光燈開,關或自動.
Color Effects
5
應用一個顏色效果到圖像,比如黑白,褐色,反色.
Anti-Bandingwww.2cto.com
5
減少在JPEG壓縮時的顏色漸變的邊緣效應.
Picture Format
1
指定圖像的文件格式
Picture Size
1
指定圖像的寬和高
注: 這些特性並不是在所有的設備上都被支持,因為硬件的差別和軟件的實現各有不同.
作者:nkmnkm
對於很多開發人員來說,炫酷的UI效果是最吸引他們注意力的,很多人也因為這些炫酷的效果而去學習一些比較知名的UI庫。而做出炫酷效果的前提是你必須對自定義View有所理解,作
上篇介紹了導航欄下的滑動切換實現,這次要介紹的是導航欄上的切換,在很多應用中經常見到,先看效果圖。當點擊導航條上的分類的時候,會根據選中的分類顯示下面的數據。先看布局文件
什麼是線程?線程或者線程執行本質上就是一串命令(也是程序代碼),然後我們把它發送給操作系統執行。一般來說,我們的CPU在任何時候一個核只能處理一個線程。多核處理器(目前大
生命周期一.正常情況下生命周期如圖正常生命周期 開起activity調用onCreate() onStart() onResume(),按下返回鍵 onPause() o