[Android開發學習] day06

對於android裏的接口類,直接new!!!

 

手機SD卡路徑獲取

通過代碼,獲取sd卡路徑。

獲取SDcardmnt/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;

 

五、拍照

添加權限:拍照完畢的文件存儲

SD卡中存儲。添加兩個權限。

android.permission.WRITE_EXTERNAL_STORAGE————SD卡讀寫權限

android.permission.MOUNT_UNMOUNT_FILESYSTEMS————SD卡操作權限

 

拍照功能的實現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.  重啓電腦

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章