Android:SMS処理

0.参加する代わりに


定期的に(無料の夕べがあり、「クラブ」が試合を企画するとき)私はラグボールをします。 「クラブ」は、試合当日にすべての参加者が次のタイプのSMSを受信できるように編成されています。

! 19-30. №30: . , 20. . . 8 (951) ***-**-**.

そして、私は考えました-これらのメッセージをキャッチしてGoogleカレンダーに打ち込む小さなアプリケーションを書いてみませんか。 なんで? はい、基本的には楽しみのためだけです。なぜなら、私は忙しい人ではないので、自動秘書が私にとって不可欠だからです。

そのため、アプリケーションは次のことができるようになります。

記事の一部として、読者は基本的な知識を持っていると信じています-プロジェクトの作成方法、マニフェストファイルとは何か、Android向けの一般的な開発を開始する場所-このテーマに関するさまざまなチュートリアルがあり、ここで終わりではありません。 同時に、この記事は上級のAndroid開発者を対象としておらず、SMSの監視と処理、データベースの操作、HTTPを介した接続など、かなり基本的なことを扱っています。

それでは始めましょう。 ちなみに、使用されているSDKのバージョンは14(Android 4.0)です。

1. SMSを傍受する


着信SMSを監視するために最初に行う必要があるのは、それらを受信する許可を要求することです。 これを行うには、フォームのエントリをAndroidManifest.xmlファイルに追加します。

 <uses-permission android:name="android.permission.RECEIVE_SMS" /> 


次のステップは、着信メッセージをリッスンするモニターを実装することです。 これを行うには、マニフェストファイルにレシーバーを登録します。

 <receiver android:name="SMSMonitor"> <intent-filter android:priority="100"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> 


ここでは、優先度を100に設定し、アプリケーションが優先度がゼロの標準SMSハンドラの前に着信SMSにアクセスできるようにします。 アプリケーションがメッセージを処理した後、それをシステムに渡して受信トレイに置くことは意味がありません。

BroadcastReceiverを拡張するクラスを作成します。

 public class SMSMonitor extends BroadcastReceiver { private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { } } 


このクラスは、メッセージを受信するたびにシステムによって呼び出される抽象onReceive()メソッドを実装します。 メソッドには次のように記述します。

 if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction()) == 0) { Object[] pduArray = (Object[]) intent.getExtras().get("pdus"); SmsMessage[] messages = new SmsMessage[pduArray.length]; for (int i = 0; i < pduArray.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]); } } 


ここでは、 intent.getExtras().get("pdus")を使用してメッセージを取得し、PDU形式のオブジェクトの配列を返します。次に、 createFromPdu()メソッドを使用してこれらのオブジェクトをSmsMessageます。

今注目。 メッセージを受け取った後にすることはすぐに実行されるべきです。 放送受信機はシステムで高い優先度を受け取りますが、バックグラウンドで動作し、短時間で実行される必要があるため、機能が制限されます。 たとえば、通知を生成したり、サービスを開始して処理を続行したりできます。 したがって、メッセージの送信者を確認し、これがゲームに関する通知である場合、メッセージテキストを引き出して、サービスを開始します。このサービスでは、このメッセージを既に処理します。

onReceive()メソッドを追加します。

 String sms_from = messages[0].getDisplayOriginatingAddress(); if (sms_from.equalsIgnoreCase("RM FIGHT")) { StringBuilder bodyText = new StringBuilder(); for (int i = 0; i < messages.length; i++) { bodyText.append(messages[i].getMessageBody()); } String body = bodyText.toString(); Intent mIntent = new Intent(context, SmsService.class); mIntent.putExtra("sms_body", body); context.startService(mIntent); abortBroadcast(); } 


ここで、メッセージテキストを作成し(メッセージが長く、複数のSMSで到着した場合、個々の部分はmessages[i]格納されmessages[i] )、他のアプリケーションによるメッセージのそれ以上の処理を防ぐためにabortBroadcast()メソッドを呼び出します。

2. SMSを処理します


前の段落では、 startService()メソッドを使用してSMSを処理するためのサービスを開始するという事実について説明しました。 実際、サービスとは何で、何を一緒に食べるのかは公式ウェブサイトで詳しく説明されているので、ここでやめません。

Serviceクラスを拡張するSmsServiceクラスを作成します。

 public class SmsService extends Service { @Override public IBinder onBind(Intent intent) { return null; } } 


ローカルサービスがあるため、onBind()メソッドはnullを返します。

通知を表示するには、showNotification()ヘルパーメソッドが必要です。

 private void showNotification(String text) { PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0); Context context = getApplicationContext(); Notification.Builder builder = new Notification.Builder(context) .setContentTitle("Rugball") .setContentText(text) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.ic_launcher) .setAutoCancel(true); NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = builder.getNotification(); notificationManager.notify(R.drawable.ic_launcher, notification); } 


onStartCommand()メソッドでonStartCommand()onStartCommand()ように記述します。

 @Override public int onStartCommand(Intent intent, int flags, int startId) { String sms_body = intent.getExtras().getString("sms_body"); showNotification(sms_body); return START_STICKY; } 


実際、データベースにSMSを追加し、Googleカレンダーでイベントを形成するsmsProcess()メソッドを実装することは残っています。 これは、記事の次の部分で行うことです。

更新: GitHubにコードを投稿しました。 記事の2番目の部分には時間がありません。仕事には忙しすぎます。 この問題にすぐに対処したいと考えています。

Source: https://habr.com/ru/post/J149555/


All Articles