Android實(shí)現(xiàn)靜默拍照功能
本文實(shí)例為大家分享了Android實(shí)現(xiàn)靜默拍照功能的具體代碼,供大家參考,具體內(nèi)容如下
1.申請(qǐng)權(quán)限(6.0以后要?jiǎng)討B(tài)申請(qǐng))
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2.創(chuàng)建相機(jī)工具類 CameraPreview:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); //初始化Camera對(duì)象 mCamera = camera; //得到SurfaceHolder對(duì)象 mHolder = getHolder(); //添加回調(diào),得到Surface的三個(gè)聲明周期方法 mHolder.addCallback(this); // deprecated setting, but required on Android versions prior to 3.0 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceCreated(SurfaceHolder holder) { try { //設(shè)置預(yù)覽方向 mCamera.setDisplayOrientation(90); //把這個(gè)預(yù)覽效果展示在SurfaceView上面 mCamera.setPreviewDisplay(holder); //開啟預(yù)覽效果 mCamera.startPreview(); } catch (IOException e) { // Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (holder.getSurface() == null) { return; } //停止預(yù)覽效果 mCamera.stopPreview(); //重新設(shè)置預(yù)覽效果 try { mCamera.setPreviewDisplay(mHolder); } catch (IOException e) { e.printStackTrace(); } mCamera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }
3.創(chuàng)建xml文件 (要想用戶無感拍照,可把視圖寬高調(diào)為0.1dp或者隱藏在別的頁面之下):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/camera_frame" android:layout_width="match_parent" android:layout_height="500dp"> </FrameLayout> </LinearLayout>
4.主類實(shí)現(xiàn)靜默拍照:
public class CameraActivity extends BaseActivity{ private FrameLayout cameraFrame; private Camera mCamera; private TextView cameraTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); cameraFrame = (FrameLayout) findViewById(R.id.camera_frame); cameraTv = (TextView) findViewById(R.id.camera_tv); int numberOfCameras = Camera.getNumberOfCameras();// 獲取攝像頭個(gè)數(shù) //遍歷攝像頭信息 for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) { Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, cameraInfo); if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//前置攝像頭 mCamera = Camera.open(cameraId);//打開攝像頭 } } CameraPreview mPreview = new CameraPreview(this, mCamera); cameraFrame.addView(mPreview); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); // 設(shè)置1秒后自動(dòng)拍照,可調(diào)節(jié) //得到照相機(jī)的參數(shù) Camera.Parameters parameters = mCamera.getParameters(); //圖片的格式 parameters.setPictureFormat(ImageFormat.JPEG); //預(yù)覽的大小是多少 parameters.setPreviewSize(800, 400); //設(shè)置對(duì)焦模式,自動(dòng)對(duì)焦 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); //對(duì)焦成功后,自動(dòng)拍照 mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { //獲取照片 mCamera.takePicture(null, null, mPictureCallback); } } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }); } @Override protected void onStart() { super.onStart(); } //獲取照片中的接口回調(diào) Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { FileOutputStream fos = null; String mFilePath = Environment.getExternalStorageDirectory().getPath() + File.separator + "tt005.png"; //文件 File tempFile = new File(mFilePath); try { // fos = new FileOutputStream(tempFile); fos.write(data); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //實(shí)現(xiàn)連續(xù)拍多張的效果 // mCamera.startPreview(); // if (fos != null) { // try { // fos.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } } } }; }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android打開系統(tǒng)相機(jī)并拍照的2種顯示方法
- Android如何調(diào)用系統(tǒng)相機(jī)拍照
- Android 系統(tǒng)相機(jī)拍照后相片無法在相冊(cè)中顯示解決辦法
- 適配AndroidQ拍照和讀取相冊(cè)圖片的實(shí)現(xiàn)方法
- Android快速實(shí)現(xiàn)無預(yù)覽拍照功能
- Android 拍照選擇圖片并上傳功能的實(shí)現(xiàn)思路(包含權(quán)限動(dòng)態(tài)獲取)
- Android 自定義view仿微信相機(jī)單擊拍照長按錄視頻按鈕
- android實(shí)現(xiàn)簡單拍照功能
- android 7自定義相機(jī)預(yù)覽及拍照功能
- Android使用系統(tǒng)相機(jī)進(jìn)行拍照的步驟
相關(guān)文章
Android仿IOS ViewPager滑動(dòng)進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android仿IOS ViewPager滑動(dòng)進(jìn)度條的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01基于Android實(shí)現(xiàn)自動(dòng)滾動(dòng)布局
在平時(shí)的開發(fā)中,有時(shí)會(huì)碰到這樣的場景,設(shè)計(jì)上布局的內(nèi)容會(huì)比較緊湊,導(dǎo)致部分機(jī)型上某些布局中的內(nèi)容顯示不完全,或者在數(shù)據(jù)內(nèi)容多的情況下,單行無法顯示所有內(nèi)容,這里給大家簡單介紹下布局自動(dòng)滾動(dòng)的一種實(shí)現(xiàn)方式,感興趣的朋友可以參考下2023-12-12Android端“被擠下線”功能的單點(diǎn)登錄實(shí)現(xiàn)
本篇文章主要介紹了Android端“被擠下線”功能的單點(diǎn)登錄實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Android開發(fā) -- setTag的妙用和The key must be an application-specif
本文主要介紹Android開發(fā)setTag的妙用,小編覺得挺實(shí)用的,給大家一個(gè)參考,希望對(duì)大家學(xué)習(xí)有所幫助。2016-06-06