我正在编写一个具有发送和接收短信功能的应用。我希望我的应用程序发送的短信只能由安装了我的应用程序的另一部手机接收,而不是手机的原生短信应用程序。到目前为止我找到的唯一解决方案是在Manifest文件中将android:priority设置为高优先级:
<receiver android:name=".SMSreceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
并将onReceive方法中的this.abortBroadcast()语句放到扩展BroadcastReceiver的类中:
public class SMSreceiver extends BroadcastReceiver
{
private final String CODE = "myappcodeword";
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String from = "";
String str = "";
String sms = "";
if (bundle != null)
{
Object [] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i<msgs.length; i++)
{
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
if (i == 0)
{
from = msgs[i].getOriginatingAddress();
}
str += msgs[i].getMessageBody().toString();
}
if (str.startsWith(CODE)) // SMS starts with code word therefore was sent by my app
{
sms = str.substring(CODE.length()); // extract code word from actual sms message
Intent SMSIntent = new Intent(context, SMSActivity.class);
SMSIntent.putExtra("from", from);
SMSIntent.putExtra("sms", sms);
SMSIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(SMSIntent); // start new activity using sms info
this.abortBroadcast();
}
}
}
}
由于我当然不希望阻止不适用于我的应用的短信,我想通过某种关键词启动我的应用发送的短信。我的问题是,有比这更好的解决方案吗? (例如,用户可能理论上实际上发送短信给包含关键词的人,无论关键词是多么随机,我的应用程序会过滤掉它)。如果发送短信的手机没有安装我的应用程序,上面的代码也不会过滤掉我的应用程序发送的短信。有没有办法首先找出手机短信发送到我的应用程序安装?如果没有安装该应用程序,那么我希望SMS甚至不会显示在该手机上。
答案 0 :(得分:1)
您可能希望查看GCM,允许您根据需要定位在目标设备上运行的应用程序。
答案 1 :(得分:0)
不,您不能将SMS用作您描述的方案的载体。请记住,短信是一种存储和转发服务(在这方面类似于电子邮件),如果收件人未开启或超出保险范围,移动运营商可能会长时间存储该信息(可能数天)(在某些时候)它将被丢弃,但直到运营商决定为止。