Android: читать входящие MMS-сообщения - PullRequest
0 голосов
/ 05 июля 2019

Так что мой опыт работы с Android с точки зрения обработки сообщений очень минимален, и я пытаюсь понять, что мне нужно сделать здесь. Я пытаюсь просто читать текстовые сообщения из группового чата, чтобы обнаружить определенный текст, а затем что-то делать, когда встречается этот текст. Перехват отдельных SMS-сообщений был достаточно легким, но я не могу найти это, чтобы обнаружить MMS-сообщения на всю жизнь. Я нашел несколько разных постов и статей о разных подходах к решению разных проблем, но это все выше того, что я понимаю, и я до сих пор не могу заставить что-то из этого работать.

Так как мне обнаружить и прочитать MMS-сообщения (только текст, мне все равно, какие-либо другие носители)?

Кроме того, я хочу поместить все это в постоянно работающий фоновый сервис. У меня запущена служба, но через некоторое время она просто самоуничтожается, как мне остановить это и принудительно включить в фоновую службу?

Вот код, который я использовал для SMS и пытаюсь манипулировать, чтобы заставить работать и MMS.

MessageService.java

public class MessageService extends Service {
    public static int SERVICE_RUNNING = 0;

    private SMSReceiver smsReceiver;
    private IntentFilter intentFilter;

    @Override
    public void onCreate() {
        super.onCreate();
        SERVICE_RUNNING = 1;
        Log.i("MESSAGE SERVICE", "Service started");
        smsReceiver = new SMSReceiver();
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        intentFilter.addAction("android.provider.Telephony.MMS_RECEIVED");
        intentFilter.addAction("android.provider.Telephony.WAP_PUSH_RECEIVED");
        registerReceiver(smsReceiver, intentFilter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        SERVICE_RUNNING = 0;
        unregisterReceiver(smsReceiver);
        Log.i("MESSAGE SERVICE", "Service killed");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("MESSAGE SERVICE", "Service bound?");
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
        //return super.onStartCommand(intent, flags, startId);
    }

    private class SMSReceiver extends BroadcastReceiver {
        private final String TAG = this.getClass().getSimpleName();

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(TAG, "GOT A MESSAGE 1");
            Bundle extras = intent.getExtras();
            String strMessage = "";
            if(extras != null) {
                Object[] smsExtras =(Object[])extras.get("pdus");
                for(int i = 0; i < smsExtras.length; i++) {
                    SmsMessage smsMsg = SmsMessage.createFromPdu((byte[])smsExtras[i]);
                    String msgBody = smsMsg.getMessageBody();
                    String msgSrc = smsMsg.getOriginatingAddress();
                    strMessage += "SMS from " + msgSrc + " : " + msgBody;
                    Log.i(TAG, strMessage);
                }
            }
        }
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private Intent serviceIntent;
    protected ServiceConnection mConn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i("SEND MESSAGE", "Started activity");

        serviceIntent = new Intent(this, MessageService.class);
        mConn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder binder) {
                Log.d("SEND MESSAGE", "onServiceConnected");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.d("SEND MESSAGE", "onServiceDisconnected");
            }
        };

        // Create button onclick
        final Button startButton = (Button)findViewById(R.id.start_button);
        final Button stopButton = (Button)findViewById(R.id.stop_button);

        if(MessageService.SERVICE_RUNNING == 0) {
            stopButton.setEnabled(false);
        } else {
            startButton.setEnabled(false);
        }

        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startService();
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
            }
        });

        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopService();
                stopButton.setEnabled(false);
                startButton.setEnabled(true);
            }
        });
    }

    private void startService() {
        Log.i("SEND MESSAGE ACTIVITY", "TRYING TO START SERVICE");
        startService(serviceIntent);
    }

    private void stopService() {
        Log.i("SEND MESSAGE ACTIVITY", "TRYING TO STOP SERVICE");
        stopService(serviceIntent);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(MessageService.SERVICE_RUNNING == 1)
            bindService(serviceIntent, mConn, Context.BIND_AUTO_CREATE);
    }
}

AndroidManifest.xml

<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/app_icon"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/app_icon_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:ignore="GoogleAppIndexingWarning">

    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />

    <activity android:name=".PermissionCheck">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MainActivity" />

    <service
        android:name=".MessageService"
        android:enabled="true">
    </service>
</application>

Спасибо за любую помощь

...