免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android手機攝像頭編程入門

Android學(xué)習(xí)指南第三十六講:Android手機攝像頭編程入門

本講內(nèi)容:Android手機攝像頭編程入門

智能手機中的攝像頭和普通手機中的攝像頭最大的區(qū)別在于,智能機上的攝像頭可以由程序員寫程序控制,做一些有趣的應(yīng)用譬如,畫中畫,做一些有用的應(yīng)用譬如二維碼識別,等等。本講打算通過一個實例,來介紹一下攝像頭編程,相關(guān)解釋都寫在代碼中了,請注意看代碼注釋。

實例:窈窈照相機,功能很簡單,就是點擊程序彈出照相預(yù)覽界面,點擊相機按鈕完成照相功能,所照相片會存儲在手機存儲卡根目錄。

1、創(chuàng)建一個項目 Lesson36_Camera ,主程序文件為 MainActivity.java

2、AndroidManifest.xml 中設(shè)置屏幕為橫屏,并且聲明攝像頭和存儲卡的使用權(quán)限,具體代碼如下:

1234567891011121314151617
<?xml version="1.0" encoding="utf-8"?><manifest package="basic.android.lesson36" xmlns:android="http://schemas.android.com/apk/res/android" android:versioncode="1" android:versionname="1.0">	<application android:label="@string/app_name" android:icon="@drawable/icon">		<activity android:label="@string/app_name" android:name=".MainActivity" android:screenorientation="landscape" android:configchanges="orientation|keyboardHidden|keyboard">			<intent -filter="">				<action android:name="android.intent.action.MAIN">				<category android:name="android.intent.category.LAUNCHER">			</category></action></intent>		</activity> 	</application>	<uses -sdk="" android:minsdkversion="8">	<uses -permission="" android:name="android.permission.CAMERA"></uses>	<uses -permission="" android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>	<uses -feature="" android:name="android.hardware.camera">	<uses -feature="" android:name="android.hardware.camera.autofocus"></uses></uses></uses></manifest>

3、本例中不需要布局文件main.xml,因為本例中的UI組建都是動態(tài)添加上去的。

4、最后MainActivity.java的代碼如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
package basic.android.lesson36; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.Calendar;import java.util.Locale; import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.PixelFormat;import android.hardware.Camera;import android.os.Bundle;import android.text.format.DateFormat;import android.util.Log;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;import android.view.WindowManager;import android.widget.FrameLayout;import android.widget.TextView;import android.widget.Toast; public class MainActivity extends Activity { 	private CameraView cv;	//準(zhǔn)備一個相機對象	private Camera mCamera = null;	//準(zhǔn)備一個Bitmap對象	private Bitmap mBitmap = null;	 	//準(zhǔn)備一個保存圖片的PictureCallback對象	public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { 		public void onPictureTaken(byte[] data, Camera camera) {			Log.i("yao","onPictureTaken");			Toast.makeText(getApplicationContext(), "正在保存……", Toast.LENGTH_LONG).show();			//用BitmapFactory.decodeByteArray()方法可以把相機傳回的裸數(shù)據(jù)轉(zhuǎn)換成Bitmap對象			mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);			//接下來的工作就是把Bitmap保存成一個存儲卡中的文件			File file = new File("/sdcard/YY"+ new DateFormat().format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg");			try {				file.createNewFile();				BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));				mBitmap.compress(Bitmap.CompressFormat.PNG, 100, os);				os.flush();				os.close();				Toast.makeText(getApplicationContext(), "圖片保存完畢,在存儲卡的根目錄", Toast.LENGTH_LONG).show();			} catch (IOException e) {				e.printStackTrace();			}		} 	}; 	//Activity的創(chuàng)建方法	@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState); 		//窗口去掉標(biāo)題        requestWindowFeature(Window.FEATURE_NO_TITLE);        //窗口設(shè)置為全屏        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);        //設(shè)置窗口為半透明        getWindow().setFormat(PixelFormat.TRANSLUCENT);         //提供一個幀布局        FrameLayout  fl = new FrameLayout(this);               //創(chuàng)建一個照相預(yù)覽用的SurfaceView子類,并放在幀布局的底層        cv = new CameraView(this);		fl.addView(cv); 		//創(chuàng)建一個文本框添加在幀布局中,我們可以看到,文字自動出現(xiàn)在了SurfaceView的前面,由此你可以在預(yù)覽窗口做出各種特殊效果		TextView tv = new TextView(this);		tv.setText("請按\"相機\"按鈕拍攝");		fl.addView(tv); 		//設(shè)置Activity的根內(nèi)容視圖		setContentView(fl); 	} 	//相機按鍵按下的事件處理方法	public boolean onKeyDown(int keyCode, KeyEvent event) {		Log.i("yao","MainActivity.onKeyDown");		if (keyCode == KeyEvent.KEYCODE_CAMERA) {			if (mCamera != null) {				Log.i("yao","mCamera.takePicture");				//當(dāng)按下相機按鈕時,執(zhí)行相機對象的takePicture()方法,該方法有三個回調(diào)對象做入?yún)ⅲ恍枰臅r候可以設(shè)null				mCamera.takePicture(null, null, pictureCallback);			}		}		return cv.onKeyDown(keyCode, event);	} 	// 照相視圖	class CameraView extends SurfaceView { 		private SurfaceHolder holder = null; 		//構(gòu)造函數(shù)		public CameraView(Context context) {			super(context);			Log.i("yao","CameraView"); 			// 操作surface的holder			holder = this.getHolder();			// 創(chuàng)建SurfaceHolder.Callback對象			holder.addCallback(new SurfaceHolder.Callback() { 				@Override				public void surfaceDestroyed(SurfaceHolder holder) {					// 停止預(yù)覽					mCamera.stopPreview();					// 釋放相機資源并置空					mCamera.release();					mCamera = null;				} 				@Override				public void surfaceCreated(SurfaceHolder holder) {					//當(dāng)預(yù)覽視圖創(chuàng)建的時候開啟相機					mCamera = Camera.open();					try {						//設(shè)置預(yù)覽						mCamera.setPreviewDisplay(holder);					} catch (IOException e) {						// 釋放相機資源并置空						mCamera.release();						mCamera = null;					} 				} 				//當(dāng)surface視圖數(shù)據(jù)發(fā)生變化時,處理預(yù)覽信息				@Override				public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 					//獲得相機參數(shù)對象					Camera.Parameters parameters = mCamera.getParameters();					//設(shè)置格式					parameters.setPictureFormat(PixelFormat.JPEG);					//設(shè)置預(yù)覽大小,這里我的測試機是Milsstone所以設(shè)置的是854x480					parameters.setPreviewSize(854, 480);					//設(shè)置自動對焦					parameters.setFocusMode("auto");					//設(shè)置圖片保存時的分辨率大小					parameters.setPictureSize(2592, 1456);					//給相機對象設(shè)置剛才設(shè)定的參數(shù)					mCamera.setParameters(parameters);					//開始預(yù)覽					mCamera.startPreview();				}			});			// 設(shè)置Push緩沖類型,說明surface數(shù)據(jù)由其他來源提供,而不是用自己的Canvas來繪圖,在這里是由攝像頭來提供數(shù)據(jù)			holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);		} 	} }

5、連接Milestone,編譯并運行程序:悲劇的是,截圖只能看到黑黑的一片,無法截取到攝像頭傳輸過來SurfaceView信息,而在真機中是能看到預(yù)覽效果的。

還是上一張照好的圖片給大家吧,(用了好多年的小黑……)

好了,本講就到這里,謝謝大家的支持和鼓勵,下次再見。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android--使用Camera拍照
【流媒體】Android 實時視頻采集
Android 照相機 camera 操作封裝
Android如何實現(xiàn)邊采集邊上傳
Android 放大鏡效果實現(xiàn)
Android拍照,上傳,預(yù)覽綜合【修改】
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服