私が取り組んでいるアプリでは、確認の内容を読み取ることをアプリに許可することができますSMSそれ自体で確認コードを入力します。Oreoより前のOSを使用しているすべてのデバイスの場合( API 26)、BroadcastReceiverの実装は正しく機能し、SMSを適切に受信できます。この実装により、レシーバーオブジェクトをAndroidManifestに配置します。
<receiver Android:name=".SmsReceiver">
<intent-filter>
<action Android:name="Android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
ただし、Oreoからは、BroadcastReceiversを適切なコンテキストに明示的に登録する必要があります。私はこれを次のように実装しました:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
smsReceiver = new SmsReceiver();
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Telephony.Sms.Intents.DATA_SMS_RECEIVED_ACTION);
this.registerReceiver(smsReceiver, intentFilter);
}
このコードブロックは、Manifest.permission.READ_SMSの許可を受け取ると実行されます。 SmsReceiverクラスはBroadcastReceiverを拡張し、そのonReceive()メソッドをオーバーライドします。
ここで、いくつか質問があります。
この実装をテストし、SmsReceiverのonReceive()メソッドにブレークポイントを設定しました。 SMSが到着したとき、アプリはonReceive()メソッドに入ることがありません。これはなぜですか?
Android開発者のWebサイトで説明されている方法で、つまり、ConnectivityManager.CONNECTIVITY_ACTIONアクションを使用して、IntentFilterをインスタンス化しました。onReceive()のブレークポイントが常にヒットするため、SmsReceiverが機能することを知っていますただし、アクションはCONNECTIVITY_ACTIONにすぎません。SMS_RECEIVED_ACTIONがレシーバーによってキャッチされることはありません。このアクションでIntentFilterをインスタンス化することは絶対に必要ですか、それとも省略できますか?
受信者が到着したSMSをキャッチできない原因となる何か他に欠けているものはありますか?
以前は機能しなかった-Manifest.permission.READ_SMSを要求していましたが、権限を-Manifest.permission.RECEIVE_SMSに変更してから、それがoreoで機能し始め、レシーバーをマニフェストで指定しました。かどうかにかかわらず、これは私にとって一日を作りました
public static void requestPermissionForReadSMS(Fragment fragment) {
// if (fragment.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
// Helpers.showRequestPermissionAlertDialog(fragment, fragment.getString(R.string.read_sms_permission), fragment.getString(R.string.permission_request));
// } else {
fragment.requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},
Constants.READ_SMS_PERMISSION);
// }
}
私にとってこれは機能します:
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},
MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
許可が与えられた後、上記のコードをメインアクティビティに記述します。その後、これをオーバーライドします:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]
permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
Log.d("TAG", "My permission request sms received successfully");
}
}
それで全部です。そのため、数秒後に手動でSMS権限をオフおよびオンにする必要はありません。
@ rohit sharma の答えは最初はうまくいきましたが、oneplus、mi、oppo、vivoなどのさまざまなデバイスでアプリをテストしたところ、
1. vivo、oppo、mi(miui搭載)デバイスでは、autostartと呼ばれるものがデフォルトで無効になっているため、SMS_RECIEVED_ACTIONは機能しません(ここでは、アプリを起動するか、sms_recievedでバックグラウンドでサービスを実行しています)。与えられた最近の暗黙の禁止のリストから。
2. oneplusデバイスにはバッテリー最適化機能があり、アプリがバッテリー最適化にリストされている場合(これはデフォルトで「はい」です)、アプリが強制終了または電話の後である場合、SMS_RECIEVED_ACTIONはアプリがフォアグラウンドまたはバックグラウンドにある場合にのみ機能します放送受信機を再起動しても機能しません。 SMS_RECIEVD_ACTIONを機能させるには、バッテリーの最適化からアプリを削除する必要があります。これについて詳しくは、このスレッドをフォローしてください here
SMS権限を同時にオン/オフにしました。数秒後、機能しました。
追加するだけ
Android:permission="Android.permission.BROADCAST_SMS"
マニフェストのレシーバータグに。
だから理想的なマニフェスト登録放送受信機:-
<receiver Android:name=".receivers.SMSBroadCastReceiver"
Android:exported="true"
Android:permission="Android.permission.BROADCAST_SMS">
<intent-filter
Android:priority="2147483647">
<action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
UPDATE:-
現在 SMS RETRIEVER APIはread SMS
に推奨されています(それ以外の場合、Playストアはallow
にapkをリリースしません)。リンクをチェックしてください。
MainActivityで、またはアクセス許可を設定する場所
ActivityCompat.requestPermissions(MainActivity.this,
new String[] {Manifest.permission.READ_SMS,Manifest.permission.SEND_SMS,Manifest.permission.RECEIVE_SMS}, 1);
マニフェストでは、ユーザーに必要な権限
<uses-permission-sdk-23 Android:name="Android.permission.RECEIVE_SMS" />
<uses-permission-sdk-23 Android:name="Android.permission.READ_SMS" />
<uses-permission-sdk-23 Android:name="Android.permission.SEND_SMS" />
<uses-permission-sdk-23 Android:name="Android.permission.WRITE_SMS" />
レシーバーをマニフェストに置く
<receiver
Android:name=".Controllers.SmsData.SmsListener"
Android:enabled="true"
Android:exported="true"
Android:permission="Android.permission.BROADCAST_SMS">
<intent-filter Android:priority="6000">
<action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>