Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [android,19]android照相機、視頻錄制,開啟系統照相機和視頻錄制

[android,19]android照相機、視頻錄制,開啟系統照相機和視頻錄制

編輯:關於Android編程

照相機開發:

一、照相機界面的設計:

1、照相機界面要求:

①、照相機屏幕是橫屏顯示:在清單文件中activity元素的android:screenOrientation

屬性指定顯示狀態,landscape為橫屏顯示,portrait為豎屏顯示。不指定該屬性時是橫豎屏可以切換的。

android:icon="@drawable/ic_launcher"

android:label="@string/app_name" >

android:screenOrientation="landscape"

android:name=".DemoActivity"

android:label="@string/app_name" >

 

 

 

 

 

 

②、照相機全屏顯示:就是隱藏activity的狀態欄和標題欄。

 

在activity的onCreate方法中使用requestWindowFeature()方法設置顯示窗體的狀態,為Window.FEATURE_NO_TITLE 無標題狀態。

注意:一定要寫到 setcontentview()方法之前。

 

public class DemoActivity extends Activity implementsOnClickListener {

 

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//不顯示標題:

// 一定要寫到 setcontentview之前

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.main);

//設置窗體隱藏狀態欄

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

}

2照相機的界面布局:

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

 

android:id="@+id/sv"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

 

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:orientation="horizontal" >

 

android:id="@+id/autofocus"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="自動對焦" />

 

android:id="@+id/takepic"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="拍照" />

 

 

 

二、開發代碼:

//獲取各組件

SurfaceView sv = (SurfaceView) this.findViewById(R.id.sv);

//對焦的按鈕

Button autofocus = (Button) this.findViewById(R.id.autofocus);

//拍照

Button takepic = (Button) this.findViewById(R.id.takepic);

//按鈕注冊點擊事件:

autofocus.setOnClickListener(this);

takepic.setOnClickListener(this);

//獲取SurfaceHolder對象

SurfaceHolder holder = sv.getHolder();

// 注意: 要寫在holder創建之前:

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

//設置SurfaceHolder回調函數

holder.addCallback(new Callback() {

 

//SurfaceHolder銷毀的方法

public voidsurfaceDestroyed(SurfaceHolder holder) {

camera.release();//釋放資源

camera = null;

}

 

//SurfaceHolder創建時調用的方法:

public voidsurfaceCreated(SurfaceHolder holder) {

//將創建的SurfaceHolder對象設置給成員變量。

DemoActivity.this.holder = holder;

//照相機對象

camera = Camera.open();

//獲取照相機所有參數的鍵值對字符串.

// String parrten = camera.getParameters().flatten();

 

// TODO:設置照相機的參數

//獲取照相機參數對象:

Camera.Parameters parms = camera.getParameters();

System.out.println(parms.flatten());

//為參數設置值:

parms.setPreviewFrameRate(5); //每秒顯示的幀數

parms.setPictureSize(1280, 960);//設置寬高

parms.setPictureFormat(PixelFormat.JPEG);//設置照片的輸出格式

parms.set("jpeg-quality", 100);//照片質量

//

// camera.setParameters(parms);

//設置預覽界面,surfaceHolder作為參數:

camera.setPreviewDisplay(holder);

 

//通過SurfaceView顯示取景畫面

camera.startPreview();//開始預覽

}

 

@Override

public voidsurfaceChanged(SurfaceHolder holder, int format,

int width, int height) {

 

}

});

 

 

按鈕的點擊事件方法:

public void onClick(View v) {

switch (v.getId()) {

case R.id.autofocus://點擊對焦的按鈕

camera.autoFocus(null);//讓手機對焦的方法:

break;

case R.id.takepic://點擊照相按鈕:

//takePicture方法參數1:按快門,拍照聲音響起時的回調。

參數2:照片後未壓縮圖片的回調

參數3:照片後壓縮成jpeg圖片的回調

camera.takePicture(null, null, new PictureCallback() {

//方法參數1:照片的二進制字節數組

public voidonPictureTaken(byte[] data, Camera camera) {

//判斷sd是否可用

if(Environment.MEDIA_MOUNTED.equals(

Environment.getExternalStorageState())){

//TODO:保存圖片到sd卡

 

File file = new File(

Environment.getExternalStorageDirectory(),

System.currentTimeMillis()+".jpg");

FileOutputStream fos = new FileOutputStream(file);

// fos.write(data);

// fos.flush();

// fos.close();

//decodeByteArray()方法獲取Bitmap對象

Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);

//壓縮方法:

參數1:壓縮的圖片格式。

參數2:文件質量

參數3:文件的輸出流

bm.compress(CompressFormat.JPEG,50, fos);

 

fos.flush();

fos.close();

Toast.makeText(

getApplicationContext(),"保存圖片成功", 1).show();

camera.startPreview();//重新開始預覽圖片

 

}else{

Toast.makeText(getApplicationContext(), "sd卡不可用", 1).show();

}

 

}

});

break;

 

}

 

}

 

 

視頻錄制開發:mediaRecorder類

一、界面布局:

 

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

 

android:id="@+id/sv"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

 

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:orientation="horizontal" >

 

android:id="@+id/recoder"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="錄制" />

 

android:id="@+id/stop"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:enabled="false"

android:clickable="false"

android:text="停止" />

 

 

 

二、業務代碼:activity類 ,

public class DemoActivity extends Activity implementsOnClickListener {

private SurfaceView sv;

private Buttonstart,stop;

private SurfaceHolderholder;

 

 

private MediaRecorderrecorder;

@Override

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//獲取組件

sv = (SurfaceView)this.findViewById(R.id.sv);

//獲取surfaceHolder

holder =sv.getHolder();

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

start = (Button)this.findViewById(R.id.recoder);

stop = (Button)this.findViewById(R.id.stop);

start.setOnClickListener(this);

stop.setOnClickListener(this);

//SurfaceHolder 的回調

holder.addCallback(new Callback() {

 

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

//

 

}

 

@Override

public void surfaceCreated(SurfaceHolder holder) {

 

DemoActivity.this.holder= holder;

//創建MediaRecorder對象

recorder = newMediaRecorder();

recorder.reset();

//從照相機采集視頻

recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

//設置采集音頻

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//設置輸出格式

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//設置大小

recorder.setVideoSize(720,480); // TODO ?

 

recorder.setVideoFrameRate(3);//每秒3幀

//設置視頻編碼方式

recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

//判斷sd是否可用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

 

//創建視頻文件對象

File file = new File (

Environment.getExternalStorageDirectory(),

System.currentTimeMillis()+".3gp");

//視頻輸出的文件

recorder.setOutputFile(file.getAbsolutePath());

//設置顯示

recorder.setPreviewDisplay(DemoActivity.this.holder.getSurface());

 

}else{

Toast.makeText(getApplicationContext(), "sd卡不可用", 1).show();

}

}

 

@Override

public void surfaceChanged(SurfaceHolder holder, int format, intwidth,

int height) {

// TODO Auto-generatedmethod stub

 

}

});

 

}

//按鈕的點擊事件方法

public void onClick(Viewv) {

 

switch (v.getId()) {

case R.id.recoder://錄制按鈕

try {

recorder.prepare();//准備錄制

} catch (Exception e) {

Toast.makeText(getApplicationContext(), "錄制准備失敗", 0).show();

e.printStackTrace();

}//預期准備

recorder.start();

stop.setEnabled(true);

stop.setClickable(true);

 

start.setEnabled(false);

start.setClickable(false);

break;

case R.id.stop://停止按鈕

recorder.stop();

recorder.release();

 

start.setEnabled(true);

start.setClickable(true);

 

stop.setEnabled(false);

stop.setClickable(false);

break;

}

}

}

 

開啟系統照相機意圖:

 

一、是激活系統照相機組件:

public class DemoActivity extends Activity {

/** Called when theactivity is first created. */

private ImageView iv;

@Override

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

iv = (ImageView)this.findViewById(R.id.iv);

}

//點擊按鈕的事件方法:

public void click(Viewview){

//隱式意圖 獲取系統照相機組件

Intent intent = new Intent();

intent.setAction("android.media.action.IMAGE_CAPTURE");

intent.addCategory("android.intent.category.DEFAULT");

startActivityForResult(intent, 0); //以獲取返回值開啟組件

}

 

//以帶返回值形式開啟組件 ,觸發的方法:

protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

// new Intent("inline-data").putExtra("data",bitmap);

System.out.println("獲取到照片");

 

if(data!=null){

Uri uri = data.getData();

//iv.setImageURI(uri);

//System.out.println(uri.toString());

String str = data.getAction();

if(str!=null){

System.out.println(str);

}

//查看源代碼 獲取圖片

Bitmap bitmap =data.getParcelableExtra("data");

//將圖片設置在ImageView中顯示:

iv.setImageBitmap(bitmap);

}

}

}

二、激活系統錄制視頻組件:

public class DemoActivity extends Activity {

/** Called when theactivity is first created. */

private ImageView iv;

@Override

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

iv = (ImageView)this.findViewById(R.id.iv);

}

//按鈕的點擊方法

public void click(Viewview){

//隱式意圖激活系統錄制視頻組件

Intent intent = new Intent();

intent.setAction("android.media.action.VIDEO_CAPTURE");

intent.addCategory("android.intent.category.DEFAULT");

startActivityForResult(intent, 0);

}

 

@Override

protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

// new Intent("inline-data").putExtra("data",bitmap);

System.out.println("獲取到照片");

 

if(data!=null){

Uri uri = data.getData();

通過獲取的uri 播放錄制的視頻

 

}

}

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved