1. 程式人生 > >android 實現監聽簡訊接收並將當前位置傳送出去

android 實現監聽簡訊接收並將當前位置傳送出去

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();//獲取當前室內定位的樓層
     */
}
這樣就可以實現監聽傳送過來的簡訊併發送當前地址回去。