android自定義Camera拍照并查看圖片
本文實(shí)例為大家分享了android自定義Camera拍照并查看圖片的具體代碼,供大家參考,具體內(nèi)容如下
1、打開(kāi)相機(jī)
a.預(yù)覽拍攝圖片,需用到SurfaceView,并且實(shí)現(xiàn)其回調(diào)函數(shù)implements SurfaceHolder.Callback;
activity_camera.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:id="@+id/btn_camera" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="拍照" /> </LinearLayout>
2、獲取相機(jī)并開(kāi)啟預(yù)覽
/** * 獲取系統(tǒng)相機(jī) * * @return */ private Camera getcCamera() { Camera camera = null; try { camera = Camera.open(); } catch (Exception e) { camera = null; } return camera; }
/** * 顯示相機(jī)預(yù)覽圖片 * * @return */ private void showCameraView(Camera camera,SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); camera.startPreview(); }catch (Exception e){ e.printStackTrace(); }; }
/** ** 實(shí)現(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、相機(jī)主頁(yè)面處理
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)前相機(jī)參數(shù) Camera.Parameters parameters = mCamera.getParameters(); // 設(shè)置相片格式 parameters.setPictureFormat(ImageFormat.JPEG); // 設(shè)置預(yù)覽大小 parameters.setPreviewSize(800, 480); // 設(shè)置對(duì)焦方式,這里設(shè)置自動(dòng)對(duì)焦 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { // 判斷是否對(duì)焦成功 if (success) { // 拍照 第三個(gè)參數(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"); // 使用流進(jìn)行讀寫(xiě) 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暫停時(shí)我們釋放相機(jī)內(nèi)存 clearCamera(); } @Override protected void onDestroy() { super.onDestroy(); } /** * 釋放相機(jī)的內(nèi)存 */ private void clearCamera() { // 釋放hold資源 if (mCamera != null) { // 停止預(yù)覽 mCamera.stopPreview(); mCamera.setPreviewCallback(null); // 釋放相機(jī)資源 mCamera.release(); mCamera = null; } }
4、啟動(dòng)activity(設(shè)置拍照完圖片路徑返回顯示圖片處理,一定要對(duì)圖片進(jìn)行采樣率操作(很可能拍照的圖片太多而無(wú)法顯示,又不報(bào)任何異常))
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ù)需求的寬和高以及圖片實(shí)際的寬和高計(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的實(shí)際寬度 if (width <= 0) { width = lp.width;// 獲取imageview在layout中聲明的寬度 } if (width <= 0) { width = displayMetrics.widthPixels; } int height = imageView.getHeight();// 獲取imageview的實(shí)際高度 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; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android自定義Camera實(shí)現(xiàn)錄像和拍照
- Android自定義Camera實(shí)現(xiàn)拍照功能
- Android實(shí)現(xiàn)Camera2預(yù)覽和拍照效果
- Android Camera實(shí)現(xiàn)毫秒級(jí)拍照實(shí)例
- Android中使用Camera類(lèi)編寫(xiě)手機(jī)拍照App的實(shí)例教程
- android系統(tǒng)在靜音模式下關(guān)閉camera拍照聲音的方法
- Android實(shí)現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android啟動(dòng)相機(jī)拍照并返回圖片
- Android拍照保存在系統(tǒng)相冊(cè)不顯示的問(wèn)題解決方法
- Android自定義Camera實(shí)現(xiàn)拍照小功能
相關(guān)文章
Android 開(kāi)機(jī)應(yīng)用掃描相關(guān)總結(jié)
本篇文章只是作為指南引導(dǎo)去看PkMS,不會(huì)貼大段代碼進(jìn)行分析,更多是基于方法分析實(shí)現(xiàn)的邏輯,另外就是代碼是基于Android 11,與Android 10之前代碼有比較大的差別。2021-05-05Android開(kāi)發(fā)實(shí)現(xiàn)多進(jìn)程彈窗效果
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)實(shí)現(xiàn)多進(jìn)程彈窗效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Android Studio中生成aar文件及本地方式使用aar文件的方法
這篇文章給大家講解Android Studio中生成aar文件以及本地方式使用aar文件的方法,也就是說(shuō) *.jar 與 *.aar 的生成與*.aar導(dǎo)入項(xiàng)目方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-12-12Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android 自定義手勢(shì)--輸入法手勢(shì)技術(shù)
這篇文章主要介紹了Android 自定義手勢(shì)--輸入法手勢(shì)技術(shù)的相關(guān)資料,需要的朋友可以參考下2016-10-10詳解Android.activity銷(xiāo)毀流程的工作原理
這篇文章主要介紹了詳解Activity銷(xiāo)毀流程的工作原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Android TextView顯示Html類(lèi)解析的網(wǎng)頁(yè)和圖片及自定義標(biāo)簽用法示例
這篇文章主要介紹了Android TextView顯示Html類(lèi)解析的網(wǎng)頁(yè)和圖片及自定義標(biāo)簽用法,實(shí)例分析了Android中TextView控件的使用技巧,需要的朋友可以參考下2016-07-07老項(xiàng)目遷移AndroidStudio3.0遇到的坑
給大家分享了老的項(xiàng)目以及程序遷移到了AndroidStudio3.0遇到的坑和問(wèn)題解決辦法,希望給你做個(gè)參考。2017-11-11Android使用Jetpack Compose開(kāi)發(fā)零基礎(chǔ)起步教程
Jetpack Compose是用于構(gòu)建原生Android UI的現(xiàn)代工具包。Jetpack Compose使用更少的代碼,強(qiáng)大的工具和直觀的Kotlin API,簡(jiǎn)化并加速了Android上的UI開(kāi)發(fā)2023-04-04Android中使用Theme來(lái)解決啟動(dòng)app時(shí)出現(xiàn)的空白屏問(wèn)題
相信大多數(shù)人一開(kāi)始都會(huì)對(duì)啟動(dòng)app的時(shí)候出現(xiàn)先白瓶或者黑屏然后才進(jìn)入第一個(gè)界面,例如:SplashActivity。那這是什么原因造成的呢?下面小編給大家介紹下2016-12-12