[Android开发学习] day06
对于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. 重启电脑
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。