Я хочу, чтобы мой телефон (Samsung A5, Android 8.0.0 Oreo) связывался с другим устройством (Arduino), отправляя SMS-сообщения.
Мне удалось отправить часть, но я почему-то не могу получить SMS.
Я просмотрел много (около 12) учебных пособий, но они либо предназначены для более старых Android, либо выдают ошибки явно, либо просто не работают. Вот 2 метода, которые я нашел:
У меня есть этот класс, где я ссылаюсь на основной вид деятельности:
// imports are OK
class SMS {
private Listener mListener;
private final Activity activity;
private final Context context;
SMS(Activity activityArg){
activity = activityArg;
context = activity.getApplicationContext();
checkForPermission(activity); // checked, working
// method 1
final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
final String SMS_SENDER = "123456789";
context.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
if ((intent != null) &&
(intent.getAction() != null) &&
(intent.getExtras() != null) &&
(ACTION.compareToIgnoreCase(intent.getAction()) == 0)) {
Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
if (pduArray != null) {
SmsMessage[] messages = new SmsMessage[pduArray.length];
for (int i = 0; i < pduArray.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
}
// SMS Sender, example: 123456789
String sms_from = messages[0].getDisplayOriginatingAddress();
//Lets check if SMS sender is 123456789
if (sms_from.equalsIgnoreCase(SMS_SENDER)) {
StringBuilder bodyText = new StringBuilder();
// If SMS has several parts, lets combine it :)
for (SmsMessage message : messages) {
bodyText.append(message.getMessageBody());
}
//SMS Body
String body = bodyText.toString();
//Send sms to activity via listener
mListener.recieveCallback(body);
// Lets get SMS Code
String code = body.replaceAll("[^0-9]", "");
}
}
}
}
}, new IntentFilter("SMS_Recieved"));
}
public class SmsReceiver extends BroadcastReceiver {
// method 2
static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
private static final String SMS_SENDER = "123456789"; //actually this is other number, just for clarification
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null &&
intent.getAction() != null &&
intent.getExtras() != null &&
ACTION.compareToIgnoreCase(intent.getAction()) == 0) {
Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
if (pduArray != null) {
SmsMessage[] messages = new SmsMessage[pduArray.length];
for (int i = 0; i < pduArray.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
}
String sms_from = messages[0].getDisplayOriginatingAddress();
//Lets check if SMS sender is from number i want
if (sms_from.equalsIgnoreCase(SMS_SENDER)) {
StringBuilder bodyText = new StringBuilder();
for (SmsMessage message : messages) {
bodyText.append(message.getMessageBody());
}
//SMS Body
String body = bodyText.toString();
//Send sms to activity via listener
mListener.recieveCallback(body);
// Lets get SMS Code
String code = body.replaceAll("[^0-9]", "");
}
}
}
}
}
// sends received sms back to activity - works
public interface Listener {
void recieveCallback(String str);
}
void setListener(Listener listener) {
mListener = listener;
}
}
Также у меня есть AndroidManifest.xml
как это:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.maneren.smartcollar">
<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<application
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- to method 2 and 3 -->
<receiver
android:name=".SMS$SmsReceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:screenOrientation="sensorPortrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
</application>
</manifest>
Когда я получаю смс, ничего не происходит (тестирование с другим телефоном вместо arduino, из-за неограниченного количества сообщений на его номер)