gpt4 book ai didi

android - 拦截、阅读和取消短信

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:04 31 4
gpt4 key购买 nike

我正在寻找一种方法来挂接 SMSManager 或较低级别的机制,以便我可以在发送任何外发 SMS 消息之前拦截、读取和取消它们。

最佳答案

迟到总比不到好:)

我已经在这上面花了 2 天...并且不想让任何其他人浪费他们的时间 :)

  1. 做一个服务,在服务类中注册一个内容观察者

更新:添加了 SMS 模型类

      public class SMS {
public Date date;
public String from;
public String message;
public String to;

public SMS(String paramString1, String paramString2, String paramString3,Date paramDate) {
this.from = paramString1;
this.to = paramString2;
this.message = paramString3;
this.date = paramDate;
}
}

    public class ServiceClass extends Service implements SMSListener {
public static boolean sendSms = true;
private final IBinder mBinder = new LocalBinder();
public static MyContentObserver mSMSObserver;
private Context ctx;
public static SMS param_SMS;
int myID = -1;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub

myID = startId;
sendSms = true;
Context localContext = getApplicationContext();
ctx = localContext;

mSMSObserver = new MyContentObserver(null);
mSMSObserver.setSMSListener(this);
mSMSObserver.start(localContext);

return Service.START_STICKY;
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
SharedPreferences prefs = getApplicationContext().getSharedPreferences(
"appData", 0);

if (prefs.getBoolean(CommonStrings.KEY_PREFS_TOGGLE, false)) {

super.onDestroy();
Log.e("OnDestroy", "Stopping Service");
Context localContext = getApplicationContext();
mSMSObserver.stop(localContext);

try {
stopSelf(myID);
Log.e("Stopping self", "Stopping Service");
} catch (Exception e) {
e.printStackTrace();
}
}
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.e("OnBinder", "OnBinder");
return null;
}

@Override
public void reportIncomingSms(SMS paramSMS) {
// TODO Auto-generated method stub

}

public void reportOutgoingSms(SMS paramSMS) {
if (!MainActivity.stopped) {
Log.e("OUT GOING SMS DETECTED", "OUT GOING SMS DETECTED");
sendSms = true;
param_SMS = paramSMS;

// DO ANY THING, Out going Msg detected...

}
}

public class LocalBinder extends Binder {
public LocalBinder() {
}

public ServiceClass getService() {
return ServiceClass.this;
}
}
}
  1. 扩展内容观察器

    public class MyContentObserver extends ContentObserver {

    public static final int MESSAGE_TYPE_ALL = 0;
    public static final int MESSAGE_TYPE_DRAFT = 3;
    public static final int MESSAGE_TYPE_FAILED = 5;
    public static final int MESSAGE_TYPE_INBOX = 1;
    public static final int MESSAGE_TYPE_OUTBOX = 4;
    public static final int MESSAGE_TYPE_QUEUED = 6;
    public static final int MESSAGE_TYPE_SENT = 2;
    public static final String TYPE = "type";
    private SMSListener mSMSListener;
    public static long _id;
    private ContentObserver observer;
    public MyContentObserver(Handler handler) {
    super(handler);
    // TODO Auto-generated constructor stub
    }
    private void readFromOutgoingSMS(Context paramContext) {
    if (!MainActivity.stopped) {
    Cursor localCursor = paramContext.getContentResolver().query(
    Uri.parse("content://sms"), null, null, null, null);
    long l = 0;
    int i;
    if (localCursor.moveToNext()) {
    l = localCursor.getLong(localCursor.getColumnIndex("_id"));
    String str1 = localCursor.getString(localCursor
    .getColumnIndex("protocol"));
    i = localCursor.getInt(localCursor.getColumnIndex("type"));
    if ((str1 != null) || (i != 6))
    localCursor.close();
    if (i == 6) {
    int j = localCursor.getColumnIndex("body");
    int k = localCursor.getColumnIndex("address");
    Date localDate = new Date(localCursor.getLong(localCursor
    .getColumnIndex("date")));
    String str2 = localCursor.getString(k);
    String str3 = localCursor.getString(j);
    localCursor.close();
    _id = l;
    // Delete SMS and Save the sms content to custom type variable
    if (deleteSms(paramContext, l)) {
    SMS localSMS = new SMS("", str2, str3, localDate);
    this.mSMSListener.reportOutgoingSms(localSMS);
    } else {
    localCursor.close();
    }
    }
    }
    }
    }

    public static boolean deleteSms(Context paramContext, long paramLong) {
    Uri localUri = ContentUris.withAppendedId(Uri.parse("content://sms"),
    paramLong);
    boolean bool = false;
    if (localUri != null) {
    try {
    int j = paramContext.getContentResolver().delete(localUri,
    null, null);
    if (j == 1)
    bool = true;
    else
    bool = false;
    } catch (Exception localException) {
    localException.printStackTrace();
    bool = false;
    }
    }
    return bool;
    }

    private void registerContentObserver(final Context paramContext) {
    this.observer = new ContentObserver(null) {
    public void onChange(boolean paramAnonymousBoolean) {
    readFromOutgoingSMS(paramContext);
    }
    };
    paramContext.getContentResolver().registerContentObserver(
    Uri.parse("content://sms"), true, this.observer);
    }
    public void setSMSListener(SMSListener paramSMSListener) {
    this.mSMSListener = paramSMSListener;
    }
    public void start(Context paramContext) {
    registerContentObserver(paramContext);
    listenForIncomingSms(paramContext);
    }

    public void stop(Context paramContext) {
    paramContext.getContentResolver().unregisterContentObserver(
    this.observer);
    }
    private void listenForIncomingSms(Context paramContext) {
    //.....
    }

    }
  2. 短信监听器

     public abstract interface SMSListener {
    public abstract void reportIncomingSms(SMS paramSMS);

    public abstract void reportOutgoingSms(SMS paramSMS);
    }

需要的权限:

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

关于android - 拦截、阅读和取消短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589395/

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