真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android實(shí)現(xiàn)攝像頭拍照功能

應(yīng)用場景:

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比百色網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式百色網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋百色地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

在Android開發(fā)過程中,有時(shí)需要調(diào)用手機(jī)自身設(shè)備的功能,本文側(cè)重?cái)z像頭拍照功能的調(diào)用。

知識(shí)點(diǎn)介紹:

使用權(quán)限:調(diào)用手機(jī)自身設(shè)備功能(攝像頭拍照功能),應(yīng)該確保已經(jīng)在AndroidManifest.xml中正確聲明了對攝像頭的使用及其它相關(guān)的feature。

 
  
  
  
  
  
  
  
  
  
 

Class類:

1、 SurfaceView
視圖(View)的繼承類,這個(gè)視圖里內(nèi)嵌了一個(gè)專門用于繪制的Surface。你可以控制這個(gè)Surface的格式和尺寸。Surfaceview控制這個(gè)Surface的繪制位置。
2、 SurfaceHolder
SurfaceHolder是控制surface的一個(gè)抽象接口,你可以通過SurfaceHolder來控制surface的尺寸和格式,或者修改surface的像素,監(jiān)視surface的變化等等,SurfaceHolder是SurfaceView的典型接口。
3、 SurfaceHolder.Callback
用戶可以實(shí)現(xiàn)此接口接收surface變化的消息。當(dāng)用在一個(gè)SurfaceView 中時(shí),  它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之間有效。設(shè)置Callback的方法是SurfaceHolder.addCallback。

使用方式:

第一步:新建一個(gè)Android項(xiàng)目CameraTest,包含兩個(gè)Activity: MainActivity、CameraActivity。

第二步:

activity_main.xml

 
  
  
  
  
 

MainActivity.java

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
 
public class MainActivity extends Activity { 
 
 private Button cameraButton; //拍照按鈕 
 private Button quitButton; //退出按鈕 
 private ImageView imageView; //圖片顯示 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 initViews(); 
 } 
 
 private void initViews() { 
 imageView = (ImageView) findViewById(R.id.main_image); 
// 從本地取圖片(在sdcard中獲取文件) 
 Bitmap bitmap = getLoacalBitmap("/sdcard/mhc.jpg"); 
 Log.e("msgTag", new File("/sdcard/mhc.jpg").exists()+"=========="); 
 imageView .setImageBitmap(bitmap); //設(shè)置Bitmap 
 cameraButton = (Button) findViewById(R.id.main_camera); 
 quitButton = (Button) findViewById(R.id.main_quit); 
 MainOnClickListener mainOnClickListener = new MainOnClickListener(); 
 cameraButton.setOnClickListener(mainOnClickListener); 
 quitButton.setOnClickListener(mainOnClickListener); 
 } 
 
 private class MainOnClickListener implements OnClickListener{ 
 
 @Override 
 public void onClick(View v) { 
 switch (v.getId()) { 
 case R.id.main_camera: 
 startActivity(new Intent(MainActivity.this, CameraActivity.class)); 
 break; 
 case R.id.main_quit: 
 MainActivity.this.finish(); 
 break; 
 default: 
 break; 
 } 
 } 
 } 
 
 /** 
 * 根據(jù)文件路徑獲取所需要文件,并將該文件封裝成Bitmap對象返回 
 * @param fileUrl 
 * @return 
 */ 
 public static Bitmap getLoacalBitmap(String fileUrl) { 
 try { 
 FileInputStream fis = new FileInputStream(fileUrl); 
 return BitmapFactory.decodeStream(fis); ///把流轉(zhuǎn)化為Bitmap圖片 
 } catch (FileNotFoundException e) { 
 e.printStackTrace(); 
 return null; 
 } 
 } 
} 

activity_camera.xml

 
 
  
  
  
  
 

CameraActivity.java

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
 
import android.graphics.ImageFormat; 
import android.hardware.Camera; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class CameraActivity extends Activity { 
 private String tag ="CameraActivity"; 
 private SurfaceView surfaceView; 
 //Surface的控制器 
 private SurfaceHolder surfaceHolder; 
 private Camera camera; 
 private Button saveButton; 
 //拍照的回調(diào)接口 
 private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { 
 public void onPictureTaken(byte[] data, Camera camera) { 
 new SavePictureTask().execute(data); 
 camera.startPreview(); 
 } 
 }; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_camera); 
 initViews(); 
 } 
 
 private void initViews() { 
 saveButton = (Button) findViewById(R.id.camera_save); 
 surfaceView = (SurfaceView) findViewById(R.id.camera_preview); 
 surfaceHolder = surfaceView.getHolder(); 
 // 給SurfaceView當(dāng)前的持有者 SurfaceHolder 一個(gè)回調(diào)對象。 
 //用戶可以實(shí)現(xiàn)此接口接收surface變化的消息。當(dāng)用在一個(gè)SurfaceView 中時(shí), 
 //它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之間有效。 
 //設(shè)置Callback的方法是SurfaceHolder.addCallback. 
 //實(shí)現(xiàn)過程一般繼承SurfaceView并實(shí)現(xiàn)SurfaceHolder.Callback接口 
 surfaceHolder.addCallback(surfaceCallback); 
 // 設(shè)置surface不需要自己的維護(hù)緩存區(qū) 
 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
 saveButton.setOnClickListener(new OnClickListener() { 
 
 @Override 
 public void onClick(View v) { 
 camera.takePicture(null, null, pictureCallback); 
// Camera.takePicture(shutterCallback,rawCallback,pictureCallback ); 
// private ShutterCallback shutterCallback = new ShutterCallback(){ 
//  public void onShutter(){ 
//  /* 按快門瞬間會(huì)執(zhí)行這里的代碼 */ 
//  } 
//  }; 
// private PictureCallback rawCallback = new PictureCallback(){ 
//  public void onPictureTaken(byte[] _data, Camera _camera){ 
//  /* 如需要處理 raw 則在這里 寫代碼 */ 
//  } 
//  }; 
//  //當(dāng)拍照后 存儲(chǔ)JPG文件到 sd卡 
//  PictureCallback pictureCallback=new PictureCallback(){ 
//  public void onPictureTaken(byte[] data,Camera camera) { 
//  FileOutputStream outSteam=null; 
//  try{ 
//  SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss"); 
//  String times=format.format((new Date())); 
//  outSteam=new FileOutputStream("/sdcard/"+times+"mhc.jpg"); 
//  outSteam.write(data); 
//  outSteam.close(); 
//  }catch(FileNotFoundException e){ 
//  Log.d("Camera", "row"); 
//  } catch (IOException e) { 
//  e.printStackTrace(); 
//  } 
//  }; 
//  }; 
 } 
 }); 
 } 
 
 
 //SurfaceView當(dāng)前的持有者的回調(diào)接口的實(shí)現(xiàn) 
 SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { 
 
 @Override 
 public void surfaceCreated(SurfaceHolder holder) { 
 camera = Camera.open(); 
 Log.e(tag, "攝像頭Open完成"); 
 try { 
 camera.setPreviewDisplay(holder); 
 } catch (IOException e) { 
 camera.release(); 
 camera = null; 
 } 
 } 
 
 @Override 
 public void surfaceChanged(SurfaceHolder holder, int format, int width, 
 int height) { 
 Camera.Parameters parameters = camera.getParameters(); 
 parameters.setPictureFormat(ImageFormat.JPEG); 
 camera.setDisplayOrientation(0); 
 camera.setParameters(parameters); 
 camera.startPreview(); 
 } 
 
 @Override 
 public void surfaceDestroyed(SurfaceHolder holder) { 
 camera.stopPreview(); 
 camera.release(); 
 camera = null; 
 } 
 }; 
 
 class SavePictureTask extends AsyncTask { 
 @Override 
 protected String doInBackground(byte[]... params) { 
 File picture = new File("/sdcard/mhc.jpg"); 
 try { 
 FileOutputStream fos = new FileOutputStream(picture.getPath()); 
 fos.write(params[0]); 
 fos.close(); 
 } catch (Exception e) { 
 e.printStackTrace(); 
 } 
 Log.e(tag, "照片保存完成"); 
 CameraActivity.this.finish(); 
 return null; 
 } 
 } 
} 

下載地址:Android實(shí)現(xiàn)攝像頭拍照功能

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


新聞名稱:Android實(shí)現(xiàn)攝像頭拍照功能
網(wǎng)站URL:http://weahome.cn/article/jhsooe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部