應(yīng)用場景:
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比百色網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式百色網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋百色地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
在Android開發(fā)過程中,有時(shí)需要調(diào)用手機(jī)自身設(shè)備的功能,本文側(cè)重?cái)z像頭拍照功能的調(diào)用。
知識(shí)點(diǎn)介紹:
使用權(quán)限:調(diào)用手機(jī)自身設(shè)備功能(攝像頭拍照功能),應(yīng)該確保已經(jīng)在AndroidManifest.xml中正確聲明了對攝像頭的使用及其它相關(guān)的feature。
Class類:
1、 SurfaceView
視圖(View)的繼承類,這個(gè)視圖里內(nèi)嵌了一個(gè)專門用于繪制的Surface。你可以控制這個(gè)Surface的格式和尺寸。Surfaceview控制這個(gè)Surface的繪制位置。
2、 SurfaceHolder
SurfaceHolder是控制surface的一個(gè)抽象接口,你可以通過SurfaceHolder來控制surface的尺寸和格式,或者修改surface的像素,監(jiān)視surface的變化等等,SurfaceHolder是SurfaceView的典型接口。
3、 SurfaceHolder.Callback
用戶可以實(shí)現(xiàn)此接口接收surface變化的消息。當(dāng)用在一個(gè)SurfaceView 中時(shí), 它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之間有效。設(shè)置Callback的方法是SurfaceHolder.addCallback。
使用方式:
第一步:新建一個(gè)Android項(xiàng)目CameraTest,包含兩個(gè)Activity: MainActivity、CameraActivity。
第二步:
activity_main.xml
MainActivity.java
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity { private Button cameraButton; //拍照按鈕 private Button quitButton; //退出按鈕 private ImageView imageView; //圖片顯示 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } private void initViews() { imageView = (ImageView) findViewById(R.id.main_image); // 從本地取圖片(在sdcard中獲取文件) Bitmap bitmap = getLoacalBitmap("/sdcard/mhc.jpg"); Log.e("msgTag", new File("/sdcard/mhc.jpg").exists()+"=========="); imageView .setImageBitmap(bitmap); //設(shè)置Bitmap cameraButton = (Button) findViewById(R.id.main_camera); quitButton = (Button) findViewById(R.id.main_quit); MainOnClickListener mainOnClickListener = new MainOnClickListener(); cameraButton.setOnClickListener(mainOnClickListener); quitButton.setOnClickListener(mainOnClickListener); } private class MainOnClickListener implements OnClickListener{ @Override public void onClick(View v) { switch (v.getId()) { case R.id.main_camera: startActivity(new Intent(MainActivity.this, CameraActivity.class)); break; case R.id.main_quit: MainActivity.this.finish(); break; default: break; } } } /** * 根據(jù)文件路徑獲取所需要文件,并將該文件封裝成Bitmap對象返回 * @param fileUrl * @return */ public static Bitmap getLoacalBitmap(String fileUrl) { try { FileInputStream fis = new FileInputStream(fileUrl); return BitmapFactory.decodeStream(fis); ///把流轉(zhuǎn)化為Bitmap圖片 } catch (FileNotFoundException e) { e.printStackTrace(); return null; } } }
activity_camera.xml
CameraActivity.java
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.graphics.ImageFormat; import android.hardware.Camera; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class CameraActivity extends Activity { private String tag ="CameraActivity"; private SurfaceView surfaceView; //Surface的控制器 private SurfaceHolder surfaceHolder; private Camera camera; private Button saveButton; //拍照的回調(diào)接口 private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { new SavePictureTask().execute(data); camera.startPreview(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); initViews(); } private void initViews() { saveButton = (Button) findViewById(R.id.camera_save); surfaceView = (SurfaceView) findViewById(R.id.camera_preview); surfaceHolder = surfaceView.getHolder(); // 給SurfaceView當(dāng)前的持有者 SurfaceHolder 一個(gè)回調(diào)對象。 //用戶可以實(shí)現(xiàn)此接口接收surface變化的消息。當(dāng)用在一個(gè)SurfaceView 中時(shí), //它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之間有效。 //設(shè)置Callback的方法是SurfaceHolder.addCallback. //實(shí)現(xiàn)過程一般繼承SurfaceView并實(shí)現(xiàn)SurfaceHolder.Callback接口 surfaceHolder.addCallback(surfaceCallback); // 設(shè)置surface不需要自己的維護(hù)緩存區(qū) surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); saveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { camera.takePicture(null, null, pictureCallback); // Camera.takePicture(shutterCallback,rawCallback,pictureCallback ); // private ShutterCallback shutterCallback = new ShutterCallback(){ // public void onShutter(){ // /* 按快門瞬間會(huì)執(zhí)行這里的代碼 */ // } // }; // private PictureCallback rawCallback = new PictureCallback(){ // public void onPictureTaken(byte[] _data, Camera _camera){ // /* 如需要處理 raw 則在這里 寫代碼 */ // } // }; // //當(dāng)拍照后 存儲(chǔ)JPG文件到 sd卡 // PictureCallback pictureCallback=new PictureCallback(){ // public void onPictureTaken(byte[] data,Camera camera) { // FileOutputStream outSteam=null; // try{ // SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss"); // String times=format.format((new Date())); // outSteam=new FileOutputStream("/sdcard/"+times+"mhc.jpg"); // outSteam.write(data); // outSteam.close(); // }catch(FileNotFoundException e){ // Log.d("Camera", "row"); // } catch (IOException e) { // e.printStackTrace(); // } // }; // }; } }); } //SurfaceView當(dāng)前的持有者的回調(diào)接口的實(shí)現(xiàn) SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); Log.e(tag, "攝像頭Open完成"); try { camera.setPreviewDisplay(holder); } catch (IOException e) { camera.release(); camera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters parameters = camera.getParameters(); parameters.setPictureFormat(ImageFormat.JPEG); camera.setDisplayOrientation(0); camera.setParameters(parameters); camera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); camera = null; } }; class SavePictureTask extends AsyncTask{ @Override protected String doInBackground(byte[]... params) { File picture = new File("/sdcard/mhc.jpg"); try { FileOutputStream fos = new FileOutputStream(picture.getPath()); fos.write(params[0]); fos.close(); } catch (Exception e) { e.printStackTrace(); } Log.e(tag, "照片保存完成"); CameraActivity.this.finish(); return null; } } }
下載地址:Android實(shí)現(xiàn)攝像頭拍照功能
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。