Не можете показать макет и удалить смс одновременно?

Я хотел бы удалить смс, полученные с номера телефона, так быстро, чтобы он не показывался пользователю (чтобы "заблокировать" этот номер телефона, который спамит пользователя). Я также хочу, чтобы мое приложение для Android показывало макет, но это невозможно сделать одновременно!

Это мой метод удаления смс:

 public void deleteSMS(Context context, String number) {
    try {

        Uri uriSms = Uri.parse("content://sms/inbox");
        Cursor c = context.getContentResolver().query(uriSms,
            new String[] { "_id", "thread_id", "address",
                "person", "date", "body" }, null, null, null);

        if (c != null && c.moveToFirst()) {
            do {
                long id = c.getLong(0);
                String address = c.getString(2);


                if (address.equals(number)) {

                    context.getContentResolver().delete(
                        Uri.parse("content://sms/" + id), null, null);
                    Toast.makeText(this, "SMS deleted", Toast.LENGTH_SHORT).show();
                }
            } while (c.moveToNext());
        }
    } catch (Exception e) {

    }

Затем, чтобы заблокировать номер телефона «123456», я делаю:

setContentView(R.layout.activity_main);
int r = 0;
         while (r<1){
             deleteSMS(this, "123456");}

Приложение отлично удаляет смс всякий раз, когда я его отправляю, но не показывает макет или тосты. Также, когда я просто делаю это:

setContentView(R.layout.activity_main);
     deleteSMS(this, "123456");

Показывает всю раскладку, тосты и удаление смс. У вас есть идея, чтобы исправить это?


person MisterX    schedule 12.11.2014    source источник
comment
it show all the layout, toasts, and delete the sms ... разве это не то, что вы хотите сделать?   -  person zgc7009    schedule 12.11.2014
comment
это то, что я хочу, но это работает только тогда, когда я удаляю смс один раз (во втором случае)! я хочу, чтобы он работал, когда deleteSMS() всегда перезапускается (как в первом случае). Спасибо за ваш ответ :)   -  person MisterX    schedule 12.11.2014
comment
Я в замешательстве, почему вы хотите удалить больше, чем сообщение, которое вы получили? Если вы удаляете сообщение, когда получаете его, и у вас нет других сообщений с этого номера, не должно быть никаких других сообщений для удаления, поэтому я не уверен, что понимаю проблему. Извините :|   -  person zgc7009    schedule 12.11.2014
comment
он должен удалить ВСЕ смс, которые получены от кого-то. С момента запуска приложения все смс, полученные от этого парня в прошлом, или смс, которые будут получены в будущем (пока приложение работает), мгновенно удаляются. Второй код setContentView(R.layout.activity_main); удалитьSMS(это, 123456); просто удалите смс, которые были получены в прошлом.   -  person MisterX    schedule 12.11.2014
comment
заставить deleteSMS возвращать логическое значение (true, если это удается, false, если это не так) и прерывать цикл while, если он терпит неудачу (while(r ‹ 1){ if(!deleteSMS(this, 123456)) break; } Прямо сейчас у вас есть never заканчивающийся цикл while (который, как я удивлен, не ломает ваше приложение), поэтому макет не раздувается.   -  person zgc7009    schedule 12.11.2014
comment
да, это цель моего приложения, удалить все смс, приходящие с номера телефона. Действие по удалению смс никогда не должно прекращаться, потому что пользователь может получать другие смс в будущем. понимание? :)   -  person MisterX    schedule 12.11.2014
comment
Хотя на самом деле вы делаете это не так, как должны. Вы должны удалять отдельные сообщения как раз. Плохой пользовательский интерфейс — удалять что-то, что вы не удаляете явно. Что делать, если вы хотите перестать получать сообщения от кого-то, но не хотите удалять сообщения, которые у вас уже есть? В любом случае, вам не нужен бесконечный цикл в вашем приложении, ОСОБЕННО в основном потоке.   -  person zgc7009    schedule 12.11.2014
comment
у вас есть идея, чтобы исправить это? сделать то же самое по-другому?   -  person MisterX    schedule 12.11.2014
comment
Я имею в виду, что если вы действительно хотите, вы можете отправить свой deleteSMS в поток, и этот поток продолжит работу, но, как я уже сказал, это противоречит соглашению о том, что вы пытаетесь сделать. Идея с SMS состоит в том, чтобы получать текст, когда он приходит, и удалять его таким образом, таким образом, ваше приложение всегда будет работать/обрабатываться, что не является хорошей идеей для того, что вы пытаетесь сделать. У вас будет приложение, работающее 24 часа в сутки, 7 дней в неделю, которое на самом деле может делать что-то 30 секунд в день.   -  person zgc7009    schedule 12.11.2014
comment
хорошо, я попытаюсь отправить свое сообщение об удалении SMS в поток. Я новичок, поэтому я собираюсь искать, как это сделать. Спасибо за помощь !   -  person MisterX    schedule 12.11.2014


Ответы (1)


Просто для начала, поскольку (после ряда комментариев) кажется, что вы намерены делать это там, где приложение всегда работает)

public class MainActivity extends Activity{

    private final static int SERVICE_ID = 1234;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Intent notificationIntent = new Intent(this, DeleteSmsService.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent. FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        Notification notice = new Notification.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle(getString(R.string.app_name))
            .setContentText("Deleting SMS Messages")
            .setContentIntent(pendingIntent).build();

        notice.flags |= Notification.FLAG_NO_CLEAR;

        startForeground(SERVICE_ID, notice);
    }
}

Затем создайте службу

public DeleteSmsService extends Service{

    private ContentResolver contentResolver;

    @Override
    public void onCreate(){
        super.onCreate();

        contentResolver = getContext().getContentResolver();

        new Thread(){
            @Override
            public void run(){
                while(true){
                    deleteSms(contentResolver, "123456");
                }
            }
        }.start();
    }

    public void deleteSMS(ContentResolver cr, String number) { 

        try {

            Uri uriSms = Uri.parse("content://sms/inbox");
            Cursor c = cr.query(uriSms,
                new String[] { "_id", "thread_id", "address",
                "person", "date", "body" }, null, null, null);

            if (c != null && c.moveToFirst()) {
                do {
                    long id = c.getLong(0);
                    String address = c.getString(2);

                    if (address.equals(number)) {
                        cr.delete(Uri.parse("content://sms/" + id), null, null);
                        Toast.makeText(this, "SMS deleted", Toast.LENGTH_SHORT).show();
                    }
                } while (c.moveToNext());
            }
        } catch (Exception e) {

    }
}

Я не проверял ничего из этого, я понятия не имею, есть ли в нем ошибки или может быть отключено форматирование, поскольку я просто набрал его очень быстро. Это нужно для того, чтобы вы начали делать то, что хотите, наилучшим образом, как я могу придумать, не увязая в потоке пользовательского интерфейса и поддерживая обычные соглашения. Возможно, вам придется использовать обработчик потоков, не уверен (опять же, не проверял).

Опять же, я бы не стал делать это таким образом, но это просто для того, чтобы помочь вам начать с того, что вы пытаетесь сделать, поскольку это то, что вы, похоже, намерены делать.

person zgc7009    schedule 12.11.2014