一、目标
根据安全号码发送的指令完成相应的操作。
二、代码实现
1、完成播放报警音乐操作
①.在res文件夹下新建名为raw文件夹,并将音频文件拷贝至该文件夹下;
②.在播放报警音乐命令代码处(即SMSReceiver类中的else if("#*alarm*#".equals(body))里面),通过MediaPlayer对象的create(Context context(上下文), int resid(资源文件id))方法创建一个MediaPlayer对象,参数resid就是刚才的raw文件夹下的音频文件(注意在导R.raw包时要导项目文件包,非android.R包)
③.调用MediaPlayer对象的start()方法播放音频,其他setLooping(boolean looping)方法、setVolume(float leftVolume, float rightVolume)方法分别用于设置循环播放、左右声道音量。
代码如下:
1 //播放报警音乐2 //Toast.makeText(context, "已播放报警音乐", Toast.LENGTH_SHORT).show();3 MediaPlayer player = MediaPlayer.create(context, R.raw.warning);4 player.setLooping(false);5 player.setVolume(1.0f, 1.0f);6 player.start();7 abortBroadcast();
2、完成获取GPS位置操作
①.GPS位置的最好采用服务进行,所以在src文件夹下新建service包(取名com.example.mobilesafe.service),主要用于存放各类服务;
②.新建类(取名GPSService)用于实现GPS服务,并继承系统的Service,然后在功能清单文件(AndroidManifest.xml)中注册服务;
注册代码如下:
1
③.在新建的服务类(GPSService)中复写onCreate()方法和onDestroy() 方法,定义LocationManager对象(取名lm),
④.在新建的服务类(GPSService)的onCreate()方法,
1).通过getSystemService(String name)方法获取系统服务,参数name为LOCATION_SERVICE(位置服务)并强转成LocationManager;(额外知识点:通过LocationManager对象的getAllProviders()方法可以获取所有定位的方式(主要为网络定位、基站定位和GPS定位),该方法返回值类型为String类型的list数组,遍历这个数组便可得到定位方式)
2).通过LocationManager对象(变量名lm)的requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法更新位置变化,参数一provider为定位方式,参数二minTime多少时间更新(毫秒为单位,0表示忽略),参数三minDistance位置变化多少米更新(米为单位,0表示忽略),参数四listener位置监听器(接口,需要实现);
对于参数一provider(定位方式)可通过LocationManager对象(变量名lm)的getBestProvider(Criteria criteria, boolean enabledOnly(是否为可以的))方法获取最优的定位方式,参数Criteria criteria为最优定位方式的选择标准,可以通过Criteria对象的setXXX方法设置最大精度(Accuracy)、对电量的要求(PowerRequirement)、是否付费(CostAllowed)、海拔信息(Altitude)等。
代码如下:
1 Criteria criteria = new Criteria();2 criteria.setAccuracy(Criteria.ACCURACY_FINE);3 String bestProvider = lm.getBestProvider(criteria, true);4 lm.requestLocationUpdates(bestProvider, 0, 0, listener);
⑤.新建类(取名MyLocationListener)实现位置监听器接口(LocationListener),实现其未实现的四个方法:1.onLocationChanged(Location location) 当位置变化的时候回调该方法、2.onStatusChanged(String provider, int status, Bundle extras) 当状态变化(定位开启或关闭)的时候调用该方法、3.onProviderEnabled(String provider) 当三类定位方式中的某一个可以使用时调用该方法、4.onProviderDisabled(String provider) 当三类定位方式中的某一个不可使用时调用该方法。定义变量并通过new使其实例化。
在onLocationChanged(Location location) 位置变化的回调方法中
1).通过location对象的getLatitude()方法获取位置标准的纬度(double类型,可加“”成String类型),getLongitude()方法获取位置标准的纬度,getAccuracy()方法获取精确度
注意:此时获得的是标准的经纬度,该经纬度与地图(Google地图)上的坐标还是有一定偏差的,因此,需要将该经纬度进行转化,具体详见“火星坐标”章节介绍。
2).通过SharedPreferences对象将最后的坐标位置以键值对的形式保存至“config”文件中;
保存代码如下:
1 //通过SharedPreferences对象将最新的位置坐标保存以键值对的形式至config文件中2 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);3 Editor editor = sp.edit();4 editor.putString("lastlocation", latitude+longitude+accuracy);5 editor.commit();
⑤.在新建的服务类(GPSService)的onDestroy()方法中,当服务销毁时取消位置服务的监听,即复写Activity的onDestroy()方法,并通过LocationManager对象的removeUpdates(LocationListener listener)移除监听,同时将监听器设为空(null),以节约资源。
⑥.在短信接受器(SMSReceiver)类中的短信内容为“获取GPS位置("#*location*#".equals(body))”时
1).通过Intent(Context packageContext, Class<?> cls)的startService(Intent service)方法启动刚新建的GPS服务类;
启动GPS服务代码如下:
1 //启动GPS服务2 Intent intentGPS = new Intent(context, GPSService.class);3 context.startService(intentGPS);
2).通过SharedPreference对象获取最新的位置坐标,并判断所获取的坐标值是否为空,若为空则说明还未获取到位置,可通过SmsManager对象的sendTextMessage(String destinationAddress(收件人,此处为sender即安全号码), String scAddress, String text(短信内容), PendingIntent sentIntent, PendingIntent deliveryIntent)方法(其余均为null)回发短信告知安全号码;若不为空则发送位置信息至安全号码。
3).增加获取位置信息权限:ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、ACCESS_MOCK_LOCATION。