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ī)工具類(lèi) 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);
//開(kāi)啟預(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文件 (要想用戶無(wú)感拍照,可把視圖寬高調(diào)為0.1dp或者隱藏在別的頁(yè)面之下):
<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.主類(lèi)實(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);//打開(kāi)攝像頭
}
}
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();
// }
// }
}
}
};
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android打開(kāi)系統(tǒng)相機(jī)并拍照的2種顯示方法
- Android如何調(diào)用系統(tǒng)相機(jī)拍照
- Android 系統(tǒng)相機(jī)拍照后相片無(wú)法在相冊(cè)中顯示解決辦法
- 適配AndroidQ拍照和讀取相冊(cè)圖片的實(shí)現(xiàn)方法
- Android快速實(shí)現(xiàn)無(wú)預(yù)覽拍照功能
- Android 拍照選擇圖片并上傳功能的實(shí)現(xiàn)思路(包含權(quán)限動(dòng)態(tài)獲取)
- Android 自定義view仿微信相機(jī)單擊拍照長(zhǎng)按錄視頻按鈕
- android實(shí)現(xiàn)簡(jiǎn)單拍照功能
- android 7自定義相機(jī)預(yù)覽及拍照功能
- Android使用系統(tǒng)相機(jī)進(jìn)行拍照的步驟
相關(guān)文章
Android使用Item Swipemenulistview實(shí)現(xiàn)仿QQ側(cè)滑刪除功能
大家都用過(guò)QQ,肯定有人好奇QQ滑動(dòng)刪除Item的效果是怎樣實(shí)現(xiàn)的,其實(shí)我們使用Swipemenulistview就可以簡(jiǎn)單的實(shí)現(xiàn)。這篇文章主要介紹了Android使用ItemSwipemenulistview實(shí)現(xiàn)仿QQ側(cè)滑刪除功能,需要的朋友可以參考下2017-02-02
Android實(shí)現(xiàn)的RecyclerView適配器
這篇文章主要介紹了Android實(shí)現(xiàn)的RecyclerView適配器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03
探究Android客戶端網(wǎng)絡(luò)預(yù)連接優(yōu)化機(jī)制
一般情況下,我們都是用一些封裝好的網(wǎng)絡(luò)框架去請(qǐng)求網(wǎng)絡(luò),對(duì)底層實(shí)現(xiàn)不甚關(guān)注,而大部分情況下也不需要特別關(guān)注處理。了解底層的一些實(shí)現(xiàn),有益于我們對(duì)網(wǎng)絡(luò)加載進(jìn)行優(yōu)化。本文就是關(guān)于根據(jù)http的連接復(fù)用機(jī)制來(lái)優(yōu)化網(wǎng)絡(luò)加載速度的原理與細(xì)節(jié)2021-06-06
深入Android Handler,MessageQueue與Looper關(guān)系
這篇文章主要介紹了深入Android Handler,MessageQueue與Looper關(guān)系,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android drawable微技巧,你不知道的drawable細(xì)節(jié)
今天小編就為大家分享一篇關(guān)于Android drawable微技巧,你不知道的drawable細(xì)節(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Flutter實(shí)現(xiàn)不同縮放動(dòng)畫(huà)效果詳解
這篇文章主要為大家詳細(xì)介紹了Flutter利用不同組件(ScaleTransition、SizeTransition、AnimatedSize和AnimatedBuilder)實(shí)現(xiàn)不同縮放動(dòng)畫(huà)效果,感興趣的可以動(dòng)手嘗試一下2022-06-06
Android Retrofit 2.0框架上傳圖片解決方案
這篇文章主要介紹了Android Retrofit 2.0框架上傳一張與多張圖片解決方案,感興趣的小伙伴們可以參考一下2016-03-03
Android超詳細(xì)講解組件LinearLayout的使用
LinearLayout又稱作線性布局,是一種非常常用的布局。正如它的名字所描述的一樣,這個(gè)布局會(huì)將它所包含的控件在線性方向上依次排列。既然是線性排列,肯定就不僅只有一個(gè)方向,這里一般只有兩個(gè)方向:水平方向和垂直方向2022-03-03

