gpt4 book ai didi

安卓 : Catching Outgoing SMS using ContentObserver or receiver not working

转载 作者:太空狗 更新时间:2023-10-29 13:15:56 30 4
gpt4 key购买 nike

我正在尝试使用内容观察器捕捉传出的 SMS 事件。

//TEST OBSERVER
ContentObserver co = new SMSoutObserver(new Handler(), getApplicationContext());
ContentResolver contentResolver = getApplicationContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, co);
// END TEST OBSERVER

public class SMSoutObserver extends ContentObserver {

private Context mCtx;

public SMSoutObserver(Handler handler, Context ctx) {
super(handler);
mCtx = ctx;
}

@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// save the message to the SD card here
Logger.d("On Change");
Toast.makeText(mCtx,"TEST", Toast.LENGTH_LONG).show();
}
}

但是,如果我在模拟器事件中发送外发消息,则不会触发。

我也尝试过使用接收器。

<receiver android:name=".receiver.SMSReceiver"
android:enabled="true"
android:exported="true"
android:priority="1000">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.provider.Telephony.SMS_SENT"/>
</intent-filter>
</receiver>

带接收器

public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
try {

Logger.d("SMSReceiver triggered");
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
//do something with the received sms
Logger.d("Incoming SMS");
}else if(intent.getAction().equals("android.provider.Telephony.SMS_SENT")){
//do something with the sended sms
Logger.d("Outgoing SMS");
}
// Start reminder service
// context.startService(new Intent(context, ReminderService.class));
} catch (Exception e) {
Logger.e("onReceive method cannot be processed");
TrackingEventLogHelper.logException(e, Constants.Global.EXCEPTION,
Constants.ExceptionMessage.EXC_CANNOT_CANNOT_PROCESS_REBOOT_RECEIVER, true);
}
}

}

但此接收器仅针对传入消息触发,不会针对传出消息触发。我也应该如何以正确的方式在 android 版本 > 5 上工作。

非常感谢任何建议

最佳答案

SDK 中没有 "android.provider.Telephony.SMS_SENT" 操作,发送 SMS 时也没有任何系统范围的广播,因此您的第二种方法不会起作用.

对于ContentObserver,您注册的Uri 必须是SMS Provider 的基础Uri。即,将 Uri.parse("content://sms/out") 更改为 Uri.parse("content://sms")。如果只想处理传出消息,则必须在 onChange() 方法中查询 Provider,并检索消息的 type 列值,检查2 的值,表示已发送消息。

如果您支持低于 16 的 API 级别,那么它将是这样的:

private static final Uri uri = Uri.parse("content://sms");  
private static final String COLUMN_TYPE = "type";
private static final int MESSAGE_TYPE_SENT = 2;
...

@Override
public void onChange(boolean selfChange) {
Cursor cursor = null;

try {
cursor = resolver.query(uri, null, null, null, null);

if (cursor != null && cursor.moveToFirst()) {
int type = cursor.getInt(cursor.getColumnIndex(COLUMN_TYPE));

if (type == MESSAGE_TYPE_SENT) {
// Sent message
}
}
}
finally {
if (cursor != null)
cursor.close();
}
}

从 API 16 开始,ContentObserver 类提供了一个 onChange() 重载,它将为消息提供特定的 Uri 作为第二个参数,您可以比基本 Uri 更有效地查询和检查。此外,如果您的最低 API 级别是 19,则有几个类的常量可以替换上面示例代码中定义的类。

作为旁注,发件箱的 Uri"content://sms/outbox",而不是 "content://sms/out ".

关于安卓 : Catching Outgoing SMS using ContentObserver or receiver not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34692384/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com