短信监听运维和GPS定位获取

serial
liuguijing 1 year ago
parent 8a1d399e62
commit c1437e56a7

@ -3,6 +3,8 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.xypower.mpmaster"> package="com.xypower.mpmaster">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@ -10,9 +12,10 @@
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.TETHER_PRIVILEGED" tools:ignore="ProtectedPermissions" /> <uses-permission
android:name="android.permission.TETHER_PRIVILEGED"
tools:ignore="ProtectedPermissions" />
<uses-permission <uses-permission
android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" /> tools:ignore="ProtectedPermissions" />
@ -66,7 +69,6 @@
<uses-permission <uses-permission
android:name="android.permission.TETHER_PRIVILEGED" android:name="android.permission.TETHER_PRIVILEGED"
tools:ignore="ProtectedPermissions" /> tools:ignore="ProtectedPermissions" />
<application <application
android:name=".MpMstApplication" android:name=".MpMstApplication"
android:allowBackup="true" android:allowBackup="true"
@ -82,8 +84,8 @@
<service <service
android:name=".HotSpotService" android:name=".HotSpotService"
android:enabled="true" android:enabled="true"
android:process=":hotspot" android:exported="true"
android:exported="true"></service> android:process=":hotspot"></service>
<service <service
android:name=".MpMasterService" android:name=".MpMasterService"
android:enabled="true" android:enabled="true"
@ -111,7 +113,7 @@
<data android:scheme="package" /> <data android:scheme="package" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".SmsReceiver"> <receiver android:name=".sms.SmsReceiver">
<intent-filter android:priority="2147483647"> <intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter> </intent-filter>

@ -0,0 +1,282 @@
package com.xypower.mpmaster;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class LocationUtil {
private static OnLocationChangeListener mListener;
private static MyLocationListener myLocationListener;
private static LocationManager mLocationManager;
private LocationUtil() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* Gps
*
* @return {@code true}: <br>{@code false}:
*/
public static boolean isGpsEnabled(Context context) {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
*
*
* @return {@code true}: <br>{@code false}:
*/
public static boolean isLocationEnabled(Context context) {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
* Gps
*/
public static void openGpsSettings(Context context) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
*
* <p>使{@link #unregister()}</p>
* <p> {@code <uses-permission android:name="android.permission.INTERNET"/>}</p>
* <p> {@code <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>}</p>
* <p> {@code <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>}</p>
* <p>{@code minDistance}0{@code minTime}</p>
* <p>{@code minDistance}0{@code minDistance}</p>
* <p>0</p>
*
* @param minTime
* @param minDistance
* @param listener
* @return {@code true}: <br>{@code false}:
*/
public static boolean register(Context context, long minTime, long minDistance, OnLocationChangeListener listener) {
if (listener == null) return false;
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
mListener = listener;
if (!isLocationEnabled(context)) {
Toast.makeText(context, "无法定位,请打开定位服务", Toast.LENGTH_SHORT).show();
return false;
}
// String provider = mLocationManager.getBestProvider(getCriteria(), true);
String provider = LocationManager.GPS_PROVIDER;
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return false;
}
Location location = mLocationManager.getLastKnownLocation(provider);
if (location != null) listener.getLastKnownLocation(location);
if (myLocationListener == null) myLocationListener = new MyLocationListener();
mLocationManager.requestLocationUpdates(provider, minTime, minDistance, myLocationListener);
return true;
}
/**
*
*/
public static void unregister() {
if (mLocationManager != null) {
if (myLocationListener != null) {
mLocationManager.removeUpdates(myLocationListener);
myLocationListener = null;
}
mLocationManager = null;
}
}
/**
*
*
* @return {@link Criteria}
*/
private static Criteria getCriteria() {
Criteria criteria = new Criteria();
//设置定位精确度 Criteria.ACCURACY_COARSE比较粗略Criteria.ACCURACY_FINE则比较精细
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//设置是否要求速度
criteria.setSpeedRequired(false);
// 设置是否允许运营商收费
criteria.setCostAllowed(false);
//设置是否需要方位信息
criteria.setBearingRequired(false);
//设置是否需要海拔信息
criteria.setAltitudeRequired(false);
// 设置对电源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW);
return criteria;
}
/**
*
*
* @param context
* @param latitude
* @param longitude
* @return {@link Address}
*/
public static Address getAddress(Context context, double latitude, double longitude) {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
try {
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0) return addresses.get(0);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
*
*
* @param context
* @param latitude
* @param longitude
* @return
*/
public static String getCountryName(Context context, double latitude, double longitude) {
Address address = getAddress(context, latitude, longitude);
return address == null ? "unknown" : address.getCountryName();
}
/**
*
*
* @param context
* @param latitude
* @param longitude
* @return
*/
public static String getLocality(Context context, double latitude, double longitude) {
Address address = getAddress(context, latitude, longitude);
return address == null ? "unknown" : address.getLocality();
}
/**
*
*
* @param context
* @param latitude
* @param longitude
* @return
*/
public static String getStreet(Context context, double latitude, double longitude) {
Address address = getAddress(context, latitude, longitude);
return address == null ? "unknown" : address.getAddressLine(0);
}
private static class MyLocationListener implements LocationListener {
/**
* Provider
*
* @param location
*/
@Override
public void onLocationChanged(Location location) {
if (mListener != null) {
mListener.onLocationChanged(location);
}
}
/**
* provider
*
* @param provider
* @param status
* @param extras provider
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (mListener != null) {
mListener.onStatusChanged(provider, status, extras);
}
switch (status) {
case LocationProvider.AVAILABLE:
Log.e("onStatusChanged", "当前GPS状态为可见状态");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.e("onStatusChanged", "当前GPS状态为服务区外状态");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.e("onStatusChanged", "当前GPS状态为暂停服务状态");
break;
}
}
/**
* providerenableGPS
*/
@Override
public void onProviderEnabled(String provider) {
System.out.println("dsaf");
}
/**
* providerdisableGPS
*/
@Override
public void onProviderDisabled(String provider) {
System.out.println("dsaf");
}
}
public interface OnLocationChangeListener {
/**
*
*
* @param location
*/
void getLastKnownLocation(Location location);
/**
* Provider
*
* @param location
*/
void onLocationChanged(Location location);
/**
* provider
*
* @param provider
* @param status
* @param extras provider
*/
void onStatusChanged(String provider, int status, Bundle extras);//位置状态发生改变
}
}

@ -8,12 +8,13 @@ import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.ConnectivityManager; import android.location.Location;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.StrictMode; import android.os.StrictMode;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.widget.Switch; import android.widget.Switch;
@ -33,6 +34,7 @@ public class MainActivity extends AppCompatActivity {
private static int MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE = 100; private static int MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE = 100;
private Handler mHandler; private Handler mHandler;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -41,12 +43,11 @@ public class MainActivity extends AppCompatActivity {
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
mHandler = new Handler(); mHandler = new Handler();
mHandler.postDelayed( mHandler.postDelayed(new Runnable() {
new Runnable() { public void run() {
public void run() { requestPermissions();
requestPermissions(); }
} }, 100);
}, 100);
// String buildTime = BuildConfig.BUILD_ // String buildTime = BuildConfig.BUILD_
Date date = new Date(BuildConfig.BUILD_TIMESTAMP); Date date = new Date(BuildConfig.BUILD_TIMESTAMP);
@ -58,7 +59,7 @@ public class MainActivity extends AppCompatActivity {
StrictMode.setThreadPolicy(policy); StrictMode.setThreadPolicy(policy);
MicroPhotoContext.AppConfig appConfig = MicroPhotoContext.getMpAppConfig(getApplicationContext()); MicroPhotoContext.AppConfig appConfig = MicroPhotoContext.getMpAppConfig(getApplicationContext());
((TextView)findViewById((R.id.cmdid))).setText(TextUtils.isEmpty(appConfig.cmdid) ? "" : appConfig.cmdid); ((TextView) findViewById((R.id.cmdid))).setText(TextUtils.isEmpty(appConfig.cmdid) ? "" : appConfig.cmdid);
findViewById(R.id.btnEnableCam3V3).setOnClickListener(new View.OnClickListener() { findViewById(R.id.btnEnableCam3V3).setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -94,7 +95,6 @@ public class MainActivity extends AppCompatActivity {
// SysApi.enableApp(v.getContext(), "abcd1234"); // SysApi.enableApp(v.getContext(), "abcd1234");
} }
}); });
@ -114,12 +114,12 @@ public class MainActivity extends AppCompatActivity {
} }
}); });
Switch sw = (Switch)findViewById(R.id.btn485ReadMode); Switch sw = (Switch) findViewById(R.id.btn485ReadMode);
sw.setChecked(true); sw.setChecked(true);
findViewById(R.id.btn485ReadMode).setOnClickListener(new View.OnClickListener() { findViewById(R.id.btn485ReadMode).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Switch sw = (Switch)view; Switch sw = (Switch) view;
if (sw.isChecked()) { if (sw.isChecked()) {
SysApi.set485ReadMode(); SysApi.set485ReadMode();
} else { } else {
@ -128,13 +128,47 @@ public class MainActivity extends AppCompatActivity {
} }
}); });
findViewById(R.id.sendsms).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// boolean gpsEnabled = LocationUtil.isGpsEnabled(MainActivity.this);
// System.out.printf("g" + gpsEnabled);
LocationUtil.register(MainActivity.this, 0, 0, new LocationUtil.OnLocationChangeListener() {
@Override
public void getLastKnownLocation(Location location) {
Log.e("xyh", "onLocationChanged: " + location.getLatitude());
}
@Override
public void onLocationChanged(Location location) {
//位置信息变化时触发
Log.e("xyh", "定位方式:" + location.getProvider());
Log.e("xyh", "纬度:" + location.getLatitude());
Log.e("xyh", "经度:" + location.getLongitude());
Log.e("xyh", "海拔:" + location.getAltitude());
Log.e("xyh", "时间:" + location.getTime());
Log.e("xyh", "国家:" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude()));
Log.e("xyh", "获取地理位置:" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude()));
Log.e("xyh", "所在地:" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude()));
Log.e("xyh", "所在街道:" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude()));
LocationUtil.unregister();
mHandler.postDelayed(
new Runnable() {
public void run() {
HotspotManager.enableHotspot(getApplicationContext(), false);
} }
}, 5000);
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("dfsad");
}
});
}
});
mHandler.postDelayed(new Runnable() {
public void run() {
HotspotManager.enableHotspot(getApplicationContext(), false);
}
}, 5000);
startMicroPhotoService(getApplicationContext()); startMicroPhotoService(getApplicationContext());
} }

@ -7,7 +7,6 @@ import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
@ -20,13 +19,11 @@ import android.os.Environment;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Message; import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.telephony.SignalStrength; import android.telephony.SignalStrength;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.Log; import android.util.Log;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import android.widget.Toast; import android.widget.Toast;
@ -35,18 +32,14 @@ import androidx.core.app.NotificationCompat;
import com.dev.devapi.api.SysApi; import com.dev.devapi.api.SysApi;
import com.xypower.common.FileDownloader; import com.xypower.common.FileDownloader;
import com.xypower.common.InetAddressUtils;
import com.xypower.common.JSONUtils; import com.xypower.common.JSONUtils;
import com.xypower.common.MicroPhotoContext; import com.xypower.common.MicroPhotoContext;
import com.xypower.mpmaster.sms.SimUtil;
import com.xypower.mpmaster.sms.SmsSendReceiver;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.File; import java.io.File;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.FileHandler; import java.util.logging.FileHandler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -81,6 +74,8 @@ public class MpMasterService extends Service {
private static final String EXTRA_PARAM_SCHEDULE = "Schedule_"; private static final String EXTRA_PARAM_SCHEDULE = "Schedule_";
private static final String EXTRA_PARAM_TIME = "Time"; private static final String EXTRA_PARAM_TIME = "Time";
private static final String FOREGROUND_CHANNEL_ID = "foreground_channel_id"; private static final String FOREGROUND_CHANNEL_ID = "foreground_channel_id";
private SmsSendReceiver mSmsSnedReceiver;
public static class STATE_SERVICE { public static class STATE_SERVICE {
public static final int CONNECTED = 10; public static final int CONNECTED = 10;
public static final int NOT_CONNECTED = 0; public static final int NOT_CONNECTED = 0;
@ -218,6 +213,13 @@ public class MpMasterService extends Service {
registerReceiver(mUpdateReceiver, intentFilter); registerReceiver(mUpdateReceiver, intentFilter);
} }
//自定义发送短信广播接收器
mSmsSnedReceiver = new SmsSendReceiver();
IntentFilter intentFilter;
intentFilter = new IntentFilter(SimUtil.SMS_SEND_ACTION);
registerReceiver(mSmsSnedReceiver,intentFilter);
// AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); // AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
startMaster(); startMaster();
@ -236,6 +238,7 @@ public class MpMasterService extends Service {
unregisterReceiver(mAlarmReceiver); unregisterReceiver(mAlarmReceiver);
unregisterReceiver(mScreenaAtionReceiver); unregisterReceiver(mScreenaAtionReceiver);
unregisterReceiver(mUpdateReceiver); unregisterReceiver(mUpdateReceiver);
unregisterReceiver(mSmsSnedReceiver);
super.onDestroy(); super.onDestroy();
} }

@ -1,62 +0,0 @@
package com.xypower.mpmaster;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
/**
* 广
*
* @author jingjing
*/
public class SmsReceiver extends BroadcastReceiver {
private static final String TAG = "MPLOG";
private Context mContext;
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
public static final String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";
@Override
public void onReceive(Context context, Intent intent) {
this.mContext = context;
Log.e(TAG, "Recv SMS");
String action = intent.getAction();
if (SMS_RECEIVED_ACTION.equals(action) || SMS_DELIVER_ACTION.equals(action)) {
// Log.e("日志onReceive。。。", "开始接收短信.....");
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus != null && pdus.length > 0) {
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
byte[] pdu = (byte[]) pdus[i];
messages[i] = SmsMessage.createFromPdu(pdu);
}
for (SmsMessage message : messages) {
String content = message.getMessageBody();// 得到短信内容
String sender = message.getOriginatingAddress();// 得到发信息的号码
Date date = new Date(message.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
String dateContent = format.format(date);
// this.abortBroadcast();// 中止
}
}
}
}
}
}

@ -0,0 +1,11 @@
package com.xypower.mpmaster.sms;
/*
sim
*/
public class ModelSlotAndSub {
public String subId;
public String simSlot;
public String iccid;
}

@ -0,0 +1,308 @@
package com.xypower.mpmaster.sms;
import android.Manifest;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import androidx.core.app.ActivityCompat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
/*
*
*
* */
public class SimUtil {
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
public static final String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";
//自定义ACTION常数 作为广播的IntentFilter识别常数
public static String SMS_SEND_ACTION = "com.xypower.mpmaster.SMS_SEND_ACTION";
public static String SMSTYPE = "smstype";
//短信解析
public static SmsMessageModel analysisSMSInfo(Intent intent, Context context) {
SmsMessageModel smsInfo = getSMSInfo(intent);
if (smsInfo != null) {
String content = smsInfo.getContent();
int slot = smsInfo.getSlot();
String sender = smsInfo.getSender();
String sendmessage = "";
String sendtype = "";
if (content.contains(SmsTypeEnum.REBOOT1.value())) {
sendmessage = content + " OK";
sendtype = SmsTypeEnum.REBOOT1.value();
} else if (content.contains(SmsTypeEnum.REBOOT2.value())) {
sendmessage = content + " OK";
sendtype = SmsTypeEnum.REBOOT2.value();
}
sendSms(context, slot, sender, sendmessage, sendtype);
}
return smsInfo;
}
//短信解析
public static SmsMessageModel getSMSInfo(Intent intent) {
SmsMessageModel smsMessageModel = new SmsMessageModel();
String action = intent.getAction();
if (SMS_RECEIVED_ACTION.equals(action) || SMS_DELIVER_ACTION.equals(action)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
String content = "";
String sender = "";
String dateContent = "";
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus != null && pdus.length > 0) {
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
byte[] pdu = (byte[]) pdus[i];
messages[i] = SmsMessage.createFromPdu(pdu);
}
for (SmsMessage message : messages) {
content = message.getMessageBody();// 得到短信内容
// 得到发信息的号码
sender = message.getOriginatingAddress();
Date date = new Date(message.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
dateContent = format.format(date);
}
int smsSlot = getSmsSlot(bundle);
smsMessageModel.setContent(content);
smsMessageModel.setSender(sender);
smsMessageModel.setDateContent(dateContent);
smsMessageModel.setSlot(smsSlot);
}
}
}
return smsMessageModel;
}
//获取是哪个sim卡收到短信
private static int getSmsSlot(Bundle bundle) {
int slot = -1;
Set<String> keySet = bundle.keySet();
for (String key : keySet) {
switch (key) {
case "slot":
slot = bundle.getInt("slot", -1);
break;
case "simId":
slot = bundle.getInt("simId", -1);
break;
case "simSlot":
slot = bundle.getInt("simSlot", -1);
break;
case "slot_id":
slot = bundle.getInt("slot_id", -1);
break;
case "simnum":
slot = bundle.getInt("simnum", -1);
break;
case "slotId":
slot = bundle.getInt("slotId", -1);
break;
case "slotIdx":
slot = bundle.getInt("slotIdx", -1);
break;
default:
if (key.toLowerCase().contains("slot") | key.toLowerCase().contains("sim")) {
String value = bundle.getString(key, "-1");
if (value.equals("0") | value.equals("1") | value.equals("2")) {
slot = bundle.getInt(key, -1);
}
}
}
}
return slot;
}
//指定sim卡位置发送短信
public static void sendSms(Context mContext, int slot, String sender, String message, String value) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager localSubscriptionManager = SubscriptionManager.from(mContext);
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {
List localList = localSubscriptionManager.getActiveSubscriptionInfoList();
SubscriptionInfo simInfo1 = (SubscriptionInfo) localList.get(0);
SubscriptionInfo simInfo2 = (SubscriptionInfo) localList.get(1);
SubscriptionInfo simInfoAnother;
if (slot == 0) {
simInfoAnother = simInfo1;
} else {
simInfoAnother = simInfo2;
}
Intent itSend = new Intent(SMS_SEND_ACTION);
itSend.putExtra(SMSTYPE, value);
//sendIntent参数为传送后接受的广播信息PendingIntent
PendingIntent sendPI = PendingIntent.getBroadcast(mContext, 0, itSend, 0);
// Intent itDeliver = new Intent(SMS_DELIVERED_ACTION);
//deliveryIntent参数为传送后接受的广播信息PendingIntent
// PendingIntent deliverPI = PendingIntent.getBroadcast(mContext,0,itDeliver,0);
SmsManager.getSmsManagerForSubscriptionId(simInfoAnother.getSubscriptionId()).sendTextMessage(sender, null, message, sendPI, null);
}
}
}
//判断是否是双卡
public static boolean isDoubleSim(Context mContext) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager manager = SubscriptionManager.from(mContext);
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return false;
}
int count = manager.getActiveSubscriptionInfoCount();
if (count == 2) {
return true;
}
}
return false;
}
//通过卡槽id获取sim卡的信息0代码卡槽11代表卡槽2
public static String getSlotIdInfo(Context mContext, int slotId) {
String info = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager manager = SubscriptionManager.from(mContext);
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return "";
}
SubscriptionInfo subInfo = manager.getActiveSubscriptionInfoForSimSlotIndex(slotId);
if (subInfo != null) {
info = subInfo.getCarrierName().toString();
}
}
return info;
}
//判断手机中是否装了双卡
public static boolean isHasDoubleSim(Context mContext) {
try {
if (isDoubleSim(mContext)) {
List<ModelSlotAndSub> slotAndSubs = getModelSlot(mContext);
if (slotAndSubs != null && slotAndSubs.size() == 2) {
return true;
} else {
return false;
}
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//判断是否拥有该权限
public static boolean IsHasPermission(Context mContext, String permission) {
if (mContext != null) {
if (ActivityCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
} else {
return false;
}
return true;
}
//申请该权限
public static void requestOnePermission(Activity activity, String permission, int permissionCode) {
if (activity != null) {
activity.requestPermissions(new String[]{permission}, permissionCode);
}
}
//获取icc用来判断
public static int getIcc(String iccid, List<ModelSlotAndSub> slotAndSubs) {
int icc = 0;
if (slotAndSubs != null && slotAndSubs.size() >= 2 && !TextUtils.isEmpty(iccid)) {
if (iccid.startsWith(slotAndSubs.get(0).iccid)) {
icc = 1;
} else if (iccid.startsWith(slotAndSubs.get(1).iccid)) {
icc = 2;
} else {
if (iccid.equals(slotAndSubs.get(0).subId)) {
icc = 1;
} else if (iccid.equals(slotAndSubs.get(1).subId)) {
icc = 2;
} else {
icc = 0;
}
}
}
return icc;
}
/**
* 1 2
*
* @param mContext
* @param subID
* @return
*/
public static int getSlot(Context mContext, String subID) {
return getIcc(subID, getModelSlot(mContext));
}
//获取对应的卡槽ID和iccID 关联
private static List<ModelSlotAndSub> getModelSlot(Context mContext) {
List<ModelSlotAndSub> data = new ArrayList<>();
ModelSlotAndSub modelSlotAndSub = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager subscriptionManager = SubscriptionManager.from(mContext);
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
List<SubscriptionInfo> mSubcriptionInfos = subscriptionManager.getActiveSubscriptionInfoList();
if (mSubcriptionInfos != null) {
for (int i = 0; i < mSubcriptionInfos.size(); i++) {
SubscriptionInfo info = mSubcriptionInfos.get(i);
if (info != null) {
modelSlotAndSub = new ModelSlotAndSub();
modelSlotAndSub.subId = info.getSubscriptionId() + "";
modelSlotAndSub.simSlot = info.getSimSlotIndex() + 1 + "";
modelSlotAndSub.iccid = info.getIccId();
data.add(modelSlotAndSub);
}
}
if (data != null && data.size() == 2) {
if (!TextUtils.isEmpty(data.get(0).simSlot) && !TextUtils.isEmpty(data.get(1).simSlot)) {
int simSlot1 = Integer.valueOf(data.get(0).simSlot);
int simSlot2 = Integer.valueOf(data.get(1).simSlot);
if (simSlot1 > simSlot2) {
ModelSlotAndSub modelSlotAndSub1 = data.get(1);
data.remove(data.get(1));
data.add(0, modelSlotAndSub1);
}
}
}
}
}
}
return data;
}
}

@ -0,0 +1,48 @@
package com.xypower.mpmaster.sms;
//收到的短信信息模型
public class SmsMessageModel {
//短信内容
private String content;
//发送的短信号码
private String sender;
//收到短信的sim卡位置
private int slot;
//短信收到的时间
private String dateContent;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public int getSlot() {
return slot;
}
public void setSlot(int slot) {
this.slot = slot;
}
public String getDateContent() {
return dateContent;
}
public void setDateContent(String dateContent) {
this.dateContent = dateContent;
}
}

@ -0,0 +1,20 @@
package com.xypower.mpmaster.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* 广
*
* @author jingjing
*/
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SimUtil.analysisSMSInfo(intent,context);
}
}

@ -0,0 +1,30 @@
package com.xypower.mpmaster.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.dev.devapi.api.SysApi;
/**
* 广
* Android 4.4API 19广
*
* @author jingjing
*/
public class SmsSendReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (SimUtil.SMS_SEND_ACTION.equals(action)) {
String type = intent.getStringExtra(SimUtil.SMSTYPE);
if (type.contains(SmsTypeEnum.REBOOT1.value())) {
SysApi.reboot(context);
}
}
}
}

@ -0,0 +1,49 @@
package com.xypower.mpmaster.sms;
public enum SmsTypeEnum {
REBOOT1("yw+at+stw21"), REBOOT2("at+stw21"), //重启命令
YW_SCHEDULE("yw+at+stw51"), //拍照时间表设置
OPERATE("yw+at+stw52"), //运维开关
OPERATE_URL("yw+at+stw53"), //运维地址
ADB("yw+at+ds"), //开关adb
UPDATE("yw+at+update"), //远程升级
READ_CMDID("at+str01"), //读取设备编号
SET_CMDID("at+stw01"), //设置设备编号
SET_IP("at+stw05"), //设置主站IP
READ_IP("at+str05"), //读取主站IP端口
SET_AI("yw+at+stw61"), //设置ai识别是否可用 0是不启用,1是启用
GET_AI("yw+at+stw62"), //查询ai识别是否可用 0是不启用,1是启用
SET_AI_BOARD("yw+at+stw63"), //设置ai画框是否可用 0是不启用,1是启用
GET_AI_BOARD("yw+at+stw64"), //查询ai画框是否可用 0是不启用,1是启用
GET_OSD("yw+at+str65"), //查询水印
SET_OSD("yw+at+stw66"), //设置水印
SET_PHOTO_SCHEDULE_LIST("at+stw37"), //拍照时间表设置
GET_PHOTO_SCHEDULE_LIST("at+str37"), //拍照时间表查询
SET_PHOTO_SCHEDULE("at+stw07"), //拍照时间表单独设置
GET_PHOTO_SCHEDULE("at+str07"), //拍照时间表查询
SET_RESOLUTION("at+stw38"), //分辨率设置
GET_RESOLUTION("at+str38"), //查询分辨率
TAKE_PHOTO("at+stw39"), //手动拍照/短视频并上传
SET_HEART("yw+at+setHB"), //设置心跳间隔
GET_HEART("yw+at+getHB"), //获取心跳间隔
SET_TP("yw+at+setTP"), //设置传输协议
GET_TP("yw+at+getTP"), //获取传输协议
SET_PACKAGE("yw+at+setPackage"), //设置分包大小
GET_PACKAGE("yw+at+getPackage"),//获取分包大小
CLEAR_PHOTO("yw+at+clearPhoto"), //清除历史图片及视频
CLEAR_LOG("yw+at+clearLog"), //删除日志
CLEAR_ALL("yw+at+clearAll"), //清除图片、视频、日志
RESTORE("yw+at+Restore"), //恢复出厂设置
GET_GPS("yw+at+getGPS");//GPS数据获取
private String name;
SmsTypeEnum(String name) {
this.name = name;
}
public String value() {
return this.name;
}
}

@ -83,6 +83,7 @@
app:layout_constraintStart_toEndOf="@+id/btnTurn485On" app:layout_constraintStart_toEndOf="@+id/btnTurn485On"
app:layout_constraintTop_toTopOf="@+id/btnTurn485On" /> app:layout_constraintTop_toTopOf="@+id/btnTurn485On" />
<Switch <Switch
android:id="@+id/btn485ReadMode" android:id="@+id/btn485ReadMode"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -91,6 +92,13 @@
app:layout_constraintStart_toEndOf="@+id/btnTurn485Off" app:layout_constraintStart_toEndOf="@+id/btnTurn485Off"
app:layout_constraintTop_toTopOf="@+id/btnTurn485On" /> app:layout_constraintTop_toTopOf="@+id/btnTurn485On" />
<Button
android:id="@+id/sendsms"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:text="gps"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnTurn485On" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save