Android自定義照相機實現(xiàn)_第1頁
Android自定義照相機實現(xiàn)_第2頁
Android自定義照相機實現(xiàn)_第3頁
Android自定義照相機實現(xiàn)_第4頁
Android自定義照相機實現(xiàn)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、最新Android自定義照相機實現(xiàn)Android自定義照相機實現(xiàn)拍照、保存到SD卡,利用Bundle在Acitivity交換數(shù)據(jù) 分類: 【Android多媒體開發(fā)系列】 【Android開發(fā)學(xué)習(xí)之路】 2022-05-14 21:36 12172人閱讀 HYPERLINK :/ l comments 評論(14) 收藏 HYPERLINK :/ l report o 舉報 舉報 ANDROIDAndroid自定義照相機實現(xiàn)近期小巫在學(xué)校有一個創(chuàng)新工程,也不是最近,是一個拖了很久的工程,之前一直沒有去搞,最近因為要中期檢查,搞得我跟小組成員一陣忙活,其實開發(fā)一款照相機軟件并不太難,下面就是通過

2、自定義的方式來實現(xiàn) 照相的功能。創(chuàng)立一個工程:FingerTakePicture首先來搞一下界面:html view plaincopyprint? 界面效果無法把預(yù)覽給截屏下來滴: 權(quán)限設(shè)置少不了:html view plaincopyprint? 主Activity: java view plaincopyprint? package;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;imp

3、ort;import;import;/*Android手指拍照*authorwwj*date2022/4/29*/publicclassMainActivityextendsActivityprivateViewlayout;privateCameracamera;privateCamera.Parametersparameters=null;Bundlebundle=null;/聲明一個Bundle對象,用來存儲數(shù)據(jù)OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);/顯

4、示界面setContentView();layout=this.findViewById();SurfaceViewsurfaceView=(SurfaceView)this.findViewById();surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceView.getHolder().setFixedSize(176,144);/設(shè)置Surface分辨率surfaceView.getHolder().setKeepScreenOn(true);/屏幕常亮surfaceView.ge

5、tHolder().addCallback(newSurfaceCallback();/為SurfaceView的句柄添加一個回調(diào)函數(shù)/*按鈕被點擊觸發(fā)的事件*paramv*/publicvoidbtnOnclick(Viewv)if(camera!=null)switch(v.getId()case:/拍照camera.takePicture(null,null,newMyPictureCallback();break;/*圖片被點擊觸發(fā)的時間*paramv*/publicvoidimageClick(Viewv)if(v.getId()=)if(bundle=null)Toast.make

6、Text(getApplicationContext(),R.string.takephoto,Toast.LENGTH_SHORT).show();elseIntentintent=newIntent(this,ShowPicActivity.class);intent.putExtras(bundle);startActivity(intent);privatefinalclassMyPictureCallbackimplementsPictureCallbackOverridepublicvoidonPictureTaken(bytedata,Cameracamera)trybundle

7、=newBundle();bundle.putByteArray(bytes,data);/將圖片字節(jié)數(shù)據(jù)保存在bundle當(dāng)中,實現(xiàn)數(shù)據(jù)交換saveToSDCard(data);/保存圖片到sd卡中Toast.makeText(getApplicationContext(),R.string.success,Toast.LENGTH_SHORT).show();camera.startPreview();/拍完照后,重新開始預(yù)覽catch(Exceptione)e.printStackTrace();/*將拍下來的照片存放在SD卡中*paramdata*throwsIOException*/

8、publicstaticvoidsaveToSDCard(bytedata)throwsIOExceptionDatedate=newDate();SimpleDateFormatformat=newSimpleDateFormat(yyyyMMddHHmmss);/格式化時間Stringfilename=format.format(date)+.jpg;FilefileFolder=newFile(Environment.getExternalStorageDirectory()+/finger/);if(!fileFolder.exists()/如果目錄不存在,那么創(chuàng)立一個名為finger

9、的目錄fileFolder.mkdir();FilejpgFile=newFile(fileFolder,filename);FileOutputStreamoutputStream=newFileOutputStream(jpgFile);/文件輸出流outputStream.write(data);/寫入sd卡中outputStream.close();/關(guān)閉輸出流privatefinalclassSurfaceCallbackimplementsCallback/拍照狀態(tài)變化時調(diào)用該方法OverridepublicvoidsurfaceChanged(SurfaceHolderholde

10、r,intformat,intwidth,intheight)parameters=camera.getParameters();/獲取各項參數(shù)parameters.setPictureFormat(PixelFormat.JPEG);/設(shè)置圖片格式parameters.setPreviewSize(width,height);/設(shè)置預(yù)覽大小parameters.setPreviewFrameRate(5);/設(shè)置每秒顯示4幀parameters.setPictureSize(width,height);/設(shè)置保存的圖片尺寸parameters.setJpegQuality(80);/設(shè)置照片

11、質(zhì)量/開始拍照時調(diào)用該方法OverridepublicvoidsurfaceCreated(SurfaceHolderholder)trycamera=Camera.open();/翻開攝像頭camera.setPreviewDisplay(holder);/設(shè)置用于顯示拍照影像的SurfaceHolder對象camera.setDisplayOrientation(getPreviewDegree(MainActivity.this);camera.startPreview();/開始預(yù)覽catch(Exceptione)e.printStackTrace();/停止拍照時調(diào)用該方法Over

12、ridepublicvoidsurfaceDestroyed(SurfaceHolderholder)if(camera!=null)camera.release();/釋放照相機camera=null;/*點擊 屏幕是,顯示兩個按鈕*/OverridepublicbooleanonTouchEvent(MotionEventevent)switch(event.getAction()caseMotionEvent.ACTION_DOWN:layout.setVisibility(ViewGroup.VISIBLE);/設(shè)置視圖可見break;returntrue;Overridepublic

13、booleanonKeyDown(intkeyCode,KeyEventevent)switch(keyCode)caseKeyEvent.KEYCODE_CAMERA:/按下拍照按鈕if(camera!=null&event.getRepeatCount()=0)/拍照/注:調(diào)用takePicture()方法進行拍照是傳入了一個PictureCallback對象當(dāng)程序獲取了拍照所得的圖片數(shù)據(jù)之后/,PictureCallback對象將會被回調(diào),該對象可以負(fù)責(zé)對相片進行保存或傳入網(wǎng)絡(luò)camera.takePicture(null,null,newMyPictureCallback();retu

14、rnsuper.onKeyDown(keyCode,event);/提供一個靜態(tài)方法,用于根據(jù) 方向獲得相機預(yù)覽畫面旋轉(zhuǎn)的角度publicstaticintgetPreviewDegree(Activityactivity)/獲得 的方向introtation=activity.getWindowManager().getDefaultDisplay().getRotation();intdegree=0;/根據(jù) 的方向計算相機預(yù)覽畫面應(yīng)該選擇的角度switch(rotation)caseSurface.ROTATION_0:degree=90;break;caseSurface.ROTATI

15、ON_90:degree=0;break;caseSurface.ROTATION_180:degree=270;break;caseSurface.ROTATION_270:degree=180;break;returndegree;package com.wwj.finger;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activ

16、ity;import android.content.Intent;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.os.Environment;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.Surface;import a

17、ndroid.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.ViewGroup;import android.widget.Toast;/* * Android手指拍照 * * author wwj * date 2022/4/29 */public class MainActivity extends Activity private View layout;pr

18、ivate Camera camera;private Camera.Parameters parameters = null;Bundle bundle = null; / 聲明一個Bundle對象,用來存儲數(shù)據(jù)Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/ 顯示界面setContentView(R.layout.activity_main);layout = this.findViewById(R.id.buttonLayout);SurfaceView

19、 surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceView.getHolder().setFixedSize(176, 144);/設(shè)置Surface分辨率surfaceView.getHolder().setKeepScreenOn(true);/ 屏幕常亮surfaceView.getHolder().addCallback(new SurfaceCal

20、lback();/為SurfaceView的句柄添加一個回調(diào)函數(shù)/* * 按鈕被點擊觸發(fā)的事件 * * param v */public void btnOnclick(View v) if (camera != null) switch (v.getId() case R.id.takepicture:/ 拍照camera.takePicture(null, null, new MyPictureCallback();break;/* * 圖片被點擊觸發(fā)的時間 * * param v */public void imageClick(View v) if (v.getId() = R.id.

21、scalePic) if (bundle = null) Toast.makeText(getApplicationContext(), R.string.takephoto,Toast.LENGTH_SHORT).show(); else Intent intent = new Intent(this, ShowPicActivity.class);intent.putExtras(bundle);startActivity(intent);private final class MyPictureCallback implements PictureCallback Overridepub

22、lic void onPictureTaken(byte data, Camera camera) try bundle = new Bundle();bundle.putByteArray(bytes, data);/將圖片字節(jié)數(shù)據(jù)保存在bundle當(dāng)中,實現(xiàn)數(shù)據(jù)交換saveToSDCard(data); / 保存圖片到sd卡中Toast.makeText(getApplicationContext(), R.string.success,Toast.LENGTH_SHORT).show();camera.startPreview(); / 拍完照后,重新開始預(yù)覽 catch (Except

23、ion e) e.printStackTrace();/* * 將拍下來的照片存放在SD卡中 * param data * throws IOException */public static void saveToSDCard(byte data) throws IOException Date date = new Date();SimpleDateFormat format = new SimpleDateFormat(yyyyMMddHHmmss); / 格式化時間String filename = format.format(date) + .jpg;File fileFolder

24、= new File(Environment.getExternalStorageDirectory()+ /finger/);if (!fileFolder.exists() / 如果目錄不存在,那么創(chuàng)立一個名為finger的目錄fileFolder.mkdir();File jpgFile = new File(fileFolder, filename);FileOutputStream outputStream = new FileOutputStream(jpgFile); / 文件輸出流outputStream.write(data); / 寫入sd卡中outputStream.cl

25、ose(); / 關(guān)閉輸出流private final class SurfaceCallback implements Callback / 拍照狀態(tài)變化時調(diào)用該方法Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) parameters = camera.getParameters(); / 獲取各項參數(shù)parameters.setPictureFormat(PixelFormat.JPEG); / 設(shè)置圖片格式parameters.setPreviewSize

26、(width, height); / 設(shè)置預(yù)覽大小parameters.setPreviewFrameRate(5);/設(shè)置每秒顯示4幀parameters.setPictureSize(width, height); / 設(shè)置保存的圖片尺寸parameters.setJpegQuality(80); / 設(shè)置照片質(zhì)量/ 開始拍照時調(diào)用該方法Overridepublic void surfaceCreated(SurfaceHolder holder) try camera = Camera.open(); / 翻開攝像頭camera.setPreviewDisplay(holder); /

27、設(shè)置用于顯示拍照影像的SurfaceHolder對象camera.setDisplayOrientation(getPreviewDegree(MainActivity.this);camera.startPreview(); / 開始預(yù)覽 catch (Exception e) e.printStackTrace();/ 停止拍照時調(diào)用該方法Overridepublic void surfaceDestroyed(SurfaceHolder holder) if (camera != null) camera.release(); / 釋放照相機camera = null;/* * 點擊 屏

28、幕是,顯示兩個按鈕 */Overridepublic boolean onTouchEvent(MotionEvent event) switch (event.getAction() case MotionEvent.ACTION_DOWN:layout.setVisibility(ViewGroup.VISIBLE); / 設(shè)置視圖可見break;return true;Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) switch (keyCode) case KeyEvent.KEYCODE_CAMERA: /

29、按下拍照按鈕if (camera != null & event.getRepeatCount() = 0) / 拍照/注:調(diào)用takePicture()方法進行拍照是傳入了一個PictureCallback對象當(dāng)程序獲取了拍照所得的圖片數(shù)據(jù)之后/,PictureCallback對象將會被回調(diào),該對象可以負(fù)責(zé)對相片進行保存或傳入網(wǎng)絡(luò)camera.takePicture(null, null, new MyPictureCallback();return super.onKeyDown(keyCode, event);/ 提供一個靜態(tài)方法,用于根據(jù) 方向獲得相機預(yù)覽畫面旋轉(zhuǎn)的角度public s

30、tatic int getPreviewDegree(Activity activity) / 獲得 的方向int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();int degree = 0;/ 根據(jù) 的方向計算相機預(yù)覽畫面應(yīng)該選擇的角度switch (rotation) case Surface.ROTATION_0:degree = 90;break;case Surface.ROTATION_90:degree = 0;break;case Surface.ROTATION_180:deg

31、ree = 270;break;case Surface.ROTATION_270:degree = 180;break;return degree;用來顯示圖片的Activity:java view plaincopyprint? package;import;import;import;import;import;import;import;publicclassShowPicActivityextendsActivityprivateImageViewivPic=null;/顯示圖片控件/*Activity在創(chuàng)立的時候回調(diào)的函數(shù)主要用來初始化一些變量*/Overrideprotected

32、voidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView();ivPic=(ImageView)findViewById();setImageBitmap(getImageFormBundle();/*將MainActivity傳過來的圖片顯示在界面當(dāng)中*parambytes*/publicvoidsetImageBitmap(bytebytes)BitmapcameraBitmap=byte2Bitmap();/根據(jù)拍攝的方向旋轉(zhuǎn)圖像縱向拍攝時要需要將圖像選擇90度)Matr

33、ixmatrix=newMatrix();matrix.setRotate(MainActivity.getPreviewDegree(this);cameraBitmap=Bitmap.createBitmap(cameraBitmap,0,0,cameraBitmap.getWidth(),cameraBitmap.getHeight(),matrix,true);ivPic.setImageBitmap(cameraBitmap);/*從Bundle對象中獲取數(shù)據(jù)*return*/publicbytegetImageFormBundle()Intentintent=getIntent()

34、;Bundledata=intent.getExtras();bytebytes=data.getByteArray(bytes);returnbytes;/*將字節(jié)數(shù)組的圖形數(shù)據(jù)轉(zhuǎn)換為Bitmap*return*/privateBitmapbyte2Bitmap()bytedata=getImageFormBundle();/將byte數(shù)組轉(zhuǎn)換成Bitmap對象Bitmapbitmap=BitmapFactory.decodeByteArray(data,0,data.length);returnbitmap;package com.wwj.finger;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.os.Bundle;import android.widget.ImageView;public class ShowPicActivity extends Ac

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論