2017-01-04 4 views
0

Я застрял в течение долгого времени и не могу его решить. Пожалуйста, помогите ... Я пытаюсь отправить sms программно с устройства Android. Я могу успешно отправлять с многих устройств, но не могу с некоторыми устройствами Samsung с двумя SIM-картами с уровнем авиалинии Android> = 22. Для уровня апи> = 22 я закодированы как,СМС, не отправляющий с некоторого двойного сим-устройства андроида программно

public static final String SMS_SENT_ACTION = "package.name.app.SMS_SENT_ACTION"; 

registerReceiver(new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     String message = null; 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       message = "Message Sent Successfully !"; 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       message = "Error."; 
       sendDefaultMessage(default_number, default_send_number, text); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       message = "Error: No service."; 
       sendDefaultMessage(default_number, default_send_number, text); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       message = "Error: Null PDU."; 
       sendDefaultMessage(default_number, default_send_number, text); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       message = "Error: Radio off."; 
       sendDefaultMessage(default_number, default_send_number, text); 
       break; 
     } 

     Toast.makeText(GetAppointment.this, message, Toast.LENGTH_LONG).show(); 

    } 
}, new IntentFilter(SMS_SENT_ACTION)); 


SmsManager.getSmsManagerForSubscriptionId(subscription_id).sendTextMessage(send_number, null, messageToSend, PendingIntent.getBroadcast(
        this, 0, new Intent(SMS_SENT_ACTION), 0), null); 

Там нет разрешения, связанные проблемы, потому что смс можно отправить с ASUS Dual Sim устройства и сони одном устройстве сим с уровнем апи> = 22.

Как я могу заставить его работать на всех устройствах? Мне нужна помощь.

+0

это будет полезно для вас http://stackoverflow.com/questions/27351936/how-to-send-a-sms-using-smsmanager-in-dual-sim -mobile – sasikumar

+0

Я следил за этим примером - SmsManager.getSmsManagerForSubscriptionId (int subscriptionId) .sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent); – Exigente05

ответ

0

Вам необходимо предоставить сервисный центр количество SIM вы хотите отправить SMS с в вашем sendTextMessage() в качестве второго параметра, как,

SmsManager smsManager = SmsManager.getDefault(); 
smsManager.sendTextMessage(phoneNumber, "+9198********", msg, null, null); 
+0

как я получу номер сервис-центра программным путем? – Exigente05

+0

Я позаботился об этом и нашел 'Telephony.TextBasedSmsColumns' https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html Надеюсь, что это поможет. –

+0

После использования номера сервисного центра он дает мне ошибку RESULT_ERROR_GENERIC_FAILURE, если я пытаюсь отправить sms из нестандартного сима. – Exigente05

0

Затем проверьте сим настройки, используя следующие функции:

public int getDefaultSimmm(Context context) { 

Object tm = context.getSystemService(Context.TELEPHONY_SERVICE); 
Method method_getDefaultSim; 
int defaultSimm = -1; 
try { 
    method_getDefaultSim = tm.getClass().getDeclaredMethod("getDefaultSim"); 
    method_getDefaultSim.setAccessible(true); 
    defaultSimm = (Integer) method_getDefaultSim.invoke(tm); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Method method_getSmsDefaultSim; 
int smsDefaultSim = -1; 
try { 
    method_getSmsDefaultSim = tm.getClass().getDeclaredMethod("getSmsDefaultSim"); 
    smsDefaultSim = (Integer) method_getSmsDefaultSim.invoke(tm); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
return smsDefaultSim; 
} 

Последующая функция отправить смс:

public boolean sendSMS(Context ctx, int simID, String toNum, String centerNum, String smsText, PendingIntent sentIntent, PendingIntent deliveryIntent) { 
    String name; 

    try { 
     if (simID == 0) { 
      name = "isms"; 
      // for model : "Philips T939" name = "isms0" 
     } else if (simID == 1) { 
      name = "isms2"; 
     } else { 
      throw new Exception("can not get service which for sim '" + simID + "', only 0,1 accepted as values"); 
     } 
     Method method = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", String.class); 
     method.setAccessible(true); 
     Object param = method.invoke(null, name); 

     method = Class.forName("com.android.internal.telephony.ISms$Stub").getDeclaredMethod("asInterface", IBinder.class); 
     method.setAccessible(true); 
     Object stubObj = method.invoke(null, param); 
     if (Build.VERSION.SDK_INT < 18) { 
      method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, PendingIntent.class, PendingIntent.class); 
      method.invoke(stubObj, toNum, centerNum, smsText, sentIntent, deliveryIntent); 
     } else { 
      method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, String.class, PendingIntent.class, PendingIntent.class); 
      method.invoke(stubObj, ctx.getPackageName(), toNum, centerNum, smsText, sentIntent, deliveryIntent); 
     } 

     return true; 
    } catch (ClassNotFoundException e) { 
     Log.e("apipas", "ClassNotFoundException:" + e.getMessage()); 
    } catch (NoSuchMethodException e) { 
     Log.e("apipas", "NoSuchMethodException:" + e.getMessage()); 
    } catch (InvocationTargetException e) { 
     Log.e("apipas", "InvocationTargetException:" + e.getMessage()); 
    } catch (IllegalAccessException e) { 
     Log.e("apipas", "IllegalAccessException:" + e.getMessage()); 
    } catch (Exception e) { 
     Log.e("apipas", "Exception:" + e.getMessage()); 
    } 
    return false; 
} 

Я надеюсь, что это поможет вам

Смежные вопросы