Android监听短信和电话
在Android开发中,有时需要监听手机的短信和电话状态以实现某些功能,例如自动读取验证码、监控通话记录等,本文将详细介绍如何在Android应用中实现对短信和电话的监听,并提供相关代码示例。
一、Android监听短信
1. 接受系统的短信广播
优点:操作方便,适合简单的短信应用。
缺点:来信会在状态栏显示通知信息。
实现步骤:
1、权限声明:在AndroidManifest.xml
中声明接收短信的权限。
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
2、创建BroadcastReceiver:创建一个继承自BroadcastReceiver
的类,用于监听短信广播。
public class SmsReceiver extends BroadcastReceiver { private static final String TAG = "SmsReceiver"; public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(SMS_RECEIVED_ACTION)) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); for (Object pdu : pdus) { SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu); String sender = smsMessage.getDisplayOriginatingAddress(); String messageBody = smsMessage.getMessageBody(); Log.i(TAG, "Sender: " + sender + ", Message: " + messageBody); } } } } }
3、注册BroadcastReceiver:在应用启动时注册这个BroadcastReceiver
。
public class MainActivity extends AppCompatActivity { private SmsReceiver smsReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); smsReceiver = new SmsReceiver(); IntentFilter filter = new IntentFilter(SmsReceiver.SMS_RECEIVED_ACTION); registerReceiver(smsReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(smsReceiver); } }
2. 监听短信数据库
优点:可以拦截来信在状态栏的显示通知,适合作短信拦截。
缺点:可能发展成恶意软件(MU),在后台悄悄收发短信。
实现步骤:
1、权限声明:在AndroidManifest.xml
中声明读取短信的权限。
<uses-permission android:name="android.permission.READ_SMS" />
2、创建观察者模式监听短信数据库:通过观察者模式监听短信数据库的变化。
public class SmsObserver extends ContentObserver { public SmsObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // 实现短信内容获取逻辑 } }
二、Android监听电话
1. 使用TelephonyManager监听电话状态(适用于Android 12以下)
在Android 12(API级别31)之前,可以使用PhoneStateListener
来监听电话状态。
实现步骤:
1、权限声明:在AndroidManifest.xml
中声明读取电话状态的权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
2、创建PhoneStateListener:继承自PhoneStateListener
并重写相关方法。
public class MyPhoneStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String phoneNumber) { switch (state) { case TelephonyManager.CALL_STATE_RINGING: Log.i("MyPhoneStateListener", "Incoming call from: " + phoneNumber); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.i("MyPhoneStateListener", "Call answered"); break; case TelephonyManager.CALL_STATE_IDLE: Log.i("MyPhoneStateListener", "Call ended or no call"); break; } } }
3、注册PhoneStateListener:在合适的位置注册这个监听器。
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); telephonyManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
2. 使用BroadcastReceiver监听电话状态(适用于Android 12及以上)
在Android 12及以上版本中,推荐使用TelecomManager
和registerTelephonyCallback
来监听电话状态。
实现步骤:
1、权限声明:在AndroidManifest.xml
中声明读取电话状态的权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
2、创建TelephonyCallback:实现TelephonyCallback
接口并重写相关方法。
public class MyTelephonyCallback extends TelephonyCallback { @Override public void onCallStateChanged(@NonNull TelephonyManager telephonyManager, @NonNull CallState state) { switch (state) { case RINGING: Log.i("MyTelephonyCallback", "Incoming call"); break; case OFFHOOK: Log.i("MyTelephonyCallback", "Call answered"); break; case IDLE: Log.i("MyTelephonyCallback", "Call ended or no call"); break; } } }
3、注册TelephonyCallback:在合适的位置注册这个回调。
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { try { TelecomManager telecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE); telecomManager.registerTelephonyCallback(new MyTelephonyCallback()); } catch (Exception e) { e.printStackTrace(); } } else { telephonyManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE); }
无论是监听短信还是电话,都需要注意以下几点:
1、权限管理:确保在应用运行时动态请求所需权限,并在用户拒绝授权时给予适当提示。
2、隐私保护:避免滥用监听功能,尊重用户隐私,不要进行未经授权的数据收集和传输。
3、性能优化:监听操作可能会消耗系统资源,应尽量减少不必要的操作,确保应用流畅运行。
4、兼容性处理:针对不同版本的Android系统,选择合适的API和方法,确保应用的广泛兼容性。
5、安全性:防止应用被恶意利用,建议对敏感操作进行加密处理,并定期更新安全策略。
四、相关问题与解答
1、问题1:为什么在AndroidManifest.xml中声明了RECEIVE_SMS权限后,仍然无法接收到短信?
解答:从Android 6.0(API级别23)开始,读取短信属于危险权限,需要在运行时动态申请权限,请确保在代码中添加了动态权限请求的逻辑,如下所示:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 1); }
2、问题2:如何在锁屏状态下继续监听短信?
解答:为了在锁屏状态下继续监听短信,可以启动一个前台服务(Foreground Service),在服务中进行短信监听操作,并确保服务在锁屏状态下不会被系统杀死,以下是一个简单的前台服务示例:
public class ForegroundService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { Intent notificationIntent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); Notification notification = new Notification.Builder(this, CHANNEL_ID) .setContentTitle("Foreground Service") .setContentText("Listening for SMS...") .setSmallIcon(R.drawable.ic_notification) .setContentIntent(pendingIntent) .build(); startForeground(1, notification); // 在这里添加短信监听逻辑 return START_NOT_STICKY; } }
以上就是关于“android监听短信电话”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/638956.html