Android实例-手机安全卫士(三十)-根据指令完成相应操作一(报警音乐和GPS追踪)

一、目标

  根据安全号码发送的指令完成相应的操作。

                    

二、代码实现

  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 <service android:name="com.example.mobilesafe.service.GPSService"></service>

    ③.在新建的服务类(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。

时间: 2024-10-06 07:27:23

Android实例-手机安全卫士(三十)-根据指令完成相应操作一(报警音乐和GPS追踪)的相关文章

Android实例-手机安全卫士(十八)-完成设置向导的4个UI和跳转事件

一.目标. 制作向导设置里面每一步的UI布局及点击事件控制. 1.使用自定义button背景.自定义组合控件.自定义文本样式等. 2.利用SharedPreferences对象,设置应用程序配置信息(向导设置完成后就不再进入)           二.代码实现. 1.在程序包下新建另外3个UI的类(分别为SetupWizard_ui_2.java.SetupWizard_ui_3.java.SetupWizard_ui_4.java),并在配置文件中注册Activity. 2.根据UI设计,在设

Android实例-手机安全卫士(十)-自定义对话框

一.目标. 当点击“手机防盗”时弹出自定义的设置密码对话框.如果已经设置密码,则弹出自定义的输入密码对话框. 二.代码实现. 1.在layout文件夹下新建xml(取名setpwddialog.xml)文件用于设置自定义对话框的UI. 新建xml文件代码如下; 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.a

Android实例-手机安全卫士(十四)-为密码进行MD5加密

一.目标. 将设置的密码通过MD5加密后再保存. 二.代码实现. 1.在自定义工具包(com.example.mobilesafe.ui)中新增一个类(取名MD5Utils).在新建类(MD5Utils)中新建一个返回值为String类型的public的静态方法(取名mD5Encryption),传入参数为String类型(password). 2.在新建的方法(md5Encryption)中: ①.通过消息摘要器对象(MessageDigest)的getInstance(String algo

Android实例-手机安全卫士(十二)-制作输入密码对话框并设置相应点击事件

一.目标. 自定义输入密码对话框,根据输入的密码与保存着的密码进行判断. 二.代码实现. 1. 采用第十节的方法自定义一个输入密码的对话框. 2.为按钮设置点击事件,主要介绍“确认”按钮的点击事件. ①.通过TextView对象的getText()得到文本并通过toString()转成字符串再通过trim()去除空格,得到String对象的输入密码: ②.通过SharedPreferences对象的getString(String key, String defValue)获得保存着的密码,参数

Android实例-手机安全卫士(十五)-由主界面进入手机防盗界面

一.目标 1.在主界面中通过“设置防盗密码”或者“输入防盗密码”后,对话框消失,并进入”手机防盗界面“. 2.进入是”手机防盗界面“时,根据有无完成”手机防盗设置向导“的情况进入不同的界面.若未完成,则进入向导界面,若已完成,则进入防盗界面.          二.代码实现. 1.在程序包(com.example.mobilesafe)下新建两个Activity(分别取名SecurityActivity和SetupWizard),并在配置文件(AndroidManifest.xml)中完成注册.

Android实例-手机安全卫士(三)-设计主页面UI

一.目标. 主界面UI如图所示: 方面是一个功能列表提示框(采用TextView),下面是功能列表(采用GridView). 二.代码实现. 1.在主界面布局文件(activity_home.xml)中增加组件.主界面布局文件(activity_home.xml)采用线性布局,上面一个TextView,根据UI设置相应属性:下面一个是GridView,通过android:numColumns属性设置该组件的列数,由于GridView还需要inflate单个布局文件,所以为其设置id. 主界面布局

Android实例-手机安全卫士(三十一)-根据指令完成相应操作二(锁屏和数据清除)

一.目标 1.实现远程锁屏和数据销毁操作: 2.初步制作“一键锁屏”应用和优化. 二.代码实现 1.在Receiver包下新建一个类(取名LockScreenReceiver)继承DeviceAdminReceiver类(是BroadcastReceiver类的一个子类),并在清单配置文件配置receiver标签 (1)在receiver标签中,增加name.permission属性,name为新建类(LockScreenReceiver)的全路径名称,permission为必须的BIND_DE

Android实例-手机安全卫士(二十九)-接受安全号码发送的指令

一.目标 1.利用广播接收者接受安全号码发送的短信: 2.根据短信内容完成相应指令操作(此处暂以Toast形式代替).        二.代码实现 1.在receiver包下新建一个SMSReceiver类继承BroadcastReceiver,并在功能清单文件(AndroidManifest.xml)中的<application>内注册该receiver,名称为其全路径名称,意图过滤器(<intent-filter>)中设置优先级(android:priority)高一些(如10

Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

一.目标 1.根据service是否在后台运行情况来确定CheckBox的选中状态: 2.解决"设置中心"的“开启来电号码显示归属地”功能在退出程序再进入时选中状态消失,在任务管理器中关闭“来显”服务时,功能仍为选中状态 二.代码实现 1.在src文件下新建一个包(取名com.example.mobilesafe.utils)用于存放各种工具类: 2.在工具类包下新建类(取名ServiceUtils,无需继承任何类),用于校验某个服务是否在正常运行(开启):在新建类(ServiceUt