android自定義Camera拍照并查看圖片
本文實例為大家分享了android自定義Camera拍照并查看圖片的具體代碼,供大家參考,具體內(nèi)容如下
1、打開相機(jī)
a.預(yù)覽拍攝圖片,需用到SurfaceView,并且實現(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ī)并開啟預(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();
};
}
/**
** 實現(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ī)主頁面處理
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è)置對焦方式,這里設(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");
// 使用流進(jìn)行讀寫
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暫停時我們釋放相機(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、啟動activity(設(shè)置拍照完圖片路徑返回顯示圖片處理,一定要對圖片進(jìn)行采樣率操作(很可能拍照的圖片太多而無法顯示,又不報任何異常))
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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android自定義Camera實現(xiàn)錄像和拍照
- Android自定義Camera實現(xiàn)拍照功能
- Android實現(xiàn)Camera2預(yù)覽和拍照效果
- Android Camera實現(xiàn)毫秒級拍照實例
- Android中使用Camera類編寫手機(jī)拍照App的實例教程
- android系統(tǒng)在靜音模式下關(guān)閉camera拍照聲音的方法
- Android實現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android啟動相機(jī)拍照并返回圖片
- Android拍照保存在系統(tǒng)相冊不顯示的問題解決方法
- Android自定義Camera實現(xiàn)拍照小功能
相關(guān)文章
Android 開機(jī)應(yīng)用掃描相關(guān)總結(jié)
本篇文章只是作為指南引導(dǎo)去看PkMS,不會貼大段代碼進(jìn)行分析,更多是基于方法分析實現(xiàn)的邏輯,另外就是代碼是基于Android 11,與Android 10之前代碼有比較大的差別。2021-05-05
Android開發(fā)實現(xiàn)多進(jìn)程彈窗效果
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)實現(xiàn)多進(jìn)程彈窗效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Android Studio中生成aar文件及本地方式使用aar文件的方法
這篇文章給大家講解Android Studio中生成aar文件以及本地方式使用aar文件的方法,也就是說 *.jar 與 *.aar 的生成與*.aar導(dǎo)入項目方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-12-12
Android自定義ImageView實現(xiàn)自動放大縮小動畫
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實現(xiàn)自動放大縮小動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Android TextView顯示Html類解析的網(wǎng)頁和圖片及自定義標(biāo)簽用法示例
這篇文章主要介紹了Android TextView顯示Html類解析的網(wǎng)頁和圖片及自定義標(biāo)簽用法,實例分析了Android中TextView控件的使用技巧,需要的朋友可以參考下2016-07-07
Android使用Jetpack Compose開發(fā)零基礎(chǔ)起步教程
Jetpack Compose是用于構(gòu)建原生Android UI的現(xiàn)代工具包。Jetpack Compose使用更少的代碼,強(qiáng)大的工具和直觀的Kotlin API,簡化并加速了Android上的UI開發(fā)2023-04-04
Android中使用Theme來解決啟動app時出現(xiàn)的空白屏問題
相信大多數(shù)人一開始都會對啟動app的時候出現(xiàn)先白瓶或者黑屏然后才進(jìn)入第一個界面,例如:SplashActivity。那這是什么原因造成的呢?下面小編給大家介紹下2016-12-12

