Android 照相機(jī)的實(shí)例應(yīng)用
Android 照相機(jī)的實(shí)例應(yīng)用
關(guān)鍵技術(shù):
SurfaceHolder.Callback
public class MyCameraDemo extends Activity {
private SurfaceView surface = null ;
private Button but = null ;
private SurfaceHolder holder = null ;
private Camera cam = null ;
private boolean previewRunning = true ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.but = (Button) super.findViewById(R.id.but) ;
this.surface = (SurfaceView) super.findViewById(R.id.surface) ;
this.holder = this.surface.getHolder() ;
this.holder.addCallback(new MySurfaceViewCallback()) ;
//設(shè)置緩沖類型
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ;
//設(shè)置分辨率
this.holder.setFixedSize(600, 350);
this.but.setOnClickListener(new OnClickListenerImpl()) ;
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if(MyCameraDemo.this.cam != null) {
//自動(dòng)對(duì)焦
MyCameraDemo.this.cam.autoFocus(new AutoFocusCallbackImpl()) ;
}
}
}
private class MySurfaceViewCallback implements SurfaceHolder.Callback {
//當(dāng)預(yù)覽界面格式大小改變時(shí),調(diào)用
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
//初次實(shí)例化界面調(diào)用
public void surfaceCreated(SurfaceHolder holder) {
MyCameraDemo.this.cam = Camera.open(0) ; // 取得第一個(gè)攝像頭
//窗口服務(wù)
WindowManager manager = (WindowManager) MyCameraDemo.this
.getSystemService(Context.WINDOW_SERVICE);
//取得display顯示對(duì)象
Display display = manager.getDefaultDisplay() ;
//照相機(jī)參數(shù)
Parameters param = MyCameraDemo.this.cam.getParameters() ;
//將照相機(jī)預(yù)覽大小設(shè)置為display大小
param.setPreviewSize(display.getWidth(), display.getHeight()) ;
param.setPreviewFrameRate(5) ; // 一秒5幀
param.setPictureFormat(PixelFormat.JPEG) ; // 圖片形式
param.set("jpen-quality", 80) ;//圖片質(zhì)量,最高100
MyCameraDemo.this.cam.setParameters(param) ;
try {
MyCameraDemo.this.cam.setPreviewDisplay(MyCameraDemo.this.holder) ;
} catch (IOException e) {
}
MyCameraDemo.this.cam.startPreview() ; // 進(jìn)行預(yù)覽
MyCameraDemo.this.previewRunning = true ; // 已經(jīng)開始預(yù)覽
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(MyCameraDemo.this.cam != null) {
if(MyCameraDemo.this.previewRunning) {
MyCameraDemo.this.cam.stopPreview() ; // 停止預(yù)覽
MyCameraDemo.this.previewRunning = false ;
}
MyCameraDemo.this.cam.release() ;
}
}
}
private class AutoFocusCallbackImpl implements AutoFocusCallback {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success) { // 成功
MyCameraDemo.this.cam.takePicture(sc, pc, jpgcall) ;
}
}
}
private PictureCallback jpgcall = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) { // 保存圖片的操作
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
String fileName = Environment.getExternalStorageDirectory()
.toString()
+ File.separator
+ "mldnphoto"
+ File.separator
+ "MLDN_" + System.currentTimeMillis() + ".jpg";
File file = new File(fileName) ;
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs() ; // 創(chuàng)建文件夾
}
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) ;
bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos) ; // 向緩沖區(qū)之中壓縮圖片
bos.flush() ;
bos.close() ;
Toast.makeText(MyCameraDemo.this,
"拍照成功,照片已保存在" + fileName + "文件之中!", Toast.LENGTH_SHORT)
.show();
} catch (Exception e) {
Toast.makeText(MyCameraDemo.this,
"拍照失?。?, Toast.LENGTH_SHORT)
.show();
}
MyCameraDemo.this.cam.stopPreview() ;
MyCameraDemo.this.cam.startPreview() ;
}
} ;
private ShutterCallback sc = new ShutterCallback(){
@Override
public void onShutter() {
// 按下快門之后進(jìn)行的操作
}
} ;
private PictureCallback pc = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
}
} ;
}
主布局函數(shù)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/but"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="照相" />
<SurfaceView
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
以上就是Android 相機(jī)的使用方法,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android自定義View 使用PathMeasure簡(jiǎn)單模仿系統(tǒng)ProgressBar(四)
這篇文章主要為大家詳細(xì)介紹了Android自定義View,使用PathMeasure簡(jiǎn)單模仿系統(tǒng)ProgressBar,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android實(shí)現(xiàn)圖片點(diǎn)擊預(yù)覽效果(zoom動(dòng)畫)
本文主要介紹了Android實(shí)現(xiàn)圖片點(diǎn)擊預(yù)覽效果的方法步驟。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-03-03
Android開發(fā)實(shí)現(xiàn)ImageView寬度頂邊顯示,高度保持比例的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)ImageView寬度頂邊顯示,高度保持比例的方法,結(jié)合實(shí)例形式分析了Android ImageView界面布局及元素屬性動(dòng)態(tài)操作兩種功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-02-02
Android 實(shí)現(xiàn)單線程輪循機(jī)制批量下載圖片
這篇文章主要介紹了Android 單線程輪循機(jī)制批量下載圖片的相關(guān)資料,這里對(duì)實(shí)現(xiàn)步驟做了詳細(xì)介紹,需要的朋友可以參考下2017-07-07
Android實(shí)現(xiàn)ViewPage輪播圖效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)ViewPage輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Android實(shí)現(xiàn)簡(jiǎn)易記事本
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)易記事本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android通過LIstView顯示文件列表的兩種方法介紹
過ListView顯示SD卡中的文件列表一共有兩種方法,一是:通過繼承ListActivity顯示;二是:利用BaseAdapter顯示,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06
Android實(shí)現(xiàn)圖片轉(zhuǎn)高斯模糊以及高斯模糊布局
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片轉(zhuǎn)高斯模糊的方法,以及高斯模糊布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

