SMS メッセージを送受信する機能を持つアプリを作成しています。アプリから送信された SMS メッセージは、アプリがインストールされている別の電話でのみ受信され、電話のネイティブ SMS アプリには届かないようにしたいと考えています。これまでに見つけた唯一の解決策は、マニフェスト ファイルで android:priority に高い優先度を設定することです。
<receiver android:name=".SMSreceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
そして、BroadcastReceiver を拡張するクラスの onReceive メソッドに this.abortBroadcast() ステートメントを配置します。
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 をブロックしたくないので、何らかのキーワードでアプリから送信される SMS メッセージを開始することを考えました。私の質問は、これよりも良い解決策はありますか? (たとえば、理論的には、キーワードがどれほどランダムで、アプリがそれを除外しても、ユーザーは意図的にキーワードを含む誰かに SMS を実際に送信する可能性があります)。また、SMSの送信先の電話にアプリがインストールされていない場合、上記のコードはアプリから送信されたSMSを除外しません。SMS の送信先の電話にアプリがインストールされているかどうかを最初に確認する方法はありますか? アプリがインストールされていない場合は、その電話に SMS が表示されないようにしたいと思います。