編輯:關於Android編程
使用Camera控制拍照的幾個步驟:
1、調用Camera的open()打開相機
2、調用Camera的getParameters()獲取拍照參數。該方法返回一個Camera.Paremeters對象
3、調用Camera.Parameters對象方法設置拍照的參數
4、調用Camera.startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)方法設置使用哪個SurfaceView來顯示取景圖片。
5、調用Camera的takePicture()方法進行拍照
6、結束程序時,調用Camera的stopPreview()結束取景預覽,並調用release()方法釋放資源
實例:
package com.android.xiong.cameratest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.LayoutInflater;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
public class MainActivity extends Activity {
SurfaceView sView;
SurfaceHolder surfaceHodler;
int screenWidth, screenHeight;
// 定義系統所用的照相機
Camera camera;
// 是否存在預覽中
boolean isPreview = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
// 獲取窗口管理器
WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
// 獲取屏幕的寬和高
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
sView = (SurfaceView) findViewById(R.id.sView);
// 設置surface不需要自己的維護緩存區
sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 獲得SurfaceView的SurfaceHolder
surfaceHodler = sView.getHolder();
// 為srfaceHolder添加一個回調監聽器
surfaceHodler.addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// 如果camera不為null,釋放攝像頭
if (camera != null) {
if (isPreview)
camera.stopPreview();
camera.release();
camera = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// 打開攝像頭
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
}
});
}
private void initCamera() {
if (!isPreview) {
// 此處默認打開後置攝像頭
// 通過傳入參數可以打開前置攝像頭
camera = Camera.open();
camera.setDisplayOrientation(90);
}
if (!isPreview && camera != null) {
Camera.Parameters parameters = camera.getParameters();
// 設置預覽照片的大小
parameters.setPreviewSize(screenWidth, screenHeight);
// 設置預覽照片時每秒顯示多少幀的最小值和最大值
parameters.setPreviewFpsRange(4, 10);
// 設置照片的格式
parameters.setPictureFormat(ImageFormat.JPEG);
// 設置JPG照片的質量
parameters.set("jpeg-quality", 85);
// 設置照片的大小
parameters.setPictureSize(screenWidth, screenHeight);
// 通過SurfaceView顯示取景畫面
try {
camera.setPreviewDisplay(surfaceHodler);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 開始預覽
camera.startPreview();
isPreview = true;
}
}
public void capture(View source) {
if (camera != null) {
// 控制攝像頭自動對焦後才拍攝
camera.autoFocus(autoFocusCallback);
}
}
AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean arg0, Camera arg1) {
if (arg0) {
// takePicture()方法需要傳入三個監聽參數
// 第一個監聽器;當用戶按下快門時激發該監聽器
// 第二個監聽器;當相機獲取原始照片時激發該監聽器
// 第三個監聽器;當相機獲取JPG照片時激發該監聽器
camera.takePicture(new ShutterCallback() {
@Override
public void onShutter() {
// 按下快門瞬間會執行此處代碼
}
}, new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// 此處代碼可以決定是否需要保存原始照片信息
}
}, myJpegCallback);
}
}
};
PictureCallback myJpegCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 根據拍照所得的數據創建位圖
final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,
data.length);
// 加載布局文件
View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
final EditText potoName = (EditText) saveDialog
.findViewById(R.id.photoNmae);
// 獲取saveDialog對話框上的ImageView組件
ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
// 顯示剛剛拍得的照片
show.setImageBitmap(bm);
// 使用AlertDialog組件
new AlertDialog.Builder(MainActivity.this)
.setView(saveDialog)
.setNegativeButton("取消", null)
.setPositiveButton("保存",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0,
int arg1) {
// 創建一個位於SD卡上的文件
File file = new File(Environment
.getExternalStorageDirectory()
+ "/"
+ potoName.getText().toString()
+ ".jpg");
FileOutputStream fileOutStream=null;
try {
fileOutStream=new FileOutputStream(file);
//把位圖輸出到指定的文件中
bm.compress(CompressFormat.JPEG, 100, fileOutStream);
fileOutStream.close();
} catch (IOException io) {
io.printStackTrace();
}
}
}).show();
//重新浏覽
camera.stopPreview();
camera.startPreview();
isPreview=true;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
RecycleView從顯示到下拉刷新和加載更多
RecycleView出來已經有一兩個年頭了最近在項目中完全替換掉了ListView很有必要的寫一篇記錄一下使用過程,以便以後溫故而知新。RecycleView的使用場景
詳解Android更改APP語言模式的實現過程
一、效果圖二、描述更改Android項目中的語言,這個作用於只用於此APP,不會作用於整個系統三、解決方案(一)布局文件<LinearLayout xmlns:an
Android自定義View——實現理財類APP七日年化收益折線圖效果
這段時間的自定義View學習,學會了繪制柱狀圖、繪制折線圖、繪制進度控件,那我們今天就來聊聊另外一種自定義的View,這就是我們常見的七日年化收益折線圖效果。先看看長什麼
深入Android 五大布局對象的應用
FrameLayout(幀布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableL
【我的Android進階之旅】解決strings.xml格式化占位符錯誤: Multiple substitutions specified in non-positional format
今天有一個Android新手使用strings.xml進行格式化的時候