android 实现监听短信接收并将当前位置发送出去

来源:互联网 发布:中译英 字数比例 知乎 编辑:程序博客网 时间:2024/04/16 12:53

1、获取定位地址,这里使用高德定位,从官网下载定位的jar包AMap_Location_V3.50_20170731.jar包然后在build.gradle

compile files('libs/AMap_Location_V3.5.0_20170731.jar')
然后在权限文件中添加需要的权限和申请的key

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.a550211.patentproject">    <uses-permission android:name="android.permission.WRITE_SMS" />    <uses-permission android:name="android.permission.READ_SMS" />    <uses-permission android:name="android.permission.RECEIVE_SMS" />    <uses-permission android:name="android.permission.READ_CONTACTS"/>    <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>    <!--用于进行网络定位-->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>    <!--用于访问GPS定位-->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>    <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>    <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>    <!--用于访问网络,网络定位需要上网-->    <uses-permission android:name="android.permission.INTERNET"></uses-permission>    <!--用于读取手机当前的状态-->    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>    <!--用于写入缓存数据到扩展存储卡-->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>    <!--用于申请调用A-GPS模块-->    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>    <!--用于申请获取蓝牙信息进行室内定位-->    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:name=".MyApplication"        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>        <receiver android:name=".SMSBroadcastReceiver">            <intent-filter android:priority="1000">                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>            </intent-filter>        </receiver>        <meta-data android:name="com.amap.api.v2.apikey" android:value="12026fe07b5e1fd21ea299e7474edd65">//开发者申请的key        </meta-data>        <service android:name="com.amap.api.location.APSService"></service>    </application></manifest>
定位地址获取代码

 private void getLocation(Context context) {        mLocationClient = new AMapLocationClient(context);        mLocationOption = new AMapLocationClientOption();        mLocationClient.setLocationListener((AMapLocationListener) context);        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);        mLocationOption.setInterval(2000);        mLocationClient.setLocationOption(mLocationOption);        mLocationClient.startLocation();        mLocationOption.setNeedAddress(true);        mLocationOption.setWifiActiveScan(false);    }    @Override    public void onLocationChanged(AMapLocation amapLocation) {        if (amapLocation != null) {            if (amapLocation.getErrorCode() == 0) {                SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");                Date curDate = new Date(System.currentTimeMillis());//获取当前时间                String str = formatter.format(curDate);                position = amapLocation.getCountry() + amapLocation.getProvince() + amapLocation.getCity() + amapLocation.getDistrict() + amapLocation.getStreet()                        + amapLocation.getStreetNum() + amapLocation.getAoiName() + " buildId=" + amapLocation.getAddress() + " floor=" + amapLocation.getFloor();                Log.e(TAG, "position=" + position + " data = " + str);            } else {                Log.e("AmapError", "location Error, ErrCode:"                        + amapLocation.getErrorCode() + ", errInfo:"                        + amapLocation.getErrorInfo());            }        }    }    /**     *   //定位成功回调信息,设置相关消息     amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表     amapLocation.getLatitude();//获取纬度     amapLocation.getLongitude();//获取经度     amapLocation.getAccuracy();//获取精度信息     amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。     amapLocation.getCountry();//国家信息     amapLocation.getProvince();//省信息     amapLocation.getCity();//城市信息     amapLocation.getDistrict();//城区信息     amapLocation.getStreet();//街道信息     amapLocation.getStreetNum();//街道门牌号信息     amapLocation.getCityCode();//城市编码     amapLocation.getAdCode();//地区编码     amapLocation.getAoiName();//获取当前定位点的AOI信息     amapLocation.getBuildingId();//获取当前室内定位的建筑物Id     amapLocation.getFloor();//获取当前室内定位的楼层     */
2、短信发送方法

 private void sendSms(String phone, String message, Context context) {        SmsManager smsManager = SmsManager.getDefault();        if (message.length() <= 70) {            smsManager.sendTextMessage(phone, null, message, null, null);        } else {            List<String> smsDivs = smsManager.divideMessage(message);            for (String ss : smsDivs) {                smsManager.sendTextMessage(phone, null, ss, null, null);            }        }    }
3、监听短信进来方法

if (intent.getAction().equals(ACTION)) {            StringBuffer SMSAddress = new StringBuffer();            StringBuffer SMSContent = new StringBuffer();            Bundle bundle = intent.getExtras();            if (bundle != null) {                Object[] pdusObjects = (Object[]) bundle.get("pdus");                SmsMessage[] messages = new SmsMessage[pdusObjects.length];                for (int i = 0; i < pdusObjects.length; i++) {                    messages[i] = SmsMessage                            .createFromPdu((byte[]) pdusObjects[i]);                }                for (SmsMessage message : messages) {                    SMSAddress.append(message.getDisplayOriginatingAddress());                    SMSContent.append(message.getDisplayMessageBody());                    Log.e(TAG, "发送号码:" + SMSAddress + "\n" + "短信内容:" + SMSContent + " number=" + apkDao.query().get(0));                    String phone = SMSAddress.toString();                    phone = phone.replace("+86", "");                    sendSms(phone, position, context);                }            }        }
4、完整代码

package com.example.a550211.patentproject;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsManager;import android.telephony.SmsMessage;import android.util.Log;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;public class SMSBroadcastReceiver extends BroadcastReceiver implements AMapLocationListener {    private final String TAG = "SMSBroadcastReceiver";    private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";    //声明mLocationOption对象    public AMapLocationClientOption mLocationOption = null;    private AMapLocationClient mLocationClient;    private String position = null;    @Override    public void onReceive(Context context, Intent intent) {        ApkDao apkDao = new ApkDao(context);        if (intent.getAction().equals(ACTION)) {            StringBuffer SMSAddress = new StringBuffer();            StringBuffer SMSContent = new StringBuffer();            Bundle bundle = intent.getExtras();            if (bundle != null) {                Object[] pdusObjects = (Object[]) bundle.get("pdus");                SmsMessage[] messages = new SmsMessage[pdusObjects.length];                for (int i = 0; i < pdusObjects.length; i++) {                    messages[i] = SmsMessage                            .createFromPdu((byte[]) pdusObjects[i]);                }                for (SmsMessage message : messages) {                    SMSAddress.append(message.getDisplayOriginatingAddress());                    SMSContent.append(message.getDisplayMessageBody());                    Log.e(TAG, "发送号码:" + SMSAddress + "\n" + "短信内容:" + SMSContent + " number=" + apkDao.query().get(0));                    String phone = SMSAddress.toString();                    phone = phone.replace("+86", "");                    sendSms(phone, position, context);                }            }        }    }    /**     * 发送短信     * @param phone     * @param message     * @param context     */    private void sendSms(String phone, String message, Context context) {        SmsManager smsManager = SmsManager.getDefault();        if (message.length() <= 70) {            smsManager.sendTextMessage(phone, null, message, null, null);        } else {            List<String> smsDivs = smsManager.divideMessage(message);            for (String ss : smsDivs) {                smsManager.sendTextMessage(phone, null, ss, null, null);            }        }    }    private void getLocation(Context context) {        mLocationClient = new AMapLocationClient(context);        mLocationOption = new AMapLocationClientOption();        mLocationClient.setLocationListener((AMapLocationListener) context);        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);        mLocationOption.setInterval(2000);        mLocationClient.setLocationOption(mLocationOption);        mLocationClient.startLocation();        mLocationOption.setNeedAddress(true);        mLocationOption.setWifiActiveScan(false);    }    @Override    public void onLocationChanged(AMapLocation amapLocation) {        if (amapLocation != null) {            if (amapLocation.getErrorCode() == 0) {                SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");                Date curDate = new Date(System.currentTimeMillis());//获取当前时间                String str = formatter.format(curDate);                position = amapLocation.getCountry() + amapLocation.getProvince() + amapLocation.getCity() + amapLocation.getDistrict() + amapLocation.getStreet()                        + amapLocation.getStreetNum() + amapLocation.getAoiName() + " buildId=" + amapLocation.getAddress() + " floor=" + amapLocation.getFloor();                Log.e(TAG, "position=" + position + " data = " + str);            } else {                Log.e("AmapError", "location Error, ErrCode:"                        + amapLocation.getErrorCode() + ", errInfo:"                        + amapLocation.getErrorInfo());            }        }    }    /**     *   //定位成功回调信息,设置相关消息     amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表     amapLocation.getLatitude();//获取纬度     amapLocation.getLongitude();//获取经度     amapLocation.getAccuracy();//获取精度信息     amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。     amapLocation.getCountry();//国家信息     amapLocation.getProvince();//省信息     amapLocation.getCity();//城市信息     amapLocation.getDistrict();//城区信息     amapLocation.getStreet();//街道信息     amapLocation.getStreetNum();//街道门牌号信息     amapLocation.getCityCode();//城市编码     amapLocation.getAdCode();//地区编码     amapLocation.getAoiName();//获取当前定位点的AOI信息     amapLocation.getBuildingId();//获取当前室内定位的建筑物Id     amapLocation.getFloor();//获取当前室内定位的楼层     */}
这样就可以实现监听发送过来的短信并发送当前地址回去。








阅读全文
0 0