Estou excluindo um SMS da caixa de entrada, mas quero saber: como posso excluí-lo antes que chegue na caixa de entrada?
Estou excluindo um SMS da caixa de entrada, mas quero saber: como posso excluí-lo antes que chegue na caixa de entrada?
Respostas:
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:priority
atributo 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
1000
, então é possível. Na verdade, Handcent está usando prioridade 2147483647
.
"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."
.
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
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.
/**
* 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.
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.