(七)位置服务与地图应用

一、实验内容

  1. 使用“CurrentLocationDemo”程序来完成显示当前位置新的功能,并能够监视设备的位置变化的功能。
  2. 使用“MapOverlayDemo”来实现如何在Google地图上添加覆盖层,并在预订的物理坐标上显示提示信息。

二、实验仪器、设备

硬件:PC 微型计算机、1G以上内存,40G以上硬盘
软件:Windows XP,Eclipse , JDK , Android SDK

三、实验步骤

1. 使用“CurrentLocationDemo”程序来完成显示当前位置新的功能,并能够监视设备的位置变化的功能。

  1. 创建CurrentLocationDemo工程
    打开Android Studio,点击Start a new Android Studio project;
    勾选Phone and Tablet,点击next;
    勾选Empty Activity,点击next;
    在Activity Name中填写CurrentLocationDemo,在Layout Name中添加main,点击finish。
    2)程序代码:
    MainActivity.java:
package com.example.sqlitedemo;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String serviceString = Context.LOCATION_SERVICE;
        LocationManager locationManager = (LocationManager)getSystemService(serviceString);

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);

        getLocationInfo(location);

        locationManager.requestLocationUpdates(provider, 2000, 0, locationListener);
    }

    private void getLocationInfo(Location location){
        String latLongInfo;
        TextView locationText = (TextView)findViewById(R.id.label);

        if (location != null){
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            latLongInfo = "Lat: " + lat + "\nLong: " + lng;
        }
        else{
            latLongInfo = "No location found";
        }

        locationText.setText("Your Current Position is:\n" + latLongInfo);
    }

    private final LocationListener locationListener = new LocationListener(){

        @Override
        public void onLocationChanged(Location location) {
            getLocationInfo(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            getLocationInfo(null);
        }

        @Override
        public void onProviderEnabled(String provider) {
            getLocationInfo(null);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }
    };
}

Activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView  android:id="@+id/label"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"/>

</LinearLayout>

Strings.xml:

<resources>
    <string name="hello">Hello World,CurrentLocationDemo</string>
    <string name="app_name">CurrentLocationDemo_liurui_164573</string>
</resources>

AndroidManifst.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sqlitedemo">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

3)运行结果与分析
在这里插入图片描述
2.使用“MapOverlayDemo”来实现如何在Google地图上添加覆盖层,并在预订的物理坐标上显示提示信息。

  1. 创建SQLiteDemo工程
    打开Android Studio,点击Start a new Android Studio project;
    勾选Phone and Tablet,点击next;
    勾选Empty Activity,点击next;
    在Activity Name中填写SQLiteDemo,在Layout Name中添加main,点击finish。
    2)程序代码:
    MainActivity.java:
package com.example.test2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;

public class MainActivity extends AppCompatActivity {

    private MapView mMapView=null;
    private BaiduMap mBaiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView(){
        mMapView=(MapView)findViewById(R.id.bmapView);
        mBaiduMap=mMapView.getMap();
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        mBaiduMap.setTrafficEnabled(true);

        //绘制点
        /*//定义Maker坐标点
        LatLng point = new LatLng(39.963175, 116.400244);
        //构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.icon_mark);
        //构建MarkerOption,用于在地图上添加Marker
        OverlayOptions option = new MarkerOptions()
                .position(point)
                .icon(bitmap);
        //在地图上添加Marker,并显示
        mBaiduMap.addOverlay(option);

        //文字覆盖物位置坐标
        LatLng llText = new LatLng(39.86923, 116.397428);

        //构建TextOptions对象
        OverlayOptions mTextOptions = new TextOptions()
                .text("百度地图SDK") //文字内容
                .bgColor(0xAAFFFF00) //背景色
                .fontSize(24) //字号
                .fontColor(0xFFFF00FF) //文字颜色
                .rotate(-30) //旋转角度
                .position(llText);

        //在地图上显示文字覆盖物
        Overlay mText = mBaiduMap.addOverlay(mTextOptions);*/
        //定义Ground的显示地理范围
        LatLng southwest = new LatLng(39.92235, 116.380338);
        LatLng northeast = new LatLng(39.947246, 116.414977);
        LatLngBounds bounds = new LatLngBounds.Builder()
                .include(northeast)
                .include(southwest)
                .build();

        //定义Ground显示的图片
        BitmapDescriptor bdGround = BitmapDescriptorFactory.fromResource(R.drawable.ground_overlay);
        //定义GroundOverlayOptions对象
        OverlayOptions ooGround = new GroundOverlayOptions()
                .positionFromBounds(bounds)
                .image(bdGround)
                .transparency(0.8f); //覆盖物透明度

        //在地图中添加Ground覆盖物
        mBaiduMap.addOverlay(ooGround);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }
}

Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"></com.baidu.mapapi.map.MapView>
</LinearLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test2">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data android:name="com.baidu.lbsapi.API_KEY"
            android:value="Ajg4ckNXk65BmfIwVgbWboRpyevxBIst"/>
        <service android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"></service>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

3)运行结果与分析
在这里插入图片描述

四、思考总结

1、简述Android应用程序如何使用Google地图?
在这里我没有使用Google地图,而是采用的百度地图,故在此我简述一i下啊百度地图的的使用方法,因为在官网上有很多参考文档,所以使用起来十分方便快捷。
1)获取开发密钥(AK)
申请步骤大致可分为如下四个步骤:
1若您未登录百度账号,请登录您的百度账号,如下图:
在这里插入图片描述
2登录后将进入API控制台,如下图:
在这里插入图片描述
3点击“创建应用”开始申请开发密钥,如下图:
在这里插入图片描述
4填写应用名称,注意应用类型选择“Android SDK”、正确填写SHA1 和 程序包名(SHA1和包名的获取方法见下文)。如图:
在这里插入图片描述
获取包名
5 在app目录下的build.gradle文件中找到applicationId,并确保其值与AndroidManifest.xml中定义的package相同。
在这里插入图片描述
在这里插入图片描述
获取SHA1
1进入控制台,执行”cd .android”定位到”.android”文件夹下。
在这里插入图片描述
2继续在控制台输入命令:
调试版本使用指令:keytool -list -v -keystore debug.keystore
发布版本请使用指令:keytool -list -v -keystore apk 的 keystore
在这里插入图片描述
3输入口令:
调试版本默认密码是: android,发布模式的密码是apk的keystore设置的密码。输入密钥后回车(如果没设置密码,可直接回车),此时可在控制台显示的信息中获取SHA1值,如下图所示:
在这里插入图片描述
2)创建AndroidStudio项目
在Android Studio中创建一个Android项目。
在项目中集成BaiduMap SDK
1下载开发包
普通的地图服务和包含步骑行导航的地图服务需要下载不同的开发包,点击下载开发包。
2将开发包拷贝至工程
添加jar文件:打开解压后的开发包文件夹,找到BaiduLBS_Android.jar文件将其拷贝至工程的app/libs目录下,如图:
在这里插入图片描述
添加so文件:在src/main/目录下新建jniLibs目录(如果您的项目中已经包含该目录不用重复创建),在下载的开发包中拷贝项目中需要的CPU架构对应的so文件文件夹到jniLibs目录,如图:
在这里插入图片描述
往工程中添加jar文件:在libs目录下,选中每一个jar文件(此处只有一个BaiduLbs_Android.jar)右键,选择Add As Library…,如图:
在这里插入图片描述
3)显示地图:
1.在中加入如下代码配置开发密钥(AK):

<meta-data android:name="com.baidu.lbsapi.API_KEY"
    android:value="key "/>

2.在外部添加如下权限声明:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

3.在布局文件中添加地图容器

<com.baidu.mapapi.map.MapView
    android:id="@+id/bmapView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"></com.baidu.mapapi.map.MapView>

4.2、简述Google地图覆盖层的使用方法?
在本实验中,我依旧使用了百度地图,采用GroundOverLay,可以自定义覆盖物和覆盖物的大小范围。Ground覆盖物,是一种位于底图和底图标注层之间的特殊Overlay,该图层不会遮挡地图标注信息。通过GroundOverlayOptions类来设置,开发者可以通过GroundOverlayOptions类设置一张图片,该图片可随地图的平移、缩放、旋转等操作做相应的变换。
基本逻辑如下:

//定义Ground的显示地理范围
LatLng southwest = new LatLng(39.92235, 116.380338);
LatLng northeast = new LatLng(39.947246, 116.414977);
LatLngBounds bounds = new LatLngBounds.Builder()
        .include(northeast)
        .include(southwest)
        .build();

//定义Ground显示的图片
BitmapDescriptor bdGround = BitmapDescriptorFactory.fromResource(R.drawable.ground_overlay);
//定义GroundOverlayOptions对象
OverlayOptions ooGround = new GroundOverlayOptions()
        .positionFromBounds(bounds)
        .image(bdGround)
        .transparency(0.8f); //覆盖物透明度

//在地图中添加Ground覆盖物
mBaiduMap.addOverlay(ooGround);
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值