網(wǎng)站首頁 編程語言 正文
本文實例為大家分享了Android調(diào)用外置攝像頭的具體代碼,供大家參考,具體內(nèi)容如下
1、布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? xmlns:android="http://schemas.android.com/apk/res/android"> ? ? <TextureView ? ? ? ? android:id="@+id/textureview" ? ? ? ? android:layout_width="1dp" ? ? ? ? android:layout_height="1dp"/> ? ? <ImageButton ? ? ? ? android:id="@+id/play" ? ? ? ? android:layout_width="60dp" ? ? ? ? android:layout_height="60dp" ? ? ? ? android:layout_centerHorizontal="true" ? ? ? ? android:layout_alignParentBottom="true" ? ? ? ? android:background="@drawable/ic_launcher_background" ? ? ? ? android:contentDescription="@string/app_name" ? ? ? ? android:layout_marginBottom="10dp"/> </RelativeLayout>
2、相應的MainActivity.java的主要代碼如下
package com.deepreality.takephotowithusbcamera; import android.Manifest; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.SurfaceTexture; import android.hardware.Camera; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.TextureView; import android.view.View; import android.widget.ImageButton; import android.widget.Toast; import com.tbruyelle.rxpermissions2.RxPermissions; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, View.OnClickListener { ? ? private static final String TAG = MainActivity.class.getSimpleName(); ? ? private Camera mCamera; ? ? private ImageButton mPlayButton; ? ? private RxPermissions rxPermissions; ? ? private int permissionNum; ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? rxPermissions = new RxPermissions(MainActivity.this); ? ? ? ? checkUserAllPermissions(); ? ? ? ? mPlayButton = (ImageButton) findViewById(R.id.play); ? ? ? ? mPlayButton.setOnClickListener(this); ? ? ? ? ((TextureView) findViewById(R.id.textureview)) ? ? ? ? ? ? ? ? .setSurfaceTextureListener(this); ? ? } ? ? private void takePic() { ? ? ? ? if (mCamera != null) { ? ? ? ? ? ? //調(diào)用抓拍攝像頭抓拍 ? ? ? ? ? ? mCamera.takePicture(null, null, pictureCallback); ? ? ? ? } else { ? ? ? ? ? ? Log.e("TAG", "請檢查攝像頭!"); ? ? ? ? } ? ? } ? ? private Bitmap mBitmap; ? ? public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { ? ? ? ? @Override ? ? ? ? public void onPictureTaken(byte[] data, Camera camera) { ? ? ? ? ? ? Log.i("ygy", "onPictureTaken"); ? ? ? ? ? ? SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式 ? ? ? ? ? ? System.out.println(df.format(new Date()));// new Date()為獲取當前系統(tǒng)時間 ? ? ? ? ? ? String picName = df.format(new Date()); ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "正在保存...", Toast.LENGTH_LONG).show(); ? ? ? ? ? ? mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); ? ? ? ? ? ? File file = new File("/storage/emulated/0/" + picName + ".jpg"); ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? file.createNewFile(); ? ? ? ? ? ? ? ? BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file)); ? ? ? ? ? ? ? ? mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); ? ? ? ? ? ? ? ? os.flush(); ? ? ? ? ? ? ? ? os.close(); ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "圖像保存成功", Toast.LENGTH_LONG).show(); ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? }; ? ? @Override ? ? public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { ? ? ? ? mCamera = Camera.open(0); ? ? ? ? if (mCamera != null) { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? mCamera.setPreviewTexture(surface); ? ? ? ? ? ? ? ? mCamera.startPreview(); ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? Log.d("TAG", e.getMessage()); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? @Override ? ? protected void onStop() { ? ? ? ? if (mCamera != null) { ? ? ? ? ? ? mCamera.stopPreview(); ? ? ? ? ? ? mCamera.release(); ? ? ? ? ? ? mCamera = null; ? ? ? ? } ? ? ? ? super.onStop(); ? ? } ? ? @Override ? ? public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { ? ? } ? ? @Override ? ? public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { ? ? ? ? if (mCamera != null) { ? ? ? ? ? ? mCamera.stopPreview(); ? ? ? ? ? ? mCamera.release(); ? ? ? ? ? ? mCamera = null; ? ? ? ? } ? ? ? ? return false; ? ? } ? ? @Override ? ? public void onSurfaceTextureUpdated(SurfaceTexture surface) { ? ? } ? ? @Override ? ? public void onClick(View v) { ? ? ? ? if (mCamera == null) { ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ? takePic(); ? ? } ? ? /** ? ? ?* 檢查并獲取用戶權限 ? ? ?*/ ? ? private void checkUserAllPermissions() { ? ? ? ? rxPermissions ? ? ? ? ? ? ? ? .requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE, ? ? ? ? ? ? ? ? ? ? ? ? Manifest.permission.CAMERA ? ? ? ? ? ? ? ? ) ? ? ? ? ? ? ? ? .subscribe(permission -> { ? ? ? ? ? ? ? ? ? ? if (permission.granted) { ? ? ? ? ? ? ? ? ? ? } else if (permission.shouldShowRequestPermissionRationale) { ? ? ? ? ? ? ? ? ? ? } else {} ? ? ? ? ? ? ? ? ? ? permissionNum ++; ? ? ? ? ? ? ? ? ? ? if (permissionNum == 2) { ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? }); ? ? } }
3、注意在清單文件里AndroidManifest.xml添加用戶權限
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
原文鏈接:https://blog.csdn.net/lpCrazyBoy/article/details/89314512
相關推薦
- 2022-08-07 C++從文件中提取英文單詞的實現(xiàn)方法_C 語言
- 2022-06-18 Elasticsearch之基本查詢及組合查詢操作示例_其它綜合
- 2022-07-13 Python內(nèi)建類型float源碼學習_python
- 2023-04-12 Python?issubclass和isinstance函數(shù)的具體使用_python
- 2022-07-16 MultipartFile與base64互轉
- 2022-07-21 python logging模塊使用介紹
- 2022-05-26 openwrt安裝docker并啟動的操作方法_docker
- 2022-10-10 React?Hooks鉤子中API的使用示例分析_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支