[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
void
surfaceCreated(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
void
surfaceCreated(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
simpleDatFoma
t=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
void
nowNotify(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.  重启电脑

时间: 2024-11-07 17:29:22

[Android开发学习] day06的相关文章

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

Android开发学习---使用Intelij idea 13.1 进行android 开发

原文:Android开发学习---使用Intelij idea 13.1 进行android 开发 1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比Intelij idea好用,就试下,目前还在test阶段,总之是各种不习惯,很多快捷键之类的跟eclipse完全不一样.还要多熟悉! 另外android studio 也比较卡,而且用起来相当难受,完全是intelij 的

【Android开发学习笔记】【第三课】Activity和Intent

首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activity的布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

android 开发学习笔记 (一)

每个app 都有一个自己的 linux 进程: 每个进程都在自己的虚拟机里执行 两个app 可以跑在一个进程,一个vm里 android app 四大组件:activity,content provider,      services, broardcast receivers Content Resolver 激活 Content Provider You can start an      activity (or give it something new to do) by passi

Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14

adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和compile sdk最低都为14,即anroid 4.0,这里建议都设为最高的api 19,即android 4.4;否则会一直报错,类似错误如下: This template requires a minimum SDK version of at least 7, and the current mi

android开发学习之路——连连看之游戏逻辑(五)

GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖,程序需要GameService组件包含如下方法.   ·start():初始化游戏状态,开始游戏的方法.     ·Piece[][] getPieces():返回表示游戏状态的Piece[][]数组.     ·boolean hasPieces():判断Pieces[][]数组中是否还剩Piec

Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/files/LoginTest.txt------/data/data/(包名)/files/(文件名) 导出的文件内容: 三.实现代码 新建一个Android 工程.这里我选择的是2.1即API 7,进行开发的,其它都是默认下一步下一步即可. /datasave/res/layout/activity

android开发学习笔记000

使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个一直梦想走技术流的再疯狂一次.2014.08.06. 直奔主题——>android开发学习笔记001 android开发学习笔记000