高德地图Overlay的应用以及照相功能的实现

来源:互联网 发布:抢单软件 编辑:程序博客网 时间:2024/05/17 01:14

          暑假第二十一天,今天天气有点小热,长时间对着电脑眼睛还真有点不适应,下午刚刚出地下室吃饭的时候,两眼眺望了一下远方,就感觉小有压力,眼睛和头都有点不舒服,哎!程序员真苦逼啊!!!伤不起的还是我们这群程序员。。。嘿嘿,废话不多说了看看今天都学的什么,今天主要学习的是实现高德地图的图层覆盖方法和相机照相的功能的实现过程

1.首先看一下布局mapview.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:autonavi="http://schemas.android.com/apk/res/com.AMap"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" ><ImageButton     android:id="@+id/imagebutton"    android:layout_width="45dp"    android:layout_height="45dp"    android:src="@drawable/camera"/>        <com.amap.mapapi.map.MapView        android:id="@+id/mapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:clickable="true" /> </LinearLayout>
2.camera.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <SurfaceView        android:id="@+id/suruface"        android:layout_width="fill_parent"        android:layout_height="390dp" />    <ImageButton        android:id="@+id/iamge"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:src="@drawable/a" /></LinearLayout>

3.看看主活动的内容GaodeMapTestActivity.java

package com.wang;import com.amap.mapapi.core.GeoPoint;import com.amap.mapapi.map.MapActivity;import com.amap.mapapi.map.MapController;import com.amap.mapapi.map.MapView;import com.amap.mapapi.map.Overlay;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Point;import android.graphics.Paint.Style;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;public class GaodeMapTestActivity extends MapActivity {private MapView mapView;private MapController mapController;private GeoPoint point;private ImageView image;/** *显示栅格地图,启用内置缩放控件,并用MapController 控制地图的中心点及Zoom 级别 */protected void onCreate(Bundle savedInstanceState) {// 设置地图为矢量模式this.setMapMode(MAP_MODE_VECTOR);super.onCreate(savedInstanceState);setContentView(R.layout.mapview);mapView = (MapView) findViewById(R.id.mapView);// 设置启用内置的缩放组件mapView.setBuiltInZoomControls(true);// 得到mapview的控制权,可以用它控制盒驱动平移和缩放mapController = mapView.getController();// 用给定的经纬度构造一个GeoPoint,单位是微度(度* 1E6) 得到南阳理工学院的经纬度// * 1E6 非常重要,这样可以把地图的下面显示出来,不然就光有自己画的图层了point = new GeoPoint((int) (32.973657928606265 * 1E6),(int) (112.54251837730408 * 1E6));// 设置地图的中心mapController.setCenter(point);// 设置地图的缩放级别mapController.setZoom(12);// 自定义Overlay可以实现点,线,面的叠加。mapView.getOverlays().add(new Overlay() {/**** * 画布类持有“画"的功能。绘制一些东西,你需要四个基本组件: 一个位图来保持像素,画布主机平局调用(写为位图), * 绘图原语(例如。,路径,Rect文本,位图), 和一个油漆(描述的颜色和风格的画)。 ****/public void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);// 创建一个screenpPoint对象Point screenpPoint = new Point();// 得到屏幕上的像素mapView.getProjection().toPixels(point, screenpPoint);// 位图对象创建从各种来源,包括文件、流、和byte-arrays。解码位图,得到图片资源Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.da_marker_red);// 画指定的位图,同其主要/左角(x,y),使用指定的油漆,改变当前的矩阵。canvas.drawBitmap(bmp, screenpPoint.x, screenpPoint.y - 50,null);// 画文字Paint painttext = new Paint();painttext.setTextSize(18);painttext.setColor(Color.RED);canvas.drawText("南阳理工学院", screenpPoint.x, screenpPoint.y,painttext);// 画圆Paint mcirclePaint = new Paint();// s设置普通显示效果mcirclePaint.setAntiAlias(true);mcirclePaint.setColor(Color.BLUE);// 设置透明度的mcirclePaint.setAlpha(50);mcirclePaint.setStyle(Style.FILL);canvas.drawCircle(screenpPoint.x + 150, screenpPoint.y, 50,mcirclePaint);// 画直线Paint painline = new Paint();painline.setColor(Color.RED);// 边界宽度painline.setStrokeWidth(3.0f);// 轻画painline.setStyle(Paint.Style.STROKE);canvas.drawLine(screenpPoint.x - 100, screenpPoint.y,screenpPoint.x, screenpPoint.y - 100, painline);}@Overridepublic boolean onTap(GeoPoint arg0, MapView arg1) {// TODO Auto-generated method stubreturn super.onTap(arg0, arg1);}});image = (ImageView) findViewById(R.id.imagebutton);image.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(GaodeMapTestActivity.this,TakePhotos.class);startActivity(intent);}});}}

4.看看相机实现的活动TakePhotos.java

package com.wang;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.hardware.Camera;import android.os.Bundle;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.view.View.OnClickListener;import android.widget.ImageButton;public class TakePhotos extends Activity {private static final String TAG = "TakePhotos";final int latchedOrientation = 90;/*** * 相机类是用于设置捕获图像设置,启动/停止预览,抓拍照片,和检索帧编码的视频。 这个类是一个客户端相机的服务,管理实际的相机硬件。 * **/private Camera mCamera;// 处理打开相机关闭相机,及图片尺寸的大小private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback() {// 打开相机public void surfaceCreated(SurfaceHolder holder) {mCamera = Camera.open();Log.i(TAG, "Camera opened");try {// 照相预览mCamera.setPreviewDisplay(holder);} catch (Exception e) {e.printStackTrace();}}// 停止预览public void surfaceDestroyed(SurfaceHolder holder) {// 释放相机资源mCamera.release();mCamera = null;Log.i(TAG, "Camera released");}// 获取相片改变的尺寸和格式public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// 得到相机的参数Camera.Parameters parameters = mCamera.getParameters();// parameters.setPreviewSize(width, height);// parameters.setPictureFormat(PixelFormat.JPEG);// jpeg quality菜单项设置parameters.set("jpeg-quality", 85);// parameters.setRotation(latchedOrientation);mCamera.setParameters(parameters);// 开始预览mCamera.startPreview();Log.i(TAG, "Camera preview started");Log.i(TAG, "width  : " + width + " , height : " + height);}};// 设备不支持自动对焦将收到一个“假的”回调到这个接口 ,实现自动对焦的功能private Camera.AutoFocusCallback mAutoFocusListener = new Camera.AutoFocusCallback() {/** * 判断相机的自动对焦时调用完成。如果相机不支持自动对焦和自动对焦叫做, onAutoFocus会被立即调用成功的用假值设置为true。 * 常规的自动对焦没有锁auto-exposure和auto-white完成 * *****/public void onAutoFocus(boolean success, final Camera camera) {Log.i(TAG, "AutoFocus : " + success);camera.autoFocus(null);/** * 触发异步捕获图像。相机服务将启动一系列的回调应用程序作为图像捕获的进展 。快门回调后出现在照片拍摄。 * 这可以用来触发一个声音,让用户知道形象已经被捕获。就是听到的卡卡的声音 * */camera.takePicture(mShutterListener, null, mPictureListener);new Thread() {@Overridepublic void run() {try {// 睡眠3sThread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}camera.startPreview();}}.start();}};// 图像捕捉的回调方法private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() {public void onShutter() {Log.i(TAG, "onShutter");}};// 照片回调 声明一个PictureCallback对象private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {// 获取图像数据可用时,调用一个图片是采取之后。数据的格式取决于上下文和相机的回调。public void onPictureTaken(byte[] data, Camera camera) {Log.i(TAG, "Picture taken");// 数据写到输出流,到一个文件。如果输出文件存在,// 也可以替换或附加到。如果它不存在,将会创建一个新文件FileOutputStream fos = null;try {// 写入到SD卡中fos = new FileOutputStream("/sdcard/TakePhotos.jpg");fos.write(data);} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}};public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);final Window win = getWindow();// 设置全屏win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);// 没有标题requestWindowFeature(Window.FEATURE_NO_TITLE);requestWindowFeature(Window.FEATURE_PROGRESS);setContentView(R.layout.camera);/**** * SurfaceView 提供专用的绘图表面上嵌入视图层次。 负责放置在正确的位置的表面在屏幕上   ,以便在窗口后面是握着它的 * 允许其表面显示的 访问底层表面是通过SurfaceHolder接口,可以通过调用getHolder检索()。 * **/// 实例化组件SurfaceView surface = (SurfaceView) findViewById(R.id.suruface);// 访问底层表面是通过SurfaceHolder接口SurfaceHolder holder = surface.getHolder();// 添加一个回调接口holder.addCallback(mSurfaceListener);// 在需要的时候自动设置。holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 实例化组件ImageButton button = (ImageButton) findViewById(R.id.iamge);// 为图片设置监听事件,按下图片后可以进行拍照button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (mCamera != null) {mCamera.autoFocus(mAutoFocusListener);}}});}}
5.亲!最重要的别忘了添加权限哦!

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.wang"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="10" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name=".GaodeMapTestActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".TakePhotos" >        </activity>    </application>    <!-- 高德地图的一些权限 -->    <!-- 1.获取粗略位置的权限     2.获取精确位置的权限   3.联网的权限    4.获取网络状态的权限-->    <!-- 5.外部存储的权限             6.获取图层状态的权限   7. 改变wifi状态的权限    8.获取wifi状态的权限 -->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >    </uses-permission>    <uses-permission android:name="android.permission.INTERNET" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >    </uses-permission>    <uses-permission android:name="android.permission.READ_PHONE_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >    </uses-permission>    <!-- 照相机的一些权限 -->    <!-- 1.获取相机的权限   2.获取相机硬件设施的权限  3.获取自动对焦的权限  4,获取相机硬件刷新频率的权限  -->     <!--  -->    <uses-permission android:name="android.permission.CAMERA" />    <uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />    <uses-feature android:name="android.hardware.camera.flash" /></manifest>
6.由于高德地图需要导入第三方jar包MapApi.jar(解决这个问题,可以看我以前的关于第三方jar包的导入方法)和一个动态链接库libminimapv320.so,解决这个问题可以直接复制

7,运行的结果如图,由于模拟器没有后置摄像头,所以第二章图片有一部分是白的



8.相关代码可以参考http://download.csdn.net/detail/wjky2014/4425694