Android實現拍照
Ⅰ 怎麼調用android的攝像頭拍照
我們要調用攝像頭的拍照功能,顯然
第一步必須加入調用攝像頭硬體的許可權,拍完照後我們要將圖片保存在SD卡中,必須加入SD卡讀寫許可權,所以第一步,我們應該在Android清單文件中加入以下代碼
<uses-permission android:name="android.permission.CAMERA"/>//攝像頭許可權
SD卡讀寫許可權
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第二步,要將攝像頭捕獲的圖像實時地顯示在手機上。
我們是用SurfaceView這個視圖組件來實現的,因此在main.xml中加入下列代碼
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceview"
/>
第三步,設置窗口的顯示方式
首先獲得當前窗口Windowwindow = getWindow();//得到窗口
接著設置沒有標題requestWindowFeature(Window.FEATURE_NO_TITLE);//沒有標題
接著設置全屏 window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置全屏
當然,我們在拍照過程中,屏幕必須一致處於高亮狀態,因此接著加入下面代碼
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//設置高亮
至此,我們將窗口的顯示方式規定死了,然後才能設置窗口上顯示的組件(順序非常重要)
setContentView(R.layout.main);
第四步,設置SurficeView顯示控制項的屬性
找到surficeView
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
設置它的像素為800x600
surfaceView.getHolder().setFixedSize(800,480);
//下面設置surfaceView不維護自己的緩沖區,而是等待屏幕的渲染引擎將內容推送到用戶面前
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
第五步,就是為surficeView加入回調方法(callBack)
surfaceView.getHolder().addCallback(newSurfaceCallback());
上面的回調類是我們自己定義的,代碼如下
private class SurfaceCallback implementsSurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolderholder) {
try {
camera = Camera.open();//打開硬體攝像頭,這里導包得時候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
Display display = wm.getDefaultDisplay();//得到當前屏幕
Camera.Parameters parameters =camera.getParameters();//得到攝像頭的參數
parameters.setPreviewSize(display.getWidth(),display.getHeight());//設置預覽照片的大小
parameters.setPreviewFrameRate(3);//設置每秒3幀
parameters.setPictureFormat(PixelFormat.JPEG);//設置照片的格式
parameters.setJpegQuality(85);//設置照片的質量
parameters.setPictureSize(display.getHeight(),display.getWidth());//設置照片的大小,默認是和屏幕一樣大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());//通過SurfaceView顯示取景畫面
camera.startPreview();//開始預覽
isPreview = true;//設置是否預覽參數為真
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void surfaceChanged(SurfaceHolderholder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolderholder) {
if(camera!=null){
if(isPreview){//如果正在預覽
camera.stopPreview();
camera.release();
}
}
}
}
第六步,我們必須對按鍵事件進行監聽,如是拍照還是聚焦,代碼如下
public boolean onKeyDown(int keyCode,KeyEvent event) {//處理按鍵事件
if(camera!=null&&event.getRepeatCount()==0)//代表只按了一下
{
switch(keyCode){
case KeyEvent.KEYCODE_BACK://如果是搜索鍵
camera.autoFocus(null);//自動對焦
break;
case KeyEvent.KEYCODE_DPAD_CENTER://如果是中間鍵
camera.takePicture(null, null, new TakePictureCallback());//將拍到的照片給第三個對象中,這里的TakePictureCallback()是自己定義的,在下面的代碼中
break;
}
}
return true;//阻止事件往下傳遞,否則按搜索鍵會變成系統默認的
}
------------------------------------------------------------------------------------------
private final class TakePictureCallbackimplements PictureCallback{
public void onPictureTaken(byte[] data,Camera camera) {
try {
Bitmap bitmap =BitmapFactory.decodeByteArray(data, 0, data.length);
File file = newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = newFileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100,outputStream);
outputStream.close();
camera.stopPreview();
camera.startPreview();//處理完數據之後可以預覽
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
注意,代碼中有兩個回調類,一個是SurfaceCallback(),另外一個是TakePictureCallback(),初學者可能一時難以理解,通俗地講,前者是用來監視surficeView這個暫時存放圖片數據的顯示控制項的,根據它的顯示情況調用不同的方法,包括surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不難理解為什麼會有這三個回調方法了(注意,在surfaceDestroyed()方法中必須釋放攝像頭,詳細代碼參見上方)。TakePictureCallback()是為了監視是否拍照而設計的介面,期中也僅有一個方法,camera將拍照得到的數據傳入方法,我們便可以對拍照得到的數據進行進一步處理
Ⅱ 如何在android中後台開啟攝像頭默默拍照
(1)CameraActivity.java
package com.camera.test;import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;import android.view.Window;import android.view.WindowManager;import android.widget.RelativeLayout;public class CameraActivity extends Activity {private CameraView view;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);// 設置橫屏模式以及全屏模式view = new CameraView(this);// 通過一個surfaceview的view來實現拍照view.setId(1);view = new CameraView(this, this);setContentView(R.layout.camera_layout);RelativeLayout relative = (RelativeLayout) this.findViewById(R.id.ly);RelativeLayout.LayoutParams Layout = new RelativeLayout.LayoutParams(3, 3);// 設置surfaceview使其滿足需求無法觀看預覽Layout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1);Layout.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 1);relative.addView(view, Layout);}}(2) CameraView.javapackage com.camera.test;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Point;import android.graphics.PointF;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.ShutterCallback;import android.media.AudioManager;import android.media.FaceDetector;import android.media.FaceDetector.Face;import android.os.Environment;import android.os.Handler;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.widget.Toast;public class CameraView extends SurfaceView implements SurfaceHolder.Callback,Camera.PictureCallback{private SurfaceHolder holder;private Camera camera;private Camera.Parameters parameters;private Activity act;private Handler handler = new Handler();private Context context;private SurfaceView surfaceView;private AudioManager audio;private int current;public CameraView(Context context) {super(context);surfaceView = this;audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);final int current = audio.getRingerMode();audio.setRingerMode(AudioManager.RINGER_MODE_SILENT);this.context = context;holder = getHolder();// 生成Surface Holderholder.addCallback(this);holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 指定Push Bufferhandler.postDelayed(new Runnable() {@Overridepublic void run() {if (camera == null) {handler.postDelayed(this, 1 * 1000);// 由於啟動camera需要時間,在此讓其等兩秒再進行聚焦知道camera不為空} else {camera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {if (success) {camera.takePicture(new ShutterCallback() {// 如果聚焦成功則進行拍照@Overridepublic void onShutter() {}}, null, CameraView.this);} else {}}});}}}, 2 * 1000);}public CameraView(Context context, Activity act) {// 在此定義一個構造方法用於拍照過後把CameraActivity給finish掉this(context);this.act = act;}@Overridepublic void surfaceCreated(final SurfaceHolder holder) {// TODO Auto-generated method stubcamera = Camera.open();// 攝像頭的初始化handler.postDelayed(new Runnable() {@Overridepublic void run() {if (holder != null) {try {camera.setPreviewDisplay(holder);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {handler.postDelayed(this, 1 * 1000);}}}, 2 * 1000);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stubparameters = camera.getParameters();camera.setParameters(parameters);// 設置參數camera.startPreview();// 開始預覽}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub}public void onPictureTaken(byte[] data, Camera camera) {// 拍攝完成後保存照片try {Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");String time = format.format(date);//在SD卡上創建文件夾File file = new File(Environment.getExternalStorageDirectory()+ "/myCamera/pic");if (!file.exists()) {file.mkdirs();}String path = Environment.getExternalStorageDirectory()+ "/myCamera/pic/" + time + ".jpg";data2file(data, path);camera.setPreviewCallback(null);camera.stopPreview();camera.release();camera = null;holder.removeCallback(CameraView.this);audio.setRingerMode(current);act.finish();//uploadFile(path);} catch (Exception e) {}}private void data2file(byte[] w, String fileName) throws Exception {// 將二進制數據轉換為文件的函數FileOutputStream out = null;try {out = new FileOutputStream(fileName);out.write(w);out.close();} catch (Exception e) {if (out != null)out.close();throw e;}}// private void uploadFile(String filePath)// 拍照過後上傳文件到伺服器// {// }}
Ⅲ 安卓筆記本怎麼拍照
1、首先左鍵單擊安卓筆記本的開始窗口鍵,可以在程序列表中找到相機。
2、點擊相機就進入了,使用自己的位置。
3、進入後,點擊右側的相機圖標就可以拍照了。
Ⅳ 【基礎筆記】Android Studio拍照、選擇相冊(第三方框架)
①選擇指定後綴文件
②在圖片選擇器中選擇圖片或視頻
③接受返回的文件
FilePicker
①、添加依賴
②、Activity實現takephoto
③實例圖片
④Git地址
TakePhoto
Ⅳ android如何進行全景拍照怎麼實現
首先,來了解一下什麼是場景模式。
最簡單的方法當然是google了,這里有一篇文章講得比較通俗易懂。
內容如下: 一般而言,數碼相機內預先調節好光圈、快門、焦距、測光方式及閃光燈等參數值,以便於那些經驗不足的用戶拍出有一定質量保證的數碼相片。不過用現有的模式也未必能拍出高質量的照片。相當一部份朋友使用的是數碼相機的AUTO(自動)模式,而在特定的拍攝環境中,其相片質量當然難以保障。因此為了更加方便初級用戶的使用,數碼相機廠商在數碼相機內加入了數種場景模式,這樣就更加方便拍出高質量的照片。目前,數碼相機內的場景模式少則有四、五種,多則有二三十種。
有些相機則是通過菜單來選擇不同的場景模式以下最常見的八種模式:風景模式:拍攝風景名勝時,數碼相機會把光圈調到最小以增加景深,另外對焦也變成無限遠,使相片獲得最清晰的效果。人像模式:用來拍攝人物相片,如證件照。數碼相機會把光圈調到最大,做出淺景深的效果。而有些相機還會使用能夠表現更強膚色效果的色調、對比度或柔化效果進行拍攝,以突出人像主體。夜景模式:夜景模式一般有兩種,前者使用1/10秒左右的快門進行拍攝,從而有可能導致曝光不足。而後者則使用數秒長的快門曝光時間,以保證相片充分曝光,相片畫面也會比較亮。上述兩種都使用較小的光圈進行拍攝,同時閃光燈也會關閉。夜景人像模式:在夜景中拍攝人物(如逛燈會),數碼相機通常會使用數秒至1/10秒左右的快門拍攝遠處的風景,並使用閃光燈照亮前景的人物主體,閃光燈通常會在快閃關閉前被觸發。動態模式(運動模式):用來拍攝高速移動的物體,數碼相機會把快門速度調到較快(1/500秒),或提高ISO感光值。微距模式:用來拍攝細微的目標如花卉、昆蟲等等,數碼相機會使用「微距」焦距,並關閉閃光燈。逆光模式:在一些背光的環境下使用,即主體的背後有較強的光線。相機會採用重點測光以增強曝光的准確性、並增加EV值以避免主體過暗,有些相機還會使用閃光燈進行補光。全景模式:拍攝超寬幅度的畫面(如山脈、大海)時,數碼相機會在每張相片後留出多餘位置,幫助攝影者連續拍攝多張風景相片,再組成一張超寬的風景照。
現在智能手機的攝像頭一般都在 5M, 8M, 12M, 高的都有 13M, 如 sony 的Xperia™ZL L35h手機。可以媲美一般的卡片相機了。也有很多的參數可調,其中就包括了場景模式。
MTK android 平台中,它的場景模式設置是寫在 cfg_ftbl_custom_raw_main.h 文件中的。
Location:ALPS.ICS***mediatekcustomproject_namehalcameracameracfg_ftbl_custom_raw_main.h
Ⅵ 安卓手機拍照軟體哪個最好
安卓手機拍照軟體比較好的有美顏相機、相機360、POCO美人相機、美咖相機、B2咔嘰相機等。
1、美顏相機
美顏相機app是一款專為愛美人士定製的自拍神器,有了美顏相機app,美白、補光、眼睛美化、臉部修飾,一秒全搞定,表現力更出色。
Ⅶ android 點擊即啟動照相機,怎麼實現
/**
* 調用相機拍照並存儲照片
*/
private void callCameraTakePhoto() {
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINESE);
current_datetime = sdf.format(currentDate); // 初始化當前時間值
// 路徑規則:SD卡路徑(內部存儲)/packageName/no_upload_media/yyyyMMddHHmmss.jpg
photoName = current_datetime + ".jpg"; // 初始化圖片文件名
photoSavePath = PHOTO_FILE_PATH + File.separator + photoName; // 初始化文件夾位置
Log.e("path", photoSavePath);
init_pic_dir(PHOTO_FILE_PATH); // 查詢並創建文件夾
// 啟動相機並拍照
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(photoSavePath)));
startActivityForResult(intent, CALL_CAMERA);
}
建議:Android手機版本不一樣,調用手機底層方法也是不一樣的。同樣,手機牌子不一樣,也可能會導致調用手機底層方法不一樣。此方法在小米4.4-5.1是ok的。
Ⅷ android怎麼拍照並獲取照片
點擊拍照鍵 就會自動拍照並保存了
Ⅸ android 如何實現自動拍照啊
設置一個定時器,每兩秒觸發camera.takepicture一次,就可以了。