国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程實現拍照功能的2種方法分析

2019-12-12 02:23:35
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程實現拍照功能的2種方法。分享給大家供大家參考,具體如下:

Android系統的照相功能,已實現2種方法,可供大家參考:

1. 調用系統攝像頭來拍照

首先,找到AndroidManifest.xml文件里加入用戶權限

<uses-permission android:name="android.permission.CAMERA"></uses-permission><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" />

其次,在主類Java文件里加入2個控件(button和imageview),是用來觸發按鈕事件和顯示圖片的,純是個人愛好

final int TAKE_PICTURE = 1;//為了表示返回方法中辨識你的程序打開的相機

關鍵是這里:

復制代碼 代碼如下:
startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);

是打開系統自帶相機,以下是處理拍照得到的數據,將數據保存下來

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  if (requestCode == TAKE_PICTURE) {   if (resultCode == RESULT_OK) {    Bitmap bm = (Bitmap) data.getExtras().get("data");    img.setImageBitmap(bm);//想圖像顯示在ImageView視圖上,private ImageView img;    File myCaptureFile = new File("sdcard/123456.jpg");    try {      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));      /* 采用壓縮轉檔方法 */       bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);       /* 調用flush()方法,更新BufferStream */       bos.flush();       /* 結束OutputStream */       bos.close();     } catch (FileNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();     } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();     }   }  }}

這樣就能實現調用系統自帶的攝像頭了,很簡單的操作。

2. 自己寫程序來保存照片

照片格局文件lay.xml里要先進行這些定義

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"><LinearLayout  android:orientation="horizontal"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:paddingLeft="130px"  android:paddingRight="200px" > <SurfaceView  android:id="@+id/mSurfaceView1"  android:visibility="visible"  android:layout_width="320px"  android:layout_height="240px"> </SurfaceView> </LinearLayout> </LinearLayout>

其中SurfaceView是用來進行預覽的,
在Oncreat函數里初始化一系列的值:

requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.lay);/* 取得屏幕解析像素 */DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);// mImageView01 = (ImageView) findViewById(R.id.myImageView1);/* 以SurfaceView作為相機Preview之用 */mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);/* 綁定SurfaceView,取得SurfaceHolder對象 */mSurfaceHolder01 = mSurfaceView01.getHolder();/* Activity必須實現SurfaceHolder.Callback */mSurfaceHolder01.addCallback(takephoto.this);/** 以SURFACE_TYPE_PUSH_BUFFERS(3)* 作為SurfaceHolder顯示類型* */mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

首先進行初始化照相機的功能函數和參數設置:

private Camera mCamera01;mCamera01 = Camera.open();/* 創建Camera.Parameters對象 */Camera.Parameters parameters = mCamera01.getParameters();/* 設置相片格式為JPEG */parameters.setPictureFormat(PixelFormat.JPEG);Log.i(TAG, "pic is jpeg");/* 指定preview的屏幕大小 */parameters.setPreviewSize(320, 240);Log.i(TAG, "pic pingmu fenbianlv");/* 設置圖片分辨率大小 */parameters.setPictureSize(1024, 768);Log.i(TAG, "pic tupian fenbianlv");/* 將Camera.Parameters設置予Camera */mCamera01.setParameters(parameters);/* setPreviewDisplay唯一的參數為SurfaceHolder */mCamera01.setPreviewDisplay(mSurfaceHolder01);/* 立即運行Preview */mCamera01.startPreview();

初始化成功后就可以進行拍照了,拍照函數依然是通過調用camera類的函數來實現

復制代碼 代碼如下:
mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);

只需實現jpegCallback這個回調函數來就行解碼、保存即可,前2個參數可以直接設為null,不過系統一般會自動幫你把這些都寫進來的

private PictureCallback jpegCallback = new PictureCallback(){   public void onPictureTaken(byte[] _data, Camera _camera)   {    // TODO Handle JPEG image data    /* onPictureTaken傳入的第一個參數即為相片的byte */    Bitmap bm = BitmapFactory.decodeByteArray          (_data, 0, _data.length);    /* 創建新文件 */       picname = "sdcard/1234566.jpg";//要保存在哪里,路徑你自己設    File myCaptureFile = new File(picname);    try    {     BufferedOutputStream bos = new BufferedOutputStream     (new FileOutputStream(myCaptureFile));     /* 采用壓縮轉檔方法 */     bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);     /* 調用flush()方法,更新BufferStream */     bos.flush();     /* 結束OutputStream */     bos.close();     /* 將拍照下來且存儲完畢的圖文件,顯示出來 */     //mImageView01.setImageBitmap(bm);     /* 顯示完圖文件,立即重置相機,并關閉預覽 */     resetCamera();     }    catch (Exception e)    {     Log.e(TAG, e.getMessage());    }   }};

拍照完了要重置照相機,然后可以繼續拍照

/* 相機重置 */private void resetCamera(){   if (mCamera01 != null && bIfPreview)   {    mCamera01.stopPreview();    /* 擴展學習,釋放Camera對象 */    mCamera01.release();    mCamera01 = null;    bIfPreview = false;   }}

2種拍照方式的比較

①. 調用系統自帶的照相機,照片格式大小只有幾種選擇,照片拍出來比較大,而自己程序實現的話可以調節照片大小為任意尺寸,圖片的容量可以調節

②. 調用系統的簡單,而且外觀一般比自己設置的要好看

③. 調用系統的操作簡單、方便,不易出錯,自己編程的話需要注意,容易引起系統出錯意外終止

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android拍照與圖片處理技巧總結》、《Android圖形與圖像處理技巧總結》、《Android開發入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芜湖市| 永德县| 丽江市| 海口市| 天全县| 霞浦县| 府谷县| 湘潭市| 龙井市| 梓潼县| 久治县| 泊头市| 醴陵市| 垦利县| 克什克腾旗| 梧州市| 汕头市| 屯留县| 泸西县| 明水县| 永和县| 封开县| 绍兴县| 米脂县| 墨玉县| 宁城县| 磴口县| 苗栗市| 朔州市| 临颍县| 崇阳县| 于田县| 金堂县| 舞钢市| 柳林县| 武平县| 师宗县| 法库县| 白城市| 花莲县| 绥中县|