`
busiying119
  • 浏览: 1174 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类

关于android上的google地图和短信监听的例子讨论

阅读更多
这阵子网上各种查代码写了一个监听短信的服务,然后返回一个带有gps地址的短信,并解析gps地址在地图上显示出来的一个小程序,但是返回来的短信在地图显示的时候出了问题,大家讨论下我的方法,欢迎拍砖,小弟正在学习中 

首先是服务代码:
package android.org;

import android.app.Service;

import android.content.ContentResolver;

import android.content.Intent;

import android.database.ContentObserver;

import android.os.Handler;

import android.os.IBinder;

import android.os.Process;

import android.util.Log;

 

import android.org.SMS;

import android.org.SMSHandler;

import android.org.SMSObserver;

 

public class BootService extends Service

{

    public static final String TAG = "BootService";

    

    private ContentObserver mObserver;

 

    private Handler mHandler = new Handler();

    

    @Override

    public void onCreate()

    {

       Log.i(TAG, "onCreate().");

       super.onCreate();

       addSMSObserver();

    }

    

    public void addSMSObserver()

    {

       Log.i(TAG, "add a SMS observer. ");

       ContentResolver resolver = getContentResolver();

       Handler handler = new SMSHandler(this);

       mObserver = new SMSObserver(resolver, handler);

       resolver.registerContentObserver(SMS.CONTENT_URI, true, mObserver);

    }

 

    @Override

    public IBinder onBind(Intent intent)

    {

       return null;

    }

 

    @Override

    public void onDestroy()

    {

       Log.i(TAG, "onDestroy().");

       

       this.getContentResolver().unregisterContentObserver(mObserver);

       

       super.onDestroy();

 

       Process.killProcess(Process.myPid());

       System.exit(0);

    }

}



然后是ContentObserver类,用来自定义监听短信数据库,我这里将以“gps”开头的短信截获,然后传给mHandler.sendMessage(message);去处理
Handler的代码如下:也是我的问题来了,解析的短信不能显示到地图上,location获取到的也不是null。(尽管这个问题也纠结了很久)难道说是数据解析的问题?没什么难的逻辑啊,主要流程就是,我给我的服务发送一条内容是“gps01”的短信,然后截获后传给handler的handleMessage方法处理,并且最终解析到地图上显示出来位置。
package android.org;

import android.app.AlertDialog;
import android.content.ContentUris;

import android.content.Context;

import android.content.Intent;

import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;

import android.os.Bundle;
import android.os.Handler;

import android.os.Message;

import android.telephony.SmsManager;
import android.util.Log;

 

public class SMSHandler extends Handler

{

    public static final String TAG = "SMSHandler";

 

    private Context mContext;
    private LocationManager locationManager;
    private Location location;
    private AlertDialog.Builder myDialog;

    private final LocationListener locationListener = new LocationListener() {
     public void onLocationChanged(Location location) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
     // log it when the location changes
     if (location != null) {
     Log.i("SuperMap", "Location changed : Lat: "
     + location.getLatitude() + " Lng: "
     + location.getLongitude());
     }
     }
     public void onProviderDisabled(String provider) {
     // Provider被disable时触发此函数,比如GPS被关闭
     }
     public void onProviderEnabled(String provider) {
     //  Provider被enable时触发此函数,比如GPS被打开
     }
     public void onStatusChanged(String provider, int status, Bundle extras) {
     // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
     }
     };

    
    
    public SMSHandler(Context context)

    {

       super();

       this.mContext = context;

    }

    
    @Override
    public void handleMessage(Message message)

    {

       Log.i(TAG,  "handleMessage: " + message);

       

       MessageItem item = (MessageItem) message.obj;

       //delete the sms

       Uri uri = ContentUris.withAppendedId(SMS.CONTENT_URI, item.getId());
       
       
       
       String l,r,body;
       body=item.getBody().substring(3, item.getBody().length());
       
       
//       
       mContext.getContentResolver().delete(uri, null, null);
       
       Log.i(TAG,  "delete sms item: " + item);
//       AlertDialog.Builder myDialog = new AlertDialog.Builder(this.mContext);
//       myDialog.setTitle("短信状态");
//       myDialog.setMessage("delete sms item:");
//   	   myDialog.show();
       if(body.substring(0, 2).equals("01")){
    	   //获取本地gps地址
//    	   LocationManager locationManager = (LocationManager)this.mContext.getSystemService(this.mContext.LOCATION_SERVICE);
////    	   locationManager.setTestProviderEnabled("gps", true);
//    	   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
//    	   
//    	   Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//    	  
//    	   while(location  == null)    
//    	   {    
//    		   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1, locationListener);    
//    	   }  
//
//    	   
//    	   
    	   
    	   getLocation();
    	   String latitude = Double.toString(location.getLatitude());//经度
    	   String longitude = Double.toString(location.getLongitude());//纬度
    	   String altitude = Double.toString(location.getAltitude());//海拔
    	   String result = "gps02"+latitude+":"+longitude;
    	   
    	   SmsManager sms = SmsManager.getDefault();   
    	   

    	   
           sms.sendTextMessage("13426294680", null, result, null, null);
    	   
       }
       else if(body.substring(0, 2).equals("02")){
    	   Intent intents = new Intent();
    	   intents.setClass(this.mContext, CityMap.class);
           Bundle bun = new Bundle();
           String gps[] = body.substring(2, body.length()).split(":");
           l=gps[0];
           r=gps[1];
           bun.putString("gps_l", l);
           bun.putString("gps_r",r);
           intents.putExtras(bun);
           myDialog = new AlertDialog.Builder(this.mContext);
           myDialog.setTitle("发送状态");
           myDialog.setMessage(body);
           myDialog.show();
           intents.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
           this.mContext.startActivity(intents);
    	   
       }
//       else{
//    	   
//    	   Intent intents = new Intent();
//    	   intents.setClass(this.mContext, CityMap.class);
//           Bundle bun = new Bundle();
//           bun.putString("gps_l", "55555");
//           bun.putString("gps_r","55555");
//           intents.putExtras(bun);
//           intents.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
//           this.mContext.startActivity(intents);
//       }
        

    }
    private void getLocation()    {        
    	// 获取位置管理服务        LocationManager locationManager;
    	String serviceName = this.mContext.LOCATION_SERVICE;        
    	locationManager = (LocationManager) this.mContext.getSystemService(serviceName);        
    	// 查找到服务信息        
    	Criteria criteria = new Criteria();        
    	criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度        
    	criteria.setAltitudeRequired(false);        
    	criteria.setBearingRequired(false);        
    	criteria.setCostAllowed(true);        
    	criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗        
    	String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息        
    	this.location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置        
//    	updateToNewLocation(location);        // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米        
    	locationManager.requestLocationUpdates(provider, 100 * 1000, 500,locationListener);    
    	}

}



下面是地图显示的代码:
package android.org;

import java.util.List;

import android.org.R;
import android.org.CityMap.MyLocationOverlay;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.app.*;
import android.content.pm.ApplicationInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;

public class CityMap extends MapActivity{
	private MapView myMapView;   
	private Button button; 
	private EditText weidu; 
	private EditText jingdu; 
	private MapView mapView; 
	private int level = 8; 
	GeoPoint point; 
    @Override   
    public void onCreate(Bundle icicle) {   
        super.onCreate(icicle);   
           
        Bundle extras = getIntent().getExtras();   
        
        // get the geopoint by city   
//        String city = extras.getString(MapConstants.CITY_NAME);   
           
        GeoPoint gp = new GeoPoint(111,11);  
        
        setContentView(R.layout.earth);
        Bundle bun=this.getIntent().getExtras();
        final String l=bun.getString("gps_l");
        final String r=bun.getString("gps_r");
        
        
        button = (Button) findViewById(R.id.bu); 
        mapView = ((MapView) findViewById(R.id.mv)); 
        mapView.setClickable(true); 
        mapView.setEnabled(true); 
     // 切换到卫星地图 
        mapView.setSatellite(true);  
        mapView.setTraffic(false); // 交通模式 
 
        mapView.getController().setZoom(level++);// 设置地图放大的级别 
        List<Overlay> laies = mapView.getOverlays(); 
        button.setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
        point = new GeoPoint((int) (Double.parseDouble(l)* 1E6), (int) (Double.parseDouble(r)* 1E6)); 
        mapView.getController().animateTo(point); // 把地图移动到指定的经纬度 
        // 注意在我们使用Android的map时如果没有得到google的授权那么我们将不会取得任何数据 
        List<Overlay> laies = mapView.getOverlays(); 
        laies.clear(); 
        MyLocationOverlay myLocationOverlay;
//        myLocationOverlay.bitmap = new Bitmap("icon.bmp");
        laies.add(new MyLocationOverlay()); 
        } 
        }); 
          
	            
    }
    
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	
	    
	    

	public boolean onKeyDown(int keyCode, KeyEvent event) {   
        if (keyCode == KeyEvent.KEYCODE_I) {   
            // zoom in 
            myMapView.getController().setZoom(myMapView.getZoomLevel() + 1);   
            return true;   
        } else if (keyCode == KeyEvent.KEYCODE_O) {   
            // zoom out  

            myMapView.getController().setZoom(myMapView.getZoomLevel() - 1);   
//            定位到指定的经纬度: 
//            mc.animateTo(pointFuZhou);

            return true;   
        } else if (keyCode == KeyEvent.KEYCODE_S) {   
          // 卫星地图 

//        	myMapView.setSatellite(true); // 卫星模式
//        	myMapView.setTraffic(false); // 交通模式

            myMapView.setSatellite(true);  
            myMapView.setTraffic(false); // 交通模式
            return true;   
        } else if (keyCode == KeyEvent.KEYCODE_T) {   
            // traffic,路况 
        	myMapView.setSatellite(false);  
            myMapView.setTraffic(true); // 交通模式;   
            return true;   
        }   
        return false;   
    } 
	public boolean onCreateOptionsMenu(Menu menu) {   
        super.onCreateOptionsMenu(menu);   
        menu.add(0,1,1, R.string.exit_citymap);   
        return true;   
    }   
       
    @Override   
    public boolean onMenuItemSelected(int featureId, MenuItem  item) {   
        super.onMenuItemSelected(featureId, item);   
        switch(item.getItemId()) {   
        case 1:   
            finish();   
            break;   
        }   
           
        return true;   
    }
    

	class MyLocationOverlay extends Overlay { 
		Bitmap bitmap;
		@Override 
		public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
		long when) { 
		super.draw(canvas, mapView, shadow, when); 
		Paint paint = new Paint(); 
		Point p = new Point(); 
		paint.setStrokeWidth(2); 
		paint.setARGB(255, 0, 0, 0); 
		mapView.getProjection().toPixels(point, p); 
//		canvas.drawText("不死鹰", p.x, p.y, paint);
		bitmap = getRes("icon1");
		canvas.drawBitmap(bitmap, p.x, p.y, paint); 
		return true; 
		} 
		public Bitmap getRes(String name) {

	    	ApplicationInfo appInfo = getApplicationInfo();

	    	int resID = getResources().getIdentifier(name, "drawable", appInfo.packageName);

	    	return BitmapFactory.decodeResource(getResources(), resID);

	    }
		}

}

xml权限代码:
    
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.WRITE_SMS"/>
	<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
	<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />


现在需要讨论的问题就是:
1、获取gps的位置的时候,一开始总是为空,然后换了现在这种方法后才能获取到具体地址,是什么原因
2、手机上测试的时候(我的手机是魅族M9),并没有开gps开关,是如何定位gps位置的
3、显示的时候,google地图和电脑版的不一样,没有大楼说明,也没有街道说明,我并不是没有试过打开街道显示,总之地图上的具体描述不多,光秃秃的卫星地图或者交通图。
4、我的短信解析是否有问题,例如我发送一条地址短信“gps0235.3333222222:135.2322342222”为什么程序异常终止
5、我在activity里设置了一个按钮,启动我的服务,但如果我多次点击这个按钮会不会实例化多个服务?从而占用手机内存?如何解决这个问题


欢迎各位android大侠前来讨论指导,移动论坛里向来不乏高手,但最近表示大侠们太低调了,技术贴好久都没有更新,lordhong也不前来光顾了
分享到:
评论
7 楼 busiying119 2011-05-31  
chandler 写道
busiying119 写道
chandler 写道
用魅族来做测试机。我看你脑袋真是秀逗了。还是放弃开发android吧。

M9的系统关了好些权限,最近的新固件才把短信的权限打开,别的权限还不知道,不过我想这也是为了手机安全才这样做的,一些正常的软件用M9来测试是没问题的吧?


和魅族没关系,是你的人的问题。是通过你会选用魅族的机器做测试机,所以你这个人不适合做android开发。因为了解行业的人,都知道魅族这款机器,在很多乱七八糟的地方做了一些自定义方面的设置。使得会得开发的时候出现极其恶心的兼容性问题。这是行业皆知的事情,除非万不得已,躲着还不及。你自己还主动撞上去。

android现在才刚起步,要想做好。自己收集信息的能力很重要。这个大家都知道的事情,你都不知道。做什么android啊。


你说的确实是事实,但我是没有办法啊。我买手机的时候就选择了M9,这也是万不得已,开发过程中确实也遇到n多诡异问题,我属于是自学没有了解到一些内部的行业消息,如果我能渐渐加入android开发的行列,你能把我认为是android开发的一员我倒是很高心
6 楼 busiying119 2011-05-31  
chandler 写道
busiying119 写道
chandler 写道
用魅族来做测试机。我看你脑袋真是秀逗了。还是放弃开发android吧。

M9的系统关了好些权限,最近的新固件才把短信的权限打开,别的权限还不知道,不过我想这也是为了手机安全才这样做的,一些正常的软件用M9来测试是没问题的吧?


和魅族没关系,是你的人的问题。是通过你会选用魅族的机器做测试机,所以你这个人不适合做android开发。因为了解行业的人,都知道魅族这款机器,在很多乱七八糟的地方做了一些自定义方面的设置。使得会得开发的时候出现极其恶心的兼容性问题。这是行业皆知的事情,除非万不得已,躲着还不及。你自己还主动撞上去。

android现在才刚起步,要想做好。自己收集信息的能力很重要。这个大家都知道的事情,你都不知道。做什么android啊。


你说的确实是事实,但我是没有办法啊。我买手机的时候就选择了M9,这也是万不得已,开发过程中确实也遇到n多诡异问题,我属于是自学没有了解到一些内部的行业消息,如果我能渐渐加入android开发的行列,你能把我认为是android开发的一员我倒是很高心
5 楼 chandler 2011-05-30  
busiying119 写道
chandler 写道
用魅族来做测试机。我看你脑袋真是秀逗了。还是放弃开发android吧。

M9的系统关了好些权限,最近的新固件才把短信的权限打开,别的权限还不知道,不过我想这也是为了手机安全才这样做的,一些正常的软件用M9来测试是没问题的吧?


和魅族没关系,是你的人的问题。是通过你会选用魅族的机器做测试机,所以你这个人不适合做android开发。因为了解行业的人,都知道魅族这款机器,在很多乱七八糟的地方做了一些自定义方面的设置。使得会得开发的时候出现极其恶心的兼容性问题。这是行业皆知的事情,除非万不得已,躲着还不及。你自己还主动撞上去。

android现在才刚起步,要想做好。自己收集信息的能力很重要。这个大家都知道的事情,你都不知道。做什么android啊。


4 楼 busiying119 2011-05-30  
wdq 写道
这样看基本上,看不出什么问题!要是能把源码贴出来,可能找起问题来快些

代码功能问题目前倒是已经基本解决,第5个启动服务的问题还是不太清楚,内存的占用和回收问题不太懂
3 楼 busiying119 2011-05-30  
chandler 写道
用魅族来做测试机。我看你脑袋真是秀逗了。还是放弃开发android吧。

M9的系统关了好些权限,最近的新固件才把短信的权限打开,别的权限还不知道,不过我想这也是为了手机安全才这样做的,一些正常的软件用M9来测试是没问题的吧?
2 楼 chandler 2011-05-30  
用魅族来做测试机。我看你脑袋真是秀逗了。还是放弃开发android吧。
1 楼 wdq 2011-05-30  
这样看基本上,看不出什么问题!要是能把源码贴出来,可能找起问题来快些

相关推荐

    Android 谷歌地图标记所在位置简单例子

    本示例是一个针对新手的简单教程,演示如何在Android 2.2(API Level 8)上集成并使用谷歌地图API来显示地图并标记当前位置。我们将探讨以下几个关键知识点: 1. **获取Google Maps API Key** 在Android应用中使用...

    android扩展TiledServiceLayer 实现天地图和谷歌地图的浏览

    总之,`TiledServiceLayer`是Android地图应用开发中的一个重要工具,通过自定义服务层,开发者可以轻松地接入各种地图服务,如天地图和谷歌地图。在实际开发中,需要充分考虑性能、用户体验和错误处理,以构建出高...

    android百度地图小例子

    本篇文章将详细解析“android百度地图小例子”这个应用示例,帮助你理解和掌握如何在Android应用中集成并使用百度地图。 首先,我们需要了解的是百度地图SDK。百度地图提供了针对Android平台的SDK,它包含了丰富的...

    android地图例子

    通过深入研究这两个文件,开发者可以掌握如何在Android应用中集成谷歌地图,实现基本的地图显示、定位、标记和交互等功能,甚至更复杂的地图操作。这对于开发任何涉及地理位置的应用都是非常有价值的。

    android 下做的几个地图例子

    标题中的“android 下做的几个地图例子”指的是利用Android SDK和AutoNavi地图SDK创建的一些示例项目,这些示例涵盖了基本的地图展示、定位、标注等功能。下面我们将深入探讨这些知识点。 1. **Android Map API**:...

    Android上Google Map开发的例子程序

    在Android平台上,Google Map API是开发者用来集成地图功能的关键工具,它可以让你在应用程序中嵌入交互式地图,提供导航、定位、标记等丰富的功能。本示例程序将带你深入理解如何在Android应用中使用Google Map API...

    Android例子源码自带日历改进版有长按监听

    在实际应用中,开发者还可以根据需求进一步扩展这个例子,比如添加日程添加和编辑功能、集成Google Calendar API、实现多语言支持、优化性能和动画效果等。通过这个例子,开发者不仅可以掌握自定义日历视图的基本...

    android应用程序小例子

    在Android应用程序开发中,我们经常会遇到各种各样的小例子,这些例子可以帮助开发者更好地理解和掌握Android SDK中的各种功能和API。本篇文章将详细探讨"android应用程序小例子"这一主题,涵盖从基础概念到实际应用...

    Android 地图例子

    本文将深入探讨如何在Android应用中集成地图,以“Android地图例子”为例,结合“教程说明见这里.txt”和“BaiduMap”这两个文件名,我们将主要关注Android地图API的使用,特别是百度地图API。 首先,集成地图服务...

    动手学Android之三——第一个界面例子程序

    在Android开发的学习过程中,创建第一个界面例子程序是至关重要的步骤,它能让你对Android应用程序的基本结构和工作原理有一个直观的理解。本教程将深入探讨如何在Android环境中构建一个简单的用户界面,我们将称之...

    android第一个例子

    在Android开发领域,"android第一个例子"通常是指创建并运行你的第一个Android应用程序,这是一个学习Android编程的基础步骤。在这个过程中,开发者会接触到Android Studio这个强大的集成开发环境(IDE),以及相关...

    一个Android的入门例子

    通过这个入门例子,你将了解Android应用的基本结构和工作原理,为后续更复杂的开发打下基础。学习Android开发,你还需要掌握Android的组件系统(如Service、BroadcastReceiver)、意图(Intent)用于组件间的通信、...

    android从基础到精通所有的例子大集合

    5. 地图(Map):集成Google Maps API可以实现在应用中显示地图、定位、路径规划等功能。需要申请API密钥,并学习使用MapFragment或MapView组件。 6. 服务(Service):服务是后台运行的组件,用于执行长时间运行的...

    android编程权威指南配套例子代码

    这本书全面介绍了Android应用程序开发的相关知识,旨在帮助读者掌握Android平台上的编程技能。配套的例子代码是学习过程中的重要参考资料,它们涵盖了书中讲解的各种关键概念和技术,有助于读者深入理解并实践书中的...

    Android定位例子

    在Android开发中,定位服务是不...通过研究和理解这个例子,你将能够熟练地在Android应用中集成和管理定位功能。同时,还可以结合Google Play服务中的Fused Location Provider API,以获得更高效、省电的定位解决方案。

    Android移动开发例子

    【Android移动开发例子】 ...通过这个"Android移动开发例子",你不仅能学习到Android开发的基本概念和技术,还能提升解决问题和项目管理的能力。随着经验的积累,你将能够开发出更多复杂且具有吸引力的Android应用。

    android例子,android初学教程

    10. **模拟器与真机测试**:Android Studio内置了模拟器,方便开发者在不同设备和系统版本上测试应用。同时,也可以连接真实设备进行调试,确保应用在多种环境下都能正常运行。 11. **权限管理**:从Android 6.0...

    android例子身高体重指数

    这个"android例子身高体重指数"项目是Android开发入门指南(第二版)中的一个示例,旨在帮助初学者理解如何在Android平台上构建一个实用的应用程序。下面将详细阐述该例子涉及的主要知识点以及实现过程。 首先,...

    Android开发教程之 Google translate api例子--千锋培训

    ### Android开发教程之 Google Translate API 实例解析 #### 一、引言 随着移动互联网的发展,Android应用程序的需求日益增长,特别是在全球化交流日益频繁的今天,语言翻译应用变得尤为重要。本篇教程将详细介绍...

    android 安卓经典代码例子25个合集.zip

    这个"android 安卓经典代码例子25个合集.zip"文件包含了多个实用示例,涵盖了Android开发中的关键技术和最佳实践。让我们逐一探讨这些知识点。 1. **Activity与Intent**:Activity是Android应用的基本组件,用于...

Global site tag (gtag.js) - Google Analytics