首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android上检测MMS消息

在Android上检测MMS消息
EN

Stack Overflow用户
提问于 2011-03-16 18:15:29
回答 4查看 17.8K关注 0票数 10

我在网上搜索这个话题,却找不到满意的答案.我正在尝试检测MMS消息(至少在开始时是传入的)。我决定通过检测内容变化的方法。我下载了Android代码,并确保我使用的是正确的内容提供者:" content :// Mms“(在android.provider.Telephony.Mms类中),并且我使用了所有所需的权限(来自MMS应用程序)--我想出了一个示例应用程序来检测传入的MMS消息,不管它是否检测到它们。以下是应用程序:

代码语言:javascript
复制
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();
}
}

以及清单:

代码语言:javascript
复制
<?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”,在设备接收到MMS消息之后,应用程序就开始无休止地检测到一些东西。在状态栏中没有任何关于新的彩信的指示(应该是这样),但是消息出现在传入的消息o_O.

此外,我还试着把“内容://sms”,一切都像它所想的那样工作(检测不入和传出的sms,甚至MMSs o_O)。

我是不是误解了什么?有没有办法纠正我的应用程序,这样它就能检测到"content://mms“中的变化?如果它在这个应用程序中不能工作,那么我就不能在我的数据库请求中使用这个内容了?如果我要用“内容:// SMS”检测更改,我如何区分SMS和MMS?(我也想了解MMS的内容)。或者说最好的方法就是从安卓系统中获取所有这些类,并尝试以我想要的方式修改它们?...But,我不想这样做)

这是一个

grepcode.com:包含MMS calass的电话类 (本网站也便于浏览android源代码)

此信息在某种程度上描述了如何从数据库中的MMS消息中检索信息。但是,我仍然无法找到检测输入和传出彩信的方法。

在我看来,为了检测MMSs,我必须监视"content://sms“(因为"content://sms”对传入的MMSs有反应,而"content://mms“不起作用),而不是使用游标和ContentResolver的"content://mms”。

但我不确定这是个正确的方法..。我也不明白PduPart到底代表什么.我是通过从MMS中检索部分获得完整的图片,还是将是图片的一部分?“内容://mms//part”和“内容://mms/part/”之间有什么区别吗?

这里也是WAP推送消息的有趣时刻。据我所知,这些代表了一些特殊的短信与超链接,他们也被用来传输配置从移动提供商到客户的电话。这门课:

code.google.com: MmsReceiver.java被认为是在WAP推拿按摩的帮助下检测彩信。

我真的听不懂。多么?

EN

回答 4

Stack Overflow用户

发布于 2011-06-16 18:42:42

检测一个不工作的彩信是很容易的,只需放入广播接收器监测WAP_PUSH_RECIEVED事件,如

代码语言:javascript
复制
<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>

从你得到的东西中弄清楚要困难得多。通过从Mms应用程序克隆PDU解析代码,我成功地从WAP_PUSH_RECEIVED意图中解码了所有我想要的东西。

从部件文件中检索实际内容是我仍在做的工作,这也是我最初是如何找到这个主题的。

票数 8
EN

Stack Overflow用户

发布于 2011-03-21 20:29:36

下面是我找到的一些有用的链接:

anddev.org:在哪里可以找到有关发送/接收彩信的信息?

anddev.org:访问MMS部件文件内容

票数 5
EN

Stack Overflow用户

发布于 2012-11-01 10:57:27

您的ContentObserver检测到的传入消息是notification MMS,当电话接收到此通知时,它将从mmsc下载真正的MMS。因此,当您检测到新的msg时,应该筛选Notification。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5329819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档