2011-06-15 32 views
9

Vengo del desarrollo de iphone donde no puedes enviar un SMS en segundo plano sin pedirle al usuario que confirme el envío. ¿Se pueden enviar sms en segundo plano en Android para que no se necesite intervención del usuario?¿Cómo puedo enviar mensajes SMS en el ANTECEDENTES usando Android?

+4

Mira lo que uno http://stackoverflow.com/questions/5671564/how-to-send-sms-message-on-android-device-in-the-background – sealz

Respuesta

16

Enviar SMS con la notificación de entrega de SMS como tostado.

método llamar como abajo.

sendSMS("98********","This is test message"); 

firma del método como abajo.

/* 
* BroadcastReceiver mBrSend; BroadcastReceiver mBrReceive; 
*/ 
private void sendSMS(String phoneNumber, String message) { 
    ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>(); 
    ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>(); 
    PendingIntent sentPI = PendingIntent.getBroadcast(mContext, 0, 
      new Intent(mContext, SmsSentReceiver.class), 0); 
    PendingIntent deliveredPI = PendingIntent.getBroadcast(mContext, 0, 
      new Intent(mContext, SmsDeliveredReceiver.class), 0); 
    try { 
     SmsManager sms = SmsManager.getDefault(); 
     ArrayList<String> mSMSMessage = sms.divideMessage(message); 
     for (int i = 0; i < mSMSMessage.size(); i++) { 
      sentPendingIntents.add(i, sentPI); 
      deliveredPendingIntents.add(i, deliveredPI); 
     } 
     sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage, 
       sentPendingIntents, deliveredPendingIntents); 

    } catch (Exception e) { 

     e.printStackTrace(); 
     Toast.makeText(getBaseContext(), "SMS sending failed...",Toast.LENGTH_SHORT).show(); 
    } 

} 

Ahora dos clases más SmsDeliveredReceiver, SmsSentReceiver como a continuación.

public class SmsDeliveredReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent arg1) { 
    switch (getResultCode()) { 
    case Activity.RESULT_OK: 
     Toast.makeText(context, "SMS delivered", Toast.LENGTH_SHORT).show(); 
     break; 
    case Activity.RESULT_CANCELED: 
     Toast.makeText(context, "SMS not delivered", Toast.LENGTH_SHORT).show(); 
     break; 
    } 
} 

}

Ahora SMSSentReceiver.

public class SmsSentReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent arg1) { 
    switch (getResultCode()) { 
    case Activity.RESULT_OK: 
     Toast.makeText(context, "SMS Sent", Toast.LENGTH_SHORT).show(); 

     break; 
    case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
     Toast.makeText(context, "SMS generic failure", Toast.LENGTH_SHORT) 
       .show(); 

     break; 
    case SmsManager.RESULT_ERROR_NO_SERVICE: 
     Toast.makeText(context, "SMS no service", Toast.LENGTH_SHORT) 
       .show(); 

     break; 
    case SmsManager.RESULT_ERROR_NULL_PDU: 
     Toast.makeText(context, "SMS null PDU", Toast.LENGTH_SHORT).show(); 
     break; 
    case SmsManager.RESULT_ERROR_RADIO_OFF: 
     Toast.makeText(context, "SMS radio off", Toast.LENGTH_SHORT).show(); 
     break; 
    } 
} 

}

ahora Permisos de abrir su AndroidManifest.xml y añadir debajo de la línea

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

y su hecho .......

+0

¿Cuál es el filtro de intención para estos receptores de difusión en manifiesto? – Saty

+0

@sandy lo he intentado, pero no es el trabajo –

+0

@Saty Aquí están los receptores de difusión para enviar sms. Puede definirlo en su archivo de manifiesto. – GrIsHu

2
+0

Gracias por el enlace. Pero el artículo no explicaba si podía enviar los sms en segundo plano – Zubair

+0

Puede usar esa lógica de un 'Servicio' o' BroadcastReceiver' que es el fondo de manera efectiva (a menos que tenga una idea diferente de fondo). Si dices más sobre específicamente lo que estás tratando de hacer? – Femi

+0

¿Quiere decir que podemos copiar el código de las clases de BroadcastReceiver o Service? – Zubair

16

Sí, tú también puedes.

SmsManager sm = SmsManager.getDefault(); 
sm.sendTextMessage(number, null, message, null, null); 
+0

¿Has probado esto? ¿Funciona desde el fondo? – Zubair

+2

@Zubair Nunca lo he intentado personalmente, otros lo han hecho y funciona. el enlace que envié en su pregunta comenta que funcionó. – sealz

+0

No olvide esto en el manifiesto:

0

mejor respuesta es buena, pero por encima de API nivel 23 necesitarás obtener el permiso pragmáticamente. De lo contrario, se solicitará permiso cada vez.

private static final int PERMISSION_REQUEST_CODE = 1; 

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 

    if (checkSelfPermission(Manifest.permission.SEND_SMS) 
      == PackageManager.PERMISSION_DENIED) { 

     Log.d("permission", "permission denied to SEND_SMS - requesting it"); 
     String[] permissions = {Manifest.permission.SEND_SMS}; 

     requestPermissions(permissions, PERMISSION_REQUEST_CODE); 

    } 
} 
Cuestiones relacionadas