正在 Android 获取特定短信
Fetching a specific SMS on Android
我正在尝试做一个应用程序,如果它在其中发现任何需要的 header 短信,它将丢弃短信。
我尝试在网上查看 KitKat 更改后如何操作,发现我必须是默认应用程序才能首先获取短信。
完成后,我希望能够将短信传递给所有其他可以收听它的应用程序(具体来说,使用 Galaxy 我希望短信能够到达消息应用程序)。
无论我怎么努力,我都无法做到这一点。
即使我不发出 "abortBroadcast()",消息也不会传递给其他应用程序。
我试过自己发出一条广播消息,以便phone "belive"它收到一条短信。再次,没有运气。 (也许我做错了)
代码如下:
public class IncomingSms extends BroadcastReceiver {
final SmsManager sms = SmsManager.getDefault();
Object[] myPdusObj;
String minStr;
Intent myInt;
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
myInt = intent;
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
myPdusObj = pdusObj;
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message);
if (parseMessage(message) == true) {
this.abortBroadcast();
// Save the message/other action
}
else {
// Do nothing, let the message pass to others
}
}
}
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
和我的清单文件(经过编辑以显示为默认短信应用程序):
<application>
<!-- BroadcastReceiver that listens for incoming SMS messages -->
<receiver android:name=".IncomingSms"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter
android:priority="1">
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<!-- BroadcastReceiver that listens for incoming MMS messages -->
<receiver android:name=".IncomingMms"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter
android:priority="1">
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter
android:priority="1">
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</activity>
<!-- Service that delivers messages from the phone "quick response" -->
<service android:name=".HeadlessSmsSendService"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</service>
</application>
</manifest>
希望它能完成,这只是我在这里遗漏的一个小问题...
谢谢!
"After that done, I want to be able to pass the sms to all other apps that can listen to it("
您必须是系统应用程序才能执行此操作。查看 AOSP com/android/internal/telephony/InboundSmsHandler.java 了解 Android 是如何做到的。
总而言之,可以通过以下方式之一实现阻止其他应用程序接收广播的可能性:
- 成为系统应用程序 - 对大多数开发者来说不可能
- 要求用户选择您作为默认应用程序,这样可以防止广播到达其他应用程序但要求您的应用程序处理 'normal' 消息(或只是将它们传递给... )
我正在尝试做一个应用程序,如果它在其中发现任何需要的 header 短信,它将丢弃短信。
我尝试在网上查看 KitKat 更改后如何操作,发现我必须是默认应用程序才能首先获取短信。
完成后,我希望能够将短信传递给所有其他可以收听它的应用程序(具体来说,使用 Galaxy 我希望短信能够到达消息应用程序)。
无论我怎么努力,我都无法做到这一点。
即使我不发出 "abortBroadcast()",消息也不会传递给其他应用程序。
我试过自己发出一条广播消息,以便phone "belive"它收到一条短信。再次,没有运气。 (也许我做错了)
代码如下:
public class IncomingSms extends BroadcastReceiver {
final SmsManager sms = SmsManager.getDefault();
Object[] myPdusObj;
String minStr;
Intent myInt;
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
myInt = intent;
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
myPdusObj = pdusObj;
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message);
if (parseMessage(message) == true) {
this.abortBroadcast();
// Save the message/other action
}
else {
// Do nothing, let the message pass to others
}
}
}
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
和我的清单文件(经过编辑以显示为默认短信应用程序):
<application>
<!-- BroadcastReceiver that listens for incoming SMS messages -->
<receiver android:name=".IncomingSms"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter
android:priority="1">
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<!-- BroadcastReceiver that listens for incoming MMS messages -->
<receiver android:name=".IncomingMms"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter
android:priority="1">
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter
android:priority="1">
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</activity>
<!-- Service that delivers messages from the phone "quick response" -->
<service android:name=".HeadlessSmsSendService"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</service>
</application>
</manifest>
希望它能完成,这只是我在这里遗漏的一个小问题... 谢谢!
"After that done, I want to be able to pass the sms to all other apps that can listen to it("
您必须是系统应用程序才能执行此操作。查看 AOSP com/android/internal/telephony/InboundSmsHandler.java 了解 Android 是如何做到的。
总而言之,可以通过以下方式之一实现阻止其他应用程序接收广播的可能性:
- 成为系统应用程序 - 对大多数开发者来说不可能
- 要求用户选择您作为默认应用程序,这样可以防止广播到达其他应用程序但要求您的应用程序处理 'normal' 消息(或只是将它们传递给... )