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.