新聞中心
android中怎么通過自定義Camera實現(xiàn)拍照,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),枝江企業(yè)網(wǎng)站建設(shè),枝江品牌網(wǎng)站建設(shè),網(wǎng)站定制,枝江網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,枝江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
1、打開相機
a.預(yù)覽拍攝圖片,需用到SurfaceView,并且實現(xiàn)其回調(diào)函數(shù)implements SurfaceHolder.Callback;
activity_camera.xml
2、獲取相機并開啟預(yù)覽
/** * 獲取系統(tǒng)相機 * * @return */ private Camera getcCamera() { Camera camera = null; try { camera = Camera.open(); } catch (Exception e) { camera = null; } return camera; }
/** * 顯示相機預(yù)覽圖片 * * @return */ private void showCameraView(Camera camera,SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); camera.startPreview(); }catch (Exception e){ e.printStackTrace(); }; }
/** ** 實現(xiàn)界面回調(diào)處理 */ @Override public void surfaceCreated(SurfaceHolder holder) { showCameraView(mCamera, holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mCamera.stopPreview(); showCameraView(mCamera, holder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { clearCamera(); } }
3、相機主頁面處理
public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{ private SurfaceView sv; private Camera mCamera; private SurfaceHolder holder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); sv = (SurfaceView)findViewById(R.id.sv); holder = sv.getHolder(); holder.addCallback(this); findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 獲取當(dāng)前相機參數(shù) Camera.Parameters parameters = mCamera.getParameters(); // 設(shè)置相片格式 parameters.setPictureFormat(ImageFormat.JPEG); // 設(shè)置預(yù)覽大小 parameters.setPreviewSize(800, 480); // 設(shè)置對焦方式,這里設(shè)置自動對焦 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { // 判斷是否對焦成功 if (success) { // 拍照 第三個參數(shù)為拍照回調(diào) mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // data為完整數(shù)據(jù) File file = new File("/sdcard/photo.png"); // 使用流進行讀寫 try { FileOutputStream fos = new FileOutputStream(file); try { fos.write(data); // 關(guān)閉流 fos.close(); // 查看圖片 Intent intent = new Intent(); // 傳遞路徑 intent.putExtra("path", file.getAbsolutePath()); setResult(0,intent); finish(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } }); } }); }
@Override protected void onResume() { super.onResume(); if (mCamera == null) { mCamera = getCamera(); if (holder != null) { showCameraView(mCamera, holder); } } } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); // activity暫停時我們釋放相機內(nèi)存 clearCamera(); } @Override protected void onDestroy() { super.onDestroy(); } /** * 釋放相機的內(nèi)存 */ private void clearCamera() { // 釋放hold資源 if (mCamera != null) { // 停止預(yù)覽 mCamera.stopPreview(); mCamera.setPreviewCallback(null); // 釋放相機資源 mCamera.release(); mCamera = null; } }
4、啟動activity(設(shè)置拍照完圖片路徑返回顯示圖片處理,一定要對圖片進行采樣率操作(很可能拍照的圖片太多而無法顯示,又不報任何異常))
public class MainActivity extends AppCompatActivity { private ImageView cameraIv; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == 0 && requestCode == 100) { String path = data.getStringExtra("path"); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, options); ImageSize imageSize = getImageViewSize(cameraIv); options.inSampleSize = caculateInSampleSize(options, imageSize.width, imageSize.height); // 使用獲得到的InSampleSize再次解析圖片 options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(path, options); cameraIv.setImageBitmap(bitmap); } super.onActivityResult(requestCode, resultCode, data); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button openButton = (Button) findViewById(R.id.button); cameraIv = (ImageView) findViewById(R.id.imageView); openButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,CameraActivity.class); startActivityForResult(intent,100); } }); } /* 根據(jù)需求的寬和高以及圖片實際的寬和高計算SampleSize * * @param options * @param width * @param height * @return */ public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { int width = options.outWidth; int height = options.outHeight; int inSampleSize = 1; if (width > reqWidth || height > reqHeight) { int widthRadio = Math.round(width * 1.0f / reqWidth); int heightRadio = Math.round(height * 1.0f / reqHeight); inSampleSize = Math.max(widthRadio, heightRadio); } return inSampleSize; } public static ImageSize getImageViewSize(ImageView imageView) { ImageSize imageSize = new ImageSize(); DisplayMetrics displayMetrics = imageView.getContext().getResources() .getDisplayMetrics(); LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)imageView.getLayoutParams(); int width = imageView.getWidth();// 獲取imageview的實際寬度 if (width <= 0) { width = lp.width;// 獲取imageview在layout中聲明的寬度 } if (width <= 0) { width = displayMetrics.widthPixels; } int height = imageView.getHeight();// 獲取imageview的實際高度 if (height <= 0) { height = lp.height;// 獲取imageview在layout中聲明的寬度 } if (height <= 0) { height = displayMetrics.heightPixels; } imageSize.width = width; imageSize.height = height; return imageSize; } public static class ImageSize { int width; int height; } }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
文章標題:android中怎么通過自定義Camera實現(xiàn)拍照
標題鏈接:http://ef60e0e.cn/article/pogioe.html