[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.  重启电脑

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。