Обнаружение MMS-сообщений на Android - PullRequest
10 голосов
/ 16 марта 2011

Я искал эту тему в Интернете и не смог найти удовлетворительного ответа ... Я пытаюсь обнаружить MMS-сообщения (входящие хотя бы для начала).И я решил пройти путь обнаружения изменений в содержании.Я загрузил коды Android и убедился, что использую правильный поставщик контента: "content: // mms" (в классе android.provider.Telephony.Mms) и использую все необходимые разрешения (из приложения Mms). IПридумали пример приложения, которое обнаруживает входящие MMS-сообщения, как бы то ни было.вот приложение:

package com.kolomiyets.MMStesting;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

public class MMStesting extends Activity {

public static final String MMSMON_RECEIVED_MMS = "MMStesting.intent.action.MMSMON_RECEIVED_MMS";

Uri mmsInURI = Uri.parse("content://mms");

ContentObserver mmsObserver = new ContentObserver(null) {
    @Override
    public void onChange(boolean selfChange) {

        Thread mmsNotify = new Thread(){
            @Override
            public void run() {
                Intent mIntent = new Intent(MMSMON_RECEIVED_SMS);
                sendBroadcast(mIntent);
                super.run();
            }
        };
        mmsNotify.start();
        super.onChange(selfChange);
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    BroadcastReceiver mmsMonitorBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            TextView log = (TextView)findViewById(R.id.mms_log);
            log.append("\n MMS Received;");
        }
    };

    IntentFilter mIntentFilter = new IntentFilter();
    mIntentFilter.addAction(MMSMON_RECEIVED_MMS);

    registerReceiver(mmsMonitorBroadcastReceiver, mIntentFilter);

    getApplicationContext().getContentResolver().registerContentObserver(mmsInURI, true, mmsObserver);
    getApplicationContext().getContentResolver().notifyChange(mmsInURI, mmsObserver);


}

@Override
protected void onDestroy() {
    getApplicationContext().getContentResolver().unregisterContentObserver(mmsObserver);
    super.onDestroy();
}
}

и манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.kolomiyets.MMStesting"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INSTALL_DRM"/>


<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MMStesting"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

Пока я пробовал "content: // mms-sms", и приложение начинает обнаруживатьчто-то бесконечно после того, как устройство получает MMS-сообщение.В строке состояния нет индикации о новых MMS (как и должно быть), однако сообщение появляется во входящих сообщениях o_O ...

Также я попытался поставить "content: // sms" и все работаеткак и предполагалось (обнаружение входящих и исходящих SMS и даже MMS o_O)

Я что-то не так понимаю?Есть ли способ исправить мое приложение, чтобы оно обнаруживало изменения в "content: // mms"?Если это не работает в этом приложении, то я не смогу использовать этот контент в моих запросах к базе данных?Если я обнаружу изменения с помощью «content: // sms», как я могу различить SMS и MMS?(Я хотел бы также получить то, что есть в MMS).Или, может быть, лучшая идея - просто взять все эти классы из источников Android и попытаться изменить их так, как я хочу?... но я бы не хотел этого делать)))

Вот

grepcode.com: класс телефонии, содержащий MMS-сообщение (также этот сайт)удобен для просмотра исходного кода Android)

Эта информация несколько описывает, как извлечь информацию из MMS-сообщений, находящихся в базе данных.Однако я до сих пор не могу найти способ обнаружить входящих и исходящих MMS-сообщений.

Мне кажется, что мне нужно отслеживать "content: // sms", чтобы обнаружить MMS-сообщения (поскольку "content: // sms" реагирует на входящие MMS-сообщения и "content: // mms")не), а затем работать с «content: // mms» над Cursor и ContentResolver.

Но я не уверен, что это правильный путь ... Также я не понимаю, что на самом деле Part (или PduPart) представляет ... получу ли я полное изображение, извлекая часть из MMS, или оно будет частью изображения?И есть ли разница между "content: // mms // part" и "content: // mms / part /"?

Вот еще один интересный момент с WAP Push Messages.Насколько я понял, они представляют собой какие-то особые SMS-сообщения с гиперссылками, и они также используются для передачи конфигураций от оператора мобильной связи на телефон клиента.Этот класс:

code.google.com: MmsReceiver.java должен обнаруживать MMS-сообщения с помощью WAP Push Massages.

Я действительно не могу понять это.Как?

Ответы [ 4 ]

8 голосов
/ 16 июня 2011

Обнаружить поступившее MMS-сообщение легко, просто поместите в приемник вещания, отслеживающий события WAP_PUSH_RECIEVED, как в ...

<receiver android:name=".PushReceiver">
  <intent-filter>
    <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
    <data android:mimeType="application/vnd.wap.mms-message" />
  </intent-filter>
</receiver>

Осмысление того, что вы получаете, намного сложнее. Мне удалось расшифровать все, что я хотел из намерения WAP_PUSH_RECEIVED, клонировав код анализа PDU из приложения Mms.

Извлечение фактического содержимого из файлов деталей - это то, над чем я все еще работаю, и именно так я нашел эту тему.

5 голосов
/ 21 марта 2011
0 голосов
/ 31 июля 2013
final IntentFilter filterMMS = IntentFilter.create("android.provider.Telephony.WAP_PUSH_RECEIVED", "application/vnd.wap.mms-message");
filterMMS.setPriority(Integer.MAX_VALUE);
registerReceiver(smsreceiver, filterMMS);
0 голосов
/ 01 ноября 2012

входящее сообщение, которое обнаруживает ваш ContentObserver, имеет тип уведомления MMS, когда телефон получит это уведомление, он загрузит с mmsc реальное MMS. Поэтому, когда вы обнаружите новое сообщение, вы должны отфильтровать тип уведомления.

...