對於android裏的接口類,直接new!!!
手機SD卡路徑獲取
通過代碼,獲取sd卡路徑。
獲取SDcard:mnt/sdcard 注意要補充上【反斜槓】!!!
String path=Environment.getExternalStorageDirectory().getAbsolutePath();
System.out.println(path);
獲取SDcard:mnt/sdcard/Movies
String path2=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath();
System.out.println(path2);
拍照
注意:保證模擬器後置攝像頭打開狀態。
打開模擬器:edit->backcamera ->emulated
SurfaceView類
支持視頻,音頻播放(高速顯示功能)
屏幕高速閃動,震動。高速顯示,以避免產生屏幕閃爍的現象。
SurfaceView可以直接用於多媒體拍照,攝像頭獲取的圖像顯示在SurfaceView中,以供預覽和拍照。
SurfaceView還支持繪圖顯示功能。這需要畫布對象(Canvas)和畫筆對象(Paint)的配合。
支持自定義圖形的繪製。
SurfaceHolder類:控制surfaceview類
鎖定畫布,解鎖畫布。
Callback可以控制surface改變
Callback聲明瞭以下回調方法:
surfaceChanged:在Surface大小發生改變時被調用
surfaceCreated:在創建Surface後立即被調用
surfaceDestroyed:在銷燬Surface前立即被調用
SurfaceHolder提供了以下主要方法:
addCallback:爲SurfaceView添加Callback對象
lockCanvas:鎖定畫布
繪圖之前必須鎖定畫布才能得到當前畫布對象。
unlockCanvasAndPost:針對開始繪製時鎖定的畫布,繪製完成後解鎖畫布,並將畫面展示在SurfaceView上。
removeCallback:從SurfaceView中移除Callback對象
用surfaceview加載圖片
1. 聲明私有變量
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
2. 初始化
mSurfaceView=(SurfaceView)findViewById(R.id.surfaceview);
3. 獲取接口
//獲取接口
mHolder =mSurfaceView.getHolder();
4. 給holder綁定callback 接口->在surfaceview繪製圖片
mHolder.addCallback(newCallback());
5. 重寫surfaceCreated方法:
public voidsurfaceCreated(SurfaceHolder holder) {
// 1.鎖定畫布
Canvas can=holder.lockCanvas();
//2.在畫布上繪圖
//如何將圖片資源轉換成bitmap位圖
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.desert);
can.drawBitmap(bitmap, 0, 0, null);
//3.解鎖畫布
holder.unlockCanvasAndPost(can);
}
拍照準備
1. 拍照權限
權限位置:
主佈局文件->permissions->add->uses permissions
Attributes for usespermissions->name:android.permission.CAMERA
選中左側欄Permission:uses permissions,save,完成
<uses-permission android:name="android.permission.CAMERA"/>
2. Camera類:導入Hardware的包
可按以下步驟訪問Camera,以實現拍照:
A. 調用Camera的open()方法打開相機。
B. 調用Camera的getParameters()方法獲取拍照參數。該方法返回一個Camera.Parameters對象。
C. 調用Camera.Paramers對象的方法設置拍照參數。
D. 調用Camera的setParameters,並將Camera.Paramers作爲參數傳入,這樣即可對相機的拍照參數進行控制。
E. 調用Camera的startPreview()方法開始預覽取景。
F. 在預覽之前,應調用Camera的setPreViewDisplay(SurfaceHolder holder)方法來設置使用哪個SurfaceView來顯示取景
G. 調用Camera的takePicture()方法進行拍照。
H. 調用Camera的StopPriview()結束取景預覽,並調用release()方法釋放資源。
Camera類中聲明瞭一些與拍照相關的嵌套類或接口,主要包括:
a) Camera.AutoFocusCallback:用來通知已完成自動對焦的回調接口
b) Camera.ErrorCallback:用來通知發生錯誤的回調接口
c) Camera.Parameters:相機服務的參數
d) Camera.PictureCallback:用來提供照片圖像數據的回調接口
e) Camera.PreviewCallback:用來提供預覽的回調接口
f) Camera.ShutterCallback:用來提供快門操作的回調接口
g) Camera.Size:圖像尺寸(寬度和高度)
攝像頭屬性設置和surfaceview綁定。
一、聲明和類對象的初始化
1. 聲明私有變量
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
privateCamera mCamera;
2. 初始化
mSurfaceView=(SurfaceView)findViewById(R.id.surfaceview);
3. 初始化Holder:獲取操作surface的接口
//獲取接口
mHolder =mSurfaceView.getHolder();
4. 給holder綁定callback 接口->監控surfaceview繪製圖片
mHolder.addCallback(newCallback());
解釋:
SurfaceHolder.Callback這個接口用來監控Surface的改變,
例如其創建、銷燬及改變大小等。
5. 在new Callback()中:重寫surfaceCreated方法
public voidsurfaceCreated(SurfaceHolder holder)
二、攝像頭屬性設置
6. 判斷攝像頭是否打開,沒打開得話,打開攝像頭(surfaceCreated方法中)
//判斷攝像頭是否打開,沒打開得話,打開攝像頭
if(mCamera==null){
mCamera= Camera.open();
//打開攝像頭:即在此處初始化mCamera
//調整90度讓攝像頭垂直(旋轉90度)
mCamera.setDisplayOrientation(90);
}
7. 設置攝像頭的參數(surfaceCreated方法中)
//1.獲取參數對象
Camera.Parameters par=mCamera.getParameters();
8. 設置攝像頭保存的圖片格式
//2.保存圖片的格式
par.setPictureFormat(ImageFormat.JPEG);
9. 將屬性參數綁定當前攝像頭
//將屬性參數綁定當前攝像頭
mCamera.setParameters(par);
三、攝像頭與surfaceview綁定
以下兩步驟,需要添加try-catch-throw
10.將surfaceview 和攝像頭綁定
mCamera.setPreviewDisplay(holder);
11.開始取景
mCamera.startPreview();
四、創建用於位圖旋轉的rotationBitmap方法
作用:判斷照片是否旋轉並對其進行旋轉處理保證圖片方向的正確性
1. 聲明並創建rotationBitmap方法
private Bitmap rotationBitmap(Bitmap bitmap) {
}
2. 聲明一個Bitmap(用來return的結果對象)
Bitmap bMapRotate;
3. 聲明並初始化orientation(設置是否旋轉的方向)
int orientation= bitmap.getHeight() < bitmap.getWidth() ? 90 : 0;
4. 添加處理旋轉的代碼
if (orientation != 0){
Matrixmatrix = new Matrix();
matrix.postRotate(orientation);
bMapRotate = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);
}else
bMapRotate= Bitmap.createScaledBitmap(bitmap,bitmap.getWidth(), bitmap.getHeight(), true);
5. 返回結果傳回
return bMapRotate;
五、拍照
l 添加權限:拍照完畢的文件存儲
SD卡中存儲。添加兩個權限。
android.permission.WRITE_EXTERNAL_STORAGE————SD卡讀寫權限
android.permission.MOUNT_UNMOUNT_FILESYSTEMS————SD卡操作權限
l 拍照功能的實現and存儲
1. 調用mCamera.takePicture方法
mCamera.takePicture(null, null, new PictureCallback()
2. new PictureCallback()重寫onPictureTaken方法
public voidonPictureTaken(byte[] data, Camera camera)
3. 初始化bitmap(在onPictureTaken方法)
//用來獲得拍照得到的圖片數據,以二進制的形式存放在bit中
Bitmap bit=BitmapFactory.decodeByteArray(data, 0, data.length);
4. 初始化bitmap2,用來存放旋轉之後的bit文件(需要調用位圖旋轉方法)
Bitmapb1= rotationBitmap(bit);
5. 存儲到SDK
//文件名:需要獲取日期+時間名
//日期時間函數的格式化
SimpleDateFormat simpleDatFomat=newSimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
String picName=simpleDatFomat.format(date);
//sdk路徑獲取
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+ "/" + picName + ".jpg";
6. 創建文件流對象,壓縮bitmap文件【在try-catch-throw】
FileOutputStream fos = new FileOutputStream(path);
b1.compress(Bitmap.CompressFormat.JPEG,80, fos);
File file=new File(path);
if(file.exists()){
nowNotify(file);
}
7. 在XXX.java文件中創建nowNotify(file)方法
Uri:統一資源定位符
private voidnowNotify(File file){
Intent it=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uriuri=Uri.fromFile(file);
it.setData(uri);
sendBroadcast(it);
}
六、在Imageview中顯示拍的照片
在takePicture方法中
//動態綁定圖片顯示在imageview中
mImg.setImageBitmap(b1);
//拍照照片繼續取景
mCamera.startPreview();
七、釋放Camera資源【離開拍照的Activity時】
程序退出,注意:要將攝像頭資源釋放。不釋放,再次進來,camera將處於被佔用的狀態。
重寫activity的onDestory方法
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(mCamera!=null){
//停止取景
mCamera.stopPreview();
//相機釋放
mCamera.release();
//人爲置爲空
mCamera=null;
}
}
修改模擬器的位置
默認路徑:
計算機->C盤->用戶->administrator->.android文件【這個文件就是模擬器的位置】
修改模擬器的路徑步驟
1. 停止所有模擬器相關的操作。
2. 在avd構建器中刪除所有模擬器。List of existing …located at……
3. 啓動任務管理器。在資源管理器,結束adb進程樹。
4. 打開環境變量設置界面(我的電腦,右擊,屬性。高級,系統設置)
5. 用戶變量及系統變量,新建:變量名:ANDROID_SDK_HOME ,變量值:D:\(已知路徑,不能中文,不能過深)
6. 將C盤的.android文件目錄剪切到,第五步設置的變量值的目錄中。
7. 重啓電腦