大作业(二)

五 实现定位功能


1. AndroidManifest.xml中注册广播

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>

 2.添加定位权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></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.WRITE_EXTERNAL_STORAGE"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
	<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
	<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
	<permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></permission>
	<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
	<uses-permission android:name="android.permission.ACCES_MOCK_LOCATION"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_GPS" />

3.定位功能全部代码

package com.example.positiontestforbaidu2;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.BDNotifyListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import com.example.util.MyMapView;
public class MainActivity extends Activity {
	public MyApplication app;
	static MyMapView mMapView = null;
	public MKMapViewListener mMapListener = null;
	MyLocationOverlay myLocationOverlay = null;
	// 
	LocationClient mLocClient;
	public NotifyLister mNotifyer = null;
	public MyLocationListenner myListener = new MyLocationListenner();
	LocationData locData = null;
	private MapController mMapController = null;
	static MKSearch mkSerach;
	Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			Toast.makeText(MainActivity.this, "msg:" + msg.what,
					Toast.LENGTH_SHORT).show();
		};
	};
	static TextView showAddr;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		showAddr = (TextView) findViewById(R.id.showAddr);
		MyIcon mi = new MyIcon(this);
		//
		getWindow().addContentView(
				mi,
				new LayoutParams(LayoutParams.FILL_PARENT,
						LayoutParams.FILL_PARENT));
		MyIcon2 m2 = new MyIcon2(this);
		getWindow().addContentView(
				m2,
				new LayoutParams(LayoutParams.FILL_PARENT,
						LayoutParams.FILL_PARENT));
		mMapView = (MyMapView) findViewById(R.id.bmapsView);
		mMapController = mMapView.getController();
		initMapView();
		app = MyApplication.getInstance();
		mLocClient = new LocationClient(this);
		mLocClient.registerLocationListener(myListener);
		//
		mkSerach = new MKSearch();
		mkSerach.init(app.mBMapManager, new MKSearchListener() {
			@Override
			public void onGetWalkingRouteResult(MKWalkingRouteResult arg0,
					int arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetTransitRouteResult(MKTransitRouteResult arg0,
					int arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetPoiDetailSearchResult(int arg0, int arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetDrivingRouteResult(MKDrivingRouteResult arg0,
					int arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onGetAddrResult(MKAddrInfo info, int arg1) {
				showAddr.setText(info.strAddr);
			}
		});
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);
		option.setCoorType("bd09ll");
		option.setScanSpan(300000);
		mLocClient.setLocOption(option);
		mLocClient.start();
		mMapView.getController().setZoom(16);
		mMapView.getController().enableClick(true);
		mMapView.displayZoomControls(true);
		mMapListener = new MKMapViewListener() {
			public void onMapMoveFinish() {
			}
			public void onClickMapPoi(MapPoi mapPoiInfo) {
				// TODO Auto-generated method stub
				String title = "";
				if (mapPoiInfo != null) {
					title = mapPoiInfo.strText;
					Toast.makeText(MainActivity.this, title, Toast.LENGTH_SHORT)
							.show();
				}
			}
		};
		mMapView.regMapViewListener(MyApplication.getInstance().mBMapManager,
				mMapListener);
		myLocationOverlay = new MyLocationOverlay(mMapView);
		locData = new LocationData();
		myLocationOverlay.setData(locData);
		mMapView.getOverlays().add(myLocationOverlay);
		myLocationOverlay.enableCompass();
		mMapView.refresh();
	}
	private void initMapView() {
		mMapView.setLongClickable(true);	
	}
	public class MyLocationListenner implements BDLocationListener {
		public void onReceiveLocation(BDLocation location) {
			Log.i("================", " null ============ null" + location);
			if (location == null)
				return;
			Log.i("================", "not null ============not null");
			// 31.192695,121.42712,3000
			locData.latitude = location.getLatitude();
			locData.longitude = location.getLongitude();
			locData.direction = 2.0f;
			locData.accuracy = location.getRadius();
			locData.direction = location.getDerect();
			Log.d("loctest",
					String.format("before: lat: %f lon: %f",
							location.getLatitude(), location.getLongitude()));
			myLocationOverlay.setData(locData);
			mMapView.refresh();
			mMapController
					.animateTo(new GeoPoint((int) (locData.latitude * 1e6),
							(int) (locData.longitude * 1e6)), mHandler
							.obtainMessage(1));
		}
		public void onReceivePoi(BDLocation poiLocation) {
			if (poiLocation == null) {
				return;
			}
		}
	}
	public class NotifyLister extends BDNotifyListener {
		public void onNotify(BDLocation mlocation, float distance) {
		}
	}
	@Override
	protected void onPause() {
		mMapView.onPause();
		super.onPause();
	}
	@Override
	protected void onResume() {
		mMapView.onResume();
		super.onResume();
	}
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		mMapView.onSaveInstanceState(outState);
	}
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		mMapView.onRestoreInstanceState(savedInstanceState);
	}
	public static void getPosition(GeoPoint g) {
		mkSerach.reverseGeocode(g);
		showAddr.setText("请等待...");
	}
}

4.注册监听函数

mLocClient = new LocationClient(this);
		mLocClient.registerLocationListener(myListener);

5.实现定位监听

public class MyLocationListenner implements BDLocationListener {
		public void onReceiveLocation(BDLocation location) {
			Log.i("================", " null ============ null" + location);
			if (location == null)
				return;
			Log.i("================", "not null ============not null");
			// 31.192695,121.42712,3000
			locData.latitude = location.getLatitude();
			locData.longitude = location.getLongitude();
			locData.direction = 2.0f;
			locData.accuracy = location.getRadius();
			locData.direction = location.getDerect();
			Log.d("loctest",
					String.format("before: lat: %f lon: %f",
							location.getLatitude(), location.getLongitude()));
			myLocationOverlay.setData(locData);
			mMapView.refresh();
			mMapController
					.animateTo(new GeoPoint((int) (locData.latitude * 1e6),
							(int) (locData.longitude * 1e6)), mHandler
							.obtainMessage(1));
		}
		public void onReceivePoi(BDLocation poiLocation) {
			if (poiLocation == null) {
				return;
			}
		}
	}
	public class NotifyLister extends BDNotifyListener {
		public void onNotify(BDLocation mlocation, float distance) {
		}
	}
	@Override
	protected void onPause() {
		mMapView.onPause();
		super.onPause();
	}
	@Override
	protected void onResume() {
		mMapView.onResume();
		super.onResume();
	}
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		mMapView.onSaveInstanceState(outState);
	}
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		mMapView.onRestoreInstanceState(savedInstanceState);
	}
	public static void getPosition(GeoPoint g) {
		mkSerach.reverseGeocode(g);
		showAddr.setText("请等待...");

六 设置中心点和marker


MyApplicationn.java
package com.example.positiontestforbaidu2;
import java.util.LinkedList;
import java.util.List;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.widget.Toast;

public class MyApplication extends Application {
	static MyApplication myApplication;
	BMapManager mBMapManager = null;
	String mStrKey = "BB4FEFE6EE3ADDA18993E36DC6A4F4827F30C604";
	boolean m_bKeyRight = true; // 
	private List<Activity> activityList = new LinkedList<Activity>();
	@Override
	public void onCreate() {
		myApplication = this;
		initEngineManager(this);
		super.onCreate();
	}
	public void initEngineManager(Context context) {
		if (mBMapManager == null) {
			mBMapManager = new BMapManager(context);
			Toast.makeText(MyApplication.getInstance().getApplicationContext(),
					"BMapManager  开启成功", Toast.LENGTH_LONG).show();
		}
		if (!mBMapManager.init(mStrKey, new MyGeneralListener())) {
			Toast.makeText(MyApplication.getInstance().getApplicationContext(),
					"BMapManager  开启失败", Toast.LENGTH_LONG).show();
		}
	}
	public static MyApplication getInstance() {
		if (myApplication == null) {
			myApplication = new MyApplication();
		}
		return myApplication;
	}
	public void addActivity(Activity activity) {
		activityList.add(activity);
	}
	public void exit() {
		for (Activity activity : activityList) {
			activity.finish();
		}
		System.exit(0);
	}
	static class MyGeneralListener implements MKGeneralListener {

		public void onGetNetworkState(int iError) {
			if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
				Toast.makeText(
						MyApplication.getInstance().getApplicationContext(),
						"GetNetwork失败", Toast.LENGTH_LONG).show();
			} else if (iError == MKEvent.ERROR_NETWORK_DATA) {
				Toast.makeText(
						MyApplication.getInstance().getApplicationContext(),
						"GetNetwork成功", Toast.LENGTH_LONG).show();
			}
		}
		public void onGetPermissionState(int iError) {
			if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
				Toast.makeText(
						MyApplication.getInstance().getApplicationContext(),
						"...",
						Toast.LENGTH_LONG).show();
				MyApplication.getInstance().m_bKeyRight = false;
			}
		}
	}
}
MyMapView.java
package com.example.util;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import com.example.positiontestforbaidu2.MainActivity;
import com.example.positiontestforbaidu2.MyIcon;
public class MyMapView extends MapView {
	public MyMapView(Context arg0, AttributeSet arg1) {
		super(arg0, arg1);
		// TODO Auto-generated constructor stub
	}
	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		GeoPoint g = this.getProjection().fromPixels(MyIcon.w, MyIcon.h);
		Log.i("============", "wwwwwwwwww======" + MyIcon.w);
		Log.i("============", "hhhhhhhhhh======" + MyIcon.h);
		MainActivity.getPosition(g);
		return super.onTouchEvent(arg0);
	}
}

actvity_main.xml




Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
  
     >
    <TextView 
        android:id="@+id/showAddr"
          android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="选择地点"
        android:textSize="20dp"
        />     
<com.example.util.MyMapView
        android:id="@+id/bmapsView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />  
</LinearLayout>

八 Icon

1.MyIcon1.java
package com.example.positiontestforbaidu2;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.Log;
import android.view.View;
public class MyIcon extends View {
	public static int w;
	public static int h;
	public static  Bitmap mBitmap;
	public MyIcon(Context context) {
		super(context);
		mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.me);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		w = this.getWidth() / 2 - mBitmap.getWidth() / 2;
		h = this.getHeight() / 2 - mBitmap.getHeight() / 2;
		canvas.drawBitmap(mBitmap, w, h, null);
	}
}
2.MyIcon2.java
package com.example.positiontestforbaidu2;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.View;
public class MyIcon2 extends View{
	public static int w;
	public static int h;
	private Bitmap mBitmap;
	public MyIcon2(Context context) {
		super(context);
		mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jiewo);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		w = this.getWidth() / 2 - mBitmap.getWidth() / 2;
		h = (this.getHeight() / 2 - mBitmap.getHeight() / 2) - (	MyIcon.mBitmap.getHeight()/2);
		canvas.drawBitmap(mBitmap, w, h, null);
	}
}
3.FuJin.java
package com.example.positiontestforbaidu2;
public class FuJin {
	private String name;
	private double x;
	private double y;
	private double dis;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getX() {
		return x;
	}
	public void setX(double x) {
		this.x = x;
	}
	public double getY() {
		return y;
	}
	public void setY(double y) {
		this.y = y;
	}
	public double getDis() {
		return dis;
	}
	public void setDis(double dis) {
		this.dis = dis;
	}
}

修改图标和名称

更换一下软件图标,事先准备好了一张图片来作为软件图标,图标比较简单,如图所示:

 

 

将这张图片命名成tou.png,放入res/ drawable-hdpi目录,然后修改AndroidManifest.xml中的代码,如下所示:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.positiontestforbaidu2"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="15" />
<supports-screens android:largeScreens="true"
    android:normalScreens="false" android:smallScreens="true"
    android:resizeable="true" android:anyDensity="true"/>
    <application
        android:name=".MyApplication"
        android:icon="@drawable/tou"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
    </application>
  <!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></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.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCES_MOCK_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS" />
</manifest>


这里将<application>标签的android:icon属性指定成tou.png就可以修改程序图标了。接下来我们还需要修改一下程序的名称,打开res/values/string.xml文件,其中app_name对应的就是程序名称,将它修改成AirMap即可,如下所示:

<resources>
    <string name="app_name">AirMap</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
</resources>


更换后的软件图标如下图所示:


 

这样我们就终于大功告成了!

后续可添加改进

经过多个阶段的开发,AirMap已经是一个可以顺利运行的小软件程序,但是还是不够完善跟成熟,该程序还仅仅只是具备了一些最基本的功能,和那些商业软件相比还有很大的差距,因此仍然需要时间来进行一些完善和优化。

以下一些功能还有待完善和处理:

1. 增加导航功能,使使用者不仅能得到一个定位,还能去到自己想去的地方。

2. 优化软件界面,提供更加优美的使用界面,提升用户使用满意度。

3. 增加线路规划功能,为用户提供更多选择。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值