Podemos excluir um SMS no Android antes que ele chegue à caixa de entrada?


100

Estou excluindo um SMS da caixa de entrada, mas quero saber: como posso excluí-lo antes que chegue na caixa de entrada?


2
J2ee é realmente uma tag correspondente aqui?
— jitter

1
Por que java seria incorreto, você não programa em java no Android?
— jitter

3
Isso cheira mal. Você não deveria estar fazendo isso.
— MattC

43
Existem usos legítimos! Por exemplo, se você quiser fazer algo (enviar localização GPS, limpar ou algo assim) no seu telefone via SMS para o caso de ser roubado; você não quer que quem roubou o telefone veja aquela mensagem SMS.
— poliglota de

21
Vamos lá pessoal! Isso definitivamente NÃO é "mal". @polyglot está certo! Estou fazendo um aplicativo para confirmar o número do usuário (como o Viber faz) e preciso disso. Tudo pode ser usado como "mal". Não instale aplicativos malignos, apenas isso.
— Felipe,

Respostas:


187

Sim.

Apesar de algumas reações negativas a esta pergunta, existem usos legítimos para a interceptação de SMS. Por exemplo: automatizar a verificação do número de telefone, serviços que são fornecidos via SMS (embora geralmente isso deva ser feito com SMS de dados) ou para aplicativos que melhoram a experiência do usuário processando mensagens especialmente formatadas para mostrá-las em um bom Android -IU específica.

A partir do Android 1.6, as transmissões de mensagens SMS recebidas ( android.provider.Telephony.SMS_RECEIVED) são entregues como uma " transmissão ordenada " - o que significa que você pode informar ao sistema quais componentes devem receber a transmissão primeiro.

Se você definir um android:priorityatributo na sua escuta de SMS<intent-filter> , receberá a notificação antes do aplicativo SMS nativo.

Neste ponto, você pode cancelar a transmissão, evitando que ela seja propagada para outros aplicativos.


Atualização (outubro de 2013): Quando o Android 4.4 chegar, ele fará alterações nas APIs de SMS que podem afetar a capacidade de um aplicativo de influenciar a entrega de SMS.
Confira esta postagem do blog de desenvolvedores Android para obter mais informações:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
Santo Deus. Isso é verdade! Sempre achei que seria o contrário! Para provas, veja aqui . Uau. Gostaria de poder dar a você mais de um voto positivo;)
— Hamy

1
@kakopappa: Sim, conforme mencionado na resposta, ele funciona a partir do Android 1.6+.
— Christopher Orr

1
@herom Eu tenho apps que usam prioridade 1000, então é possível. Na verdade, Handcent está usando prioridade 2147483647.
— Christopher Orr

2
Isso funcionou para mim :) Meu aplicativo captura a mensagem primeiro e não há notificação, mas o sms não chega à caixa de entrada de mensagens. Como se nunca tivesse sido recebido, apenas no meu aplicativo. Existe uma maneira de abortar a transmissão, mas receber mensagens na caixa de entrada?
— pandabear

7
É importante ter em mente a nova API de nível 19, conforme @ChristopherOrr diz em sua atualização. Lá diz "Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it.".
— GoRoS de

11

Etapa 1: Crie seu receptor de transmissão personalizado para receber sms. escreva a lógica para abortar o broadst de modo que a mensagem não fique disponível em sua caixa de entrada

public class SMSReceiver extends BroadcastReceiver
{
    public void onReceive(Context context, Intent intent)
    {
     if(conditionMatches){
     abortBroadcast();
     }
    }
}

Etapa 2 Registre o receptor de transmissão em AndoridManifest e coloque android: valor de prioridade um grande número

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

É isso aí

Como funciona o código acima

Como o recebimento de SMS é uma transmissão ordenada, o receptor com alta prioridade receberá primeiro, portanto, seu aplicativo receberá primeiro e, após o recebimento, você está abortando a transmissão. Portanto, nenhum outro aplicativo pode recebê-lo. Portanto, o sms não existirá na caixa de entrada


podemos ter um receptor de transmissão, quando o usuário pressiona a caixa de entrada de mensagens, para que eu possa desenvolver uma tela de bloqueio ..
— Vamsi Pavan Mahesh

9

A solução abaixo ("android: priority" e abortBroadcast ()) funciona enquanto o aplicativo Android Messaging como padrão (eu quis dizer o aplicativo Android Messaging padrão). Se o usuário instalar "GoSMSPro" ou "HandcentSMS", esses aplicativos ainda mostram mensagens na caixa de entrada, acredito que isso seja devido a "android: priority". Não vejo nenhuma maneira melhor de corrigir o problema acima, se houver aplicativos de mensagens de terceiros instalados no telefone.


2
Bom ponto. Mas isso deve ser um comentário, não uma resposta. É possível movê-lo? --- e se você colocar um valor muito alto? Como android: prioridade = "9999"? por exemplo? Você já tentou isso?
— Felipe,

4
@FelipeMicaroniLalli na verdade GO SMS PRO, etc ... use 2147483647 como prioridade
— rf43

1
@DDoSAttack 2147483647 é o máximo?
— Felipe

3
É o maior número inteiro sem sinal en.wikipedia.org/wiki/Integer_(computer_science), o máximo que o Android suporta é 999. developer.android.com/reference/android/content/…
— rf43

2
@NomanHamid Correto. 999 é a prioridade máxima. Você pode usar qualquer número que escolher, mas o Android só garante até 999. Qualquer coisa maior do que isso pode ou não ser instável e ter consequências indesejadas. Pessoalmente, tive que usar o 2147483647 para tentar acessar aplicativos como o GO SMS PRO. Às vezes funcionava para os usuários e às vezes não.
— rf43

1
/**
 * Check priority
 * @param activity
 */
public static void receiverPriority(Activity activity){

    Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
    List<ResolveInfo> infos =  activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
    for (ResolveInfo info : infos) {
        System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
    }
}

Verifique a prioridade e defina uma prioridade mais alta (em seu manifesto) do que outros receptores.


0

Se você tiver um cenário como este e quiser excluir ou ignorar a mensagem relacionada a este número de contato "+ 44xxxxx" etc, use este código no receptor de transmissão de SMS

 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

Você também deve definir como alta prioridade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.