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種拍照方式的比較
1.呼叫系統自帶的照相機,照片格式大小隻有幾種選擇,照片拍出來比較大,而自己程式實現的話可以調節照片大小為任意尺寸,圖片的容量可以調節
2.呼叫系統的簡單,而且外觀一般比自己設定的要好看
3.呼叫系統的操作簡單、方便,不易出錯,自己程式設計的話需要注意,容易引起系統出錯意外終止
相關文章
- Android自定義拍照實現Android
- Android onClick事件三種實現方法Android事件
- Android可滑動Tab的3種實現方法Android
- android全屏去掉title欄的多種實現方法Android
- PHP + MySQL 無限分類實現的2種方法PHPMySql
- Android Studio 呼叫Camera實現拍照功能Android
- android開發中單擊事件的多種實現方法Android事件
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- Excel實現隔行換色的2種方法圖文介紹Excel
- Android 用MultiImageSelector實現上傳頭像的拍照跟相簿Android
- Android實現計時與倒數計時的幾種方法Android
- Verilog乘法的實現——幾種使用多級流水實現方法對比(2)
- vsftpd的三種實現方法FTP
- 使用Webcam實現拍照功能Web
- android 拍照Android
- Android拍照Android
- Android 回撥方法的實現Android
- android實現拍照、相簿選圖、裁剪功能,相容7.0以及小米Android
- python 字串替換可以用2種方法實現:Python字串
- Android中ImageButton自定義按鈕的按下效果的程式碼實現方法,附網上2種經典解決方法。Android
- Css實現垂直居中的幾種方法CSS
- java單例的幾種實現方法Java單例
- JavaScript實現非同步的4種方法JavaScript非同步
- CSS 實現垂直居中的 5 種方法CSS
- Android 截圖實現的幾種方式Android
- Android 高仿微信 獲取最近剛剛拍照的縮圖 功能實現Android
- Android Media(拍照)Android
- Android 沉浸式全屏的實現方法Android
- 實現單例模式的 9 種方法,你知道幾種?單例模式
- 基於大疆無人機全景拍照的實現思路無人機
- Android 的滑動分析以及各種實現Android
- Android Dialog的7種形式實現方式Android
- div實現水平垂直居中的幾種方法
- 實現三欄佈局的幾種方法
- Java 實現單例模式的 9 種方法Java單例模式
- javascript實現tab切換的四種方法JavaScript
- 一種子圖佈局方法的實現
- css實現垂直水平居中的幾種方法CSS