Android實(shí)現(xiàn)拍照功能
大家好,這是一個(gè)簡(jiǎn)單的拍照功能,很簡(jiǎn)單的界面,一個(gè)顯示圖像區(qū)域SurfaceView一個(gè)“拍照”按鈕。直接上代碼!
1、CameraDemoActivity.java(主界面)
package org.winplus.camera;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
public class CameraDemoActivity extends Activity{
private final static String TAG = "CameraActivity";
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private File picture;
private Button btnSave;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
setupViews();
}
private void setupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btnSave = (Button) findViewById(R.id.save_pic);
btnSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
takePic();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void takePic() {
camera.stopPreview();// stop the preview
camera.takePicture(null, null, pictureCallback); // picture
}
// Photo call back
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
//@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
}
};
// save pic
class SavePictureTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... params) {
String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";
Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
//picture = new File(Environment.getExternalStorageDirectory(),fname);// create file
picture = new File(Environment.getExternalStorageDirectory()+"/"+fname);
try {
FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
fos.write(params[0]); // Written to the file
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
// SurfaceHodler Callback handle to open the camera, off camera and photo size changes
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCallback====");
camera = Camera.open(); // Turn on the camera
try {
camera.setPreviewDisplay(holder); // Set Preview
} catch (IOException e) {
camera.release();// release camera
camera = null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(TAG,"====surfaceChanged");
Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
// parameters.set("rotation", 180); // Arbitrary rotation
camera.setDisplayOrientation(0);
// parameters.setPreviewSize(400, 300); // Set Photo Size
camera.setParameters(parameters); // Setting camera parameters
camera.startPreview(); // Start Preview
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// stop preview
camera.release(); // Release camera resources
camera = null;
}
};
}
2、main.xml(布局文件)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <android.view.SurfaceView android:id="@+id/camera_preview" android:layout_width="800dip" android:layout_height="600dip" android:layout_alignParentTop="true" android:layout_centerInParent="true" android:layout_gravity="center_vertical|center_horizontal" /> <Button android:id="@+id/save_pic" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/txt_save" /> </LinearLayout>
3、別忘了添加權(quán)限:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android啟動(dòng)相機(jī)拍照并返回圖片
- Android拍照保存在系統(tǒng)相冊(cè)不顯示的問題解決方法
- Android仿微信發(fā)表說(shuō)說(shuō)實(shí)現(xiàn)拍照、多圖上傳功能
- android 拍照和上傳的實(shí)現(xiàn)代碼
- Android拍照得到全尺寸圖片并進(jìn)行壓縮
- android圖像繪制(六)獲取本地圖片或拍照?qǐng)D片等圖片資源
- Android應(yīng)用中拍照后獲取照片路徑并上傳的實(shí)例分享
- Android實(shí)現(xiàn)從本地圖庫(kù)/相機(jī)拍照后裁剪圖片并設(shè)置頭像
- android系統(tǒng)在靜音模式下關(guān)閉camera拍照聲音的方法
相關(guān)文章
Android編程簡(jiǎn)單獲取網(wǎng)絡(luò)上的圖片
這篇文章主要介紹了Android編程簡(jiǎn)單獲取網(wǎng)絡(luò)上的圖片,結(jié)合實(shí)例形式分析了Android獲取網(wǎng)絡(luò)圖片及加載顯示的相關(guān)操作步驟與注意事項(xiàng),需要的朋友可以參考下2016-10-10
實(shí)例解析如何在Android應(yīng)用中實(shí)現(xiàn)彈幕動(dòng)畫效果
這篇文章主要介紹了如何在Android應(yīng)用中實(shí)現(xiàn)彈幕動(dòng)畫效果的實(shí)例,文中是利用RelativeLayout布局然后控制ViewGroup中view的顯示,細(xì)節(jié)展示得比較詳細(xì),需要的朋友可以參考下2016-04-04
基于RxJava框架實(shí)現(xiàn)獲取驗(yàn)證碼的輔助類
這篇文章主要為大家詳細(xì)介紹了基于RxJava框架實(shí)現(xiàn)獲取驗(yàn)證碼的輔助類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
android支付寶客戶端html5網(wǎng)頁(yè)無(wú)法自動(dòng)關(guān)閉問題的解決方法
這篇文章主要為大家詳細(xì)介紹了android支付寶客戶端html5網(wǎng)頁(yè)無(wú)法自動(dòng)關(guān)閉問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Android自定義帶加載動(dòng)畫效果的環(huán)狀進(jìn)度條
這篇文章主要介紹了Android自定義帶加載動(dòng)畫效果的環(huán)狀進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果
在android開發(fā),我們會(huì)常常使用到縮放動(dòng)畫,這篇文章主要給大家介紹了關(guān)于Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果的相關(guān)資料,需要的朋友可以參考下2021-08-08
Android開發(fā)實(shí)現(xiàn)判斷通知欄是否打開及前往設(shè)置頁(yè)面的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)判斷通知欄是否打開及前往設(shè)置頁(yè)面的方法,涉及Android通知欄的打開、判斷、設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01

