在Android上检测彩信

我正在通过互联网寻找这个话题,并找不到任何满意的答案…我试图检测彩信(至less入门)。 我已经决定要通过检测内容的变化。 我已经下载了Android代码,并确保我使用正确的内容提供者:“content:// mms”(在android.provider.Telephony.Mms类中),并使用所有必需的权限(来自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 …

此外,我试图把“内容:/ /短信”,一切工作,因为它应该(检测input短信,甚至彩信o_O)

我误解了什么? 有没有办法纠正我的应用程序,所以它会检测到“content:// mms”中的更改? 如果它在这个应用程序不起作用,比我不能在我的数据库请求中使用这个内容? 如果我使用“content:// sms”来检测更改,我如何区分SMS和MMS? (我想得到什么是彩信)。 或者可能是最好的想法是从Android来源所有这些类,并试图按照我想要的方式修改它们? …但我不想这样做)))

这里有一个

grepcode.com:包含彩信的电话类 (也可以方便的浏览android源码)

这个信息稍微描述了如何从数据库中的MMS消息中检索信息。 但是,我仍然无法找出检测input和输出MMS消息的方式。

在我看来,为了检测MMS,我必须监视“content:// sms”(因为“content:// sms”对input的MMS作出反应,“content:// mms”不会),而且在Cursor和ContentResolver上使用“content:// mms”。

但我不知道这是一个正确的方式…另外我不明白什么是部分(或PduPart)代表…我会得到一个完整的画面,通过从MMS检索部分或它将成为图片? “content:// mms // part”和“content:// mms / part /”之间有什么区别吗?

WAP推送消息也是一个有趣的时刻。 据我了解,这些代表了一些特殊的超文本链接的短信息,也被用来将configuration从移动提供商转移到客户的手机上。 这个class:

code.google.com:MmsReceiver.java应该在WAP Push Massage的帮助下检测MMS消息。

我真的无法理解。 怎么样?

Solutions Collecting From Web of "在Android上检测彩信"

检测一个不包含的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意图通过克隆Mms应用程序的PDU分析代码来解码我想要的所有东西。

从零件文件中检索实际内容是我正在处理的内容,这是我首先find这个主题的方法。

以下是我find的一些有用的链接:

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

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

您的ContentObserver检测到的传入味精是Notificationtypes的MMS,当手机收到此通知时,它将从MMS下载真正的MMS。 所以,当你检测到新的味精,你应该过滤通知types。

 final IntentFilter filterMMS = IntentFilter.create("android.provider.Telephony.WAP_PUSH_RECEIVED", "application/vnd.wap.mms-message"); filterMMS.setPriority(Integer.MAX_VALUE); registerReceiver(smsreceiver, filterMMS); 

据我所知:彩信或短信内容提供商不是SDK的一部分,你不应该尝试访问它。 例如像三星或HTC这样的硬件制造商可以自由修改标准的消息应用程序。 在这种情况下,如果用户尝试使用与标准应用程序具有不同架构的消息传递应用程序的应用程序,那么他的数据库可能已损坏,他可能会丢失所有数据,并将其归咎于您的应用程序。 此外,这样的行为使得Android看起来devise得不好,不稳定。

你可以阅读更多关于这里: http : //www.androidguys.com/2009/12/14/code-pollution-reaching-past-the-sdk/