亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【android學習之十五】——多媒體2:相機Camera

系統 1944 0
二、多媒體之相機Camera

手機的相機功能是當前大家玩拍照的一個必備功能,本篇的學習,我認為網上的一篇博文的講解更容易理解一下,這里就轉一下博文,自己把自己遇到的的問題給補充進來。引用的博文地址: http://xblia.iteye.com/blog/1167964

目前的智能 手機 擁有很多強大的功能,例如攝像頭、 GPS 和無線上網等,現在是我們開始充分使用這些功能的時候了,在本篇文章中我們一起學習,如何在谷歌Android編程環境中,以最簡單的方式實現谷歌Android攝像頭拍照。

  在本文示例中,我們需要用到兩個文件:布局文件和Activity文件。

【提示】:在Android 1.5(代號cupcake)發布之后,在 安全 方面有諸多改進,其中之一與攝像頭權限控制有關。在此之前,你能夠創建無需用戶許可就可實現拍照的應用。現在該問題已被修復,如果你想在自己的應用中使用攝像頭,需要在AndroidManifest.xml中增加以下代碼:

    <uses-permission android:name="android.permission.CAMERA"/>
  

沒有此授權代碼,程序會報:Fail to connect to camera service 錯誤。

1.設定攝像頭布局

  這是開發工作的基礎,也就是說我們希望在應用程序中增加多少輔助性元素,如攝像頭各種功能按鈕等。在本文中我們采取最簡方式,除了拍照外,沒有多余攝像頭功能。下面我們一起看一下本文示例將要用到的布局文件“main.xml”。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <SurfaceView
        android:id="@+id/surface_camera"
        android:layout_width="fill_parent"
        android:layout_height="10dip"
        android:layout_weight="1" >
    </SurfaceView>
</LinearLayout>

  

該布局非常簡單,只有一個LinearLayout視圖組,在它下面只有一個SurfaceView視圖,也就是我們的攝像頭 屏幕

【提示】:記住不要在資源文件名稱中使用大寫字母,如果你把該文件命名為“CameraSurface.xml”,會給你帶來不必要的麻煩。

2.攝像頭實現CameraActivity代碼

    package com.jercy.android.Camera;

import java.io.IOException;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;

public class CameraActivity extends Activity implements SurfaceHolder.Callback   {
	private static final String TAG="CameraActivity";
	private Camera mCamera;
	private SurfaceView mSurfaceView;
	private SurfaceHolder mSurfaceHolder;
	private boolean mPreviewRunning = false;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFormat(PixelFormat.TRANSLUCENT); //屏幕格式為“半透明”。  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  //攝像頭預覽界面將通過全屏顯示,沒有“標題(title)”
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        setContentView(R.layout.main);   				//設定Activity的布局為前面我們創建的main布局
        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);   
        
        mSurfaceHolder = mSurfaceView.getHolder();   	//surfaceview中獲得了holder
        mSurfaceHolder.addCallback(this);   			//并增加callback功能到“this”。這意味著我們的操作(activity)將可以管理這個surfaceview。
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		Log.i(TAG, "調用了CameraActivity的surfaceCreated方法");
		//mCamera是“Camera”類的一個對象。在surfaceCreated方法中我們“打開”攝像頭。這就是啟動它的方式 
		mCamera = Camera.open();  						
	}

	@Override
	/**
	 * 該方法讓攝像頭做好拍照準備,設定它的參數,并開始在Android屏幕中啟動預覽畫面。
	 * 當mPreviewRunning為true時,意味著攝像頭處于激活狀態,并未被關閉,因此我們可以使用它。
	 */
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		Log.i(TAG, "調用了CameraActivity的surfaceChanged方法");
		if(mPreviewRunning) {   
			mCamera.stopPreview();   
		}   
		Camera.Parameters p = mCamera.getParameters();   
		p.setPreviewSize(width, height);   
		mCamera.setParameters(p);   
		try {   
			mCamera.setPreviewDisplay(holder);   
		} catch (IOException e) {   
			e.printStackTrace();   
		}   
		mCamera.startPreview();   
		mPreviewRunning = true;
	}

	@Override
	/**
	 * 通過這個方法,我們停止攝像頭,并釋放相關的資源。正如大家所看到的,我們在這兒設置mPreviewRunning為false,
	 * 以此來防止在surfaceChanged方法中的沖突。因為這意味著我們已經關閉了攝像頭,而且我們不能再設置其參數或在攝像頭中啟動圖像預覽
	 */
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		Log.i(TAG, "調用了CameraActivity的surfaceDestroyed方法");
		mCamera.stopPreview();   
		mPreviewRunning = false;   
		mCamera.release();   

	}
	
	/**
	 * 當拍照時,該方法被調用。舉例來說,你可以在界面上創建一個OnClickListener,當你點擊屏幕時,
	 * 調用PictureCallBack方法。 這個方法會向你提供圖像的字節數組,
	 * 然后你可以使用Android提供的Bitmap和BitmapFactory類,將其從字節數組轉換成你想要的圖像格式。
	 */
	Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {   
		public void onPictureTaken(byte[] imageData, Camera c) {   
		}   
	};  
}


  

分析Activity類,實現SurfaceHolder.Callback接口:

接口SurfaceHolder.Callback被用來接收攝像頭預覽界面變化的信息。它實現了三個方法:

  surfaceChanged

  當預覽界面的格式和大小發生改變時,該方法被調用。

  surfaceCreated

  初次實例化,預覽界面被創建時,該方法被調用。

  surfaceDestroyed

  當預覽界面被關閉時,該方法被調用。

如下圖為運行程序,并且點擊取消按鈕退出程序過程的Log日志:

    11-14 08:24:10.420: I/CameraActivity(426): 調用了CameraActivity的surfaceCreated方法
11-14 08:24:20.374: I/CameraActivity(426): 調用了CameraActivity的surfaceChanged方法
11-14 08:24:32.899: W/KeyCharacterMap(426): No keyboard for id 0
11-14 08:24:32.899: W/KeyCharacterMap(426): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-14 08:24:35.746: I/CameraActivity(426): 調用了CameraActivity的surfaceDestroyed方法

  

效果圖:

【android學習之十五】——多媒體2:相機Camera

【android學習之十五】——多媒體2:相機Camera


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产日韩精品一区在线不卡 | 牛牛影视在线观看片免费 | 亚洲国产精品a一区二区三区 | 亚洲欧美亚洲 | 超激情碰碰碰啪在线视频 | 国内视频一区 | 99久久99久久精品 | 婷婷免费在线 | 成人亚洲欧美日韩在线观看 | 国产成人91精品 | 91欧美亚洲 | 久久欧美久久欧美精品 | 亚洲国产成人久久综合一区 | 国产免费一区二区三区在线观看 | 免费欧美一级片 | 久久综合久久久久 | 久久日韩 | 国产精品人成福利视频 | 一级毛片大全 | 中文字幕亚洲第一 | 久久精品网站免费观看调教 | 国产欧美在线不卡 | 久久综合视频网站 | 亚洲精品久久婷婷爱久久婷婷 | 亚洲精品久久99久久一区 | 一区二区三区网站在线免费线观看 | 国产无卡一级毛片aaa | 亚洲 自拍 另类 制服在线 | 久久经典免费视频 | 五月天中文字幕 | 免费看美女吃男生私人部位 | 爱爱视频网站免费 | 免费视频爱爱太爽了 | 色综七七久久成人影 | 五月国产综合视频在线观看 | 国产成人精品福利色多多 | 国产麻豆永久视频 | 激情在线视频 | 九九99热久久国产 | 免费播放一区二区三区 | 久久国产高清一区二区三区 |