Italian SMS senza conferma di recapito

AlpVir

Well-Known Member
Licensed User
Longtime User
I seguenti 3 spezzoni di codice inviano un SMS ma - ahimè - addebitando al destinatario ANCHE il costo del cosiddetto "rapporto di consegna" (SMS delivery reports); in totale 0.15+0.19 euro. Questo ANCHE se il destinatario ha un piano telefonico che prevede centinaia di SMS gratuiti. E ANCHE se il destinatario ha provveduto a deselezionare il checkbox che compare in Messaggi - Menu - Impostazioni - Messaggi di testo (SMS) - Conferme di recapito (Richiedi conferma di recapito per ogni messaggio inviato).

B4X:
Dim Sms1 As PhoneSms
Sms1.Send(numtel,txtSMS)

B4X:
Dim Sms1 As PhoneSms
Sms1.Send2(numtel,txtSMS,false,false)

B4X:
Sub SendSms(PhoneNumber As String, Text As String)
    Dim ps As PhoneSms
    Dim r As Reflector
    r.Target = r.RunStaticMethod("android.telephony.SmsManager", "getDefault", Null, Null)
    r.RunMethod4("sendTextMessage", Array As Object(PhoneNumber, Null, Text, Null, Null), _
      Array As String("java.lang.String", "java.lang.String", "java.lang.String", _
         "android.app.PendingIntent", "android.app.PendingIntent"))
End Sub

C'è un modo per prevenire questi inutili costi per il destinatario dell'SMS ?
Grazie per l'attenzione.
 

Star-Dust

Expert
Licensed User
Longtime User
Solitamente questo é sufficiente

B4X:
Dim Sms1 As PhoneSms
Sms1.Send2(numtel,txtSMS,false,false)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Purtroppo così non è !!!
Quali altre modi di spedire un SMS potrei utilizzare ?
Ho utilizzato anche una sub SendLargeSms, senza successo.
Non sarà che non ho utilizzato correttamente altre parti di codice (ad esempio qualcosa come Sub PE_SmsDelivered (PhoneNumber As String, Intent As Intent) oppure che
Sms1 deve essere dichiarato in altro ambito, oppure ....
 

Star-Dust

Expert
Licensed User
Longtime User
Mi spiace, ma non mi é mai successo. A me funziona benissimo.
Chiedi nel forum inglese. Forse é un problema del firmware del dispositivo. Che usi per fare i test?
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Io uso Asus Zenfone 2 ma altri 2 utenti della mia app (in fase di alpha test) lamentano lo stesso inconveniente; al momento non so cosa utilizzino nè quale operatore abbiano.
Per tagliare la testa al toro non hai un progettino piccolo piccolo che sicuramente con te funziona ?
Se da me non funziona le cause possono essere solo due: il firmware o l'operatore.
 

Star-Dust

Expert
Licensed User
Longtime User
Anche io uso Asus Zenfone 2 - ZE551ML

Io in un mio vecchio programma oramai tolto da Play Store usavo questa Sub
B4X:
Sub MandaSms(PhoneNumber As String, Testo As String)
    Dim S As PhoneSms
  
    If Testo<>"" Then S.Send2(PhoneNumber,Testo,False,False)
End Sub

Non credo ti sia stato di aiuto.

Prova a mandare un sms nel tuo sesso smarthphone e vedi che tariffe spendi
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Stesso identicissimo modello.
Stessa identica sub con i 2 "False", ma non è che ci fosse altro codice o altro tipo di dichiarazione o qualcosa nel manifest o ....
Il problema non è la tariffa del singolo SMS quanto il fatto che si spedisce 1 SMS e gli altri ne ricevono 2; ed l'utente ne paga 2 (0.15 che credo sia la tariffa della conferma e 0.19 che è la tariffa di un normal SMS, anche se hanno tariffe - per così dire - flat).
Non riesci ad estrapolare dal tuo progetto qualcosa di realmente funzionante ?
L'operatore telefonici centrerà in qualcosa ?
 

Star-Dust

Expert
Licensed User
Longtime User
Ma funziona realmente.
Il problema sarà nel codice che invia il messaggio.

Posta quella parte di codice, magari possiamo vedere se c'è un errore
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho già postato nel mio primo post (!) 4 diversi modi con cui ho spedito un SMS. Tutti indistintamente hanno avuto successo, fin troppo, perchè in realtà hanno spedito 2 SMS, con i relativi costi.
Non serve, credo, a nulla tuttavia riporto qui di sotto - pari pari - la parte del codice interessato.

B4X:
    '==================== SMS ========================================================
    '--- spedisco gli SMS   
    DateTime.DateFormat="HH:mm:ss"
    rs=Main.dbContatti.ExecQuery (CriterioSMS)
    If rs.RowCount>0 Then
        For i=0 To rs.RowCount-1
            rs.Position=i
            nom=rs.GetString("Contatto")
            numtel=rs.GetString("Telefono")
            'PE.InitializeWithPhoneState("PE", PhoneID)
            Try
                Dim Sms1 As PhoneSms
                'Sms1.Send(numtel,txtSMS)
                Sms1.Send2(numtel,txtSMS, False,False)
                'SendLargeSms(numtel,txtSMS)
                'SendSms(numtel,txtSMS)
               
                Log("SPEDISCO SMS a " & nom & "  " & numtel)
                If Main.FlagFineApp=False Then
                    Criterio = "UPDATE TabContatti SET Spe2=1 WHERE Telefono='" & numtel & "'"
                Else
                    Criterio = "UPDATE TabContatti SET Fin2=1 WHERE Telefono='" & numtel & "'"
                End If        
                Log("criterio di aggiornamento SMS " & Criterio)
                Main.dbContatti.ExecNonQuery(Criterio) 
                Main.strTxtLog=Main.strTxtLog&CRLF&"{V}" & DateTime.date(DateTime.Now) & " - SMS inviato a " & nom & " (" & numtel & "){V}"
            Catch
                Log("Non c'è al momento alcuna routine di errore di invio di SMS")
                '--- faccio in questo modo un po' barbaro
                Criterio = "UPDATE TabContatti SET Spe2=0 WHERE Telefono='" & numtel & "'"
                Main.dbContatti.ExecNonQuery(Criterio)
                Main.strTxtLog=Main.strTxtLog&CRLF&"{R}" & DateTime.date(DateTime.Now) & " - ERRORE INVIO SMS A " & nom & "{R}"
            End Try    
            CallSub(Main,"VisualizzaElementiAttuali2")
            Main.strTxtLog=Main.strTxtLog&CRLF&"{N}" & DateTime.date(DateTime.Now) & " - Attesa eventuale invio prossimo SMS{N}"
            CallSub(Main,"VisualizzaElementiAttuali2")
            '--- attendo 5 secondi prima di inviare un altro SMS
            Dim Adesso        As Long
            Dim T            As Long
            Sleep(0)
            Adesso=DateTime.Now
            Do Until T>(Adesso+5000)
                T=DateTime.Now
                Sleep(0)
            Loop
        Next
    End If
    rs.Close
 

Star-Dust

Expert
Licensed User
Longtime User
ma non puoi sostituire questo:

B4X:
            Sleep(0)
            Adesso=DateTime.Now
            Do Until T>(Adesso+5000)
                T=DateTime.Now
                Sleep(0)
            Loop
con questo ?
B4X:
Sleep(5000)
 

Star-Dust

Expert
Licensed User
Longtime User
Non credo che l'errore possa essere sul metodo con cui mandi l'sms
Se c'è un errore potrebbe essere sull'algoritmo che manda l'sms
Ad esempio nel mio programma che ti citavo mandava un sms a orario. In un certo hh:mm:ss il servizio si attivava e inviava sms.
Ma il servizio era cosi veloce che in quel secondo inviava più volte l'sms. Ho messo una variabile boolean in cui salvavo se il messaggio era stato inviato e il problema fu risolto.

Adesso in quello che hai inviato tu non vedo nulla di simile.
Ma potrebbe essere sempre un problema del dispositivo che invia, che per qualche ragione invia 2 volte.

Io ti suggerisco ancora di scrivere sul forum internazionale
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Molto probabilmente si. E' un residuo (un copia e incolla) di una parte di codice realizzata quando l'istruzione Sleep non c'era ancora.
Ma non cambia nulla inserire o meno questa attesa di 5 secondi.
 

Star-Dust

Expert
Licensed User
Longtime User
Molto probabilmente si. E' un residuo (un copia e incolla) di una parte di codice realizzata quando l'istruzione Sleep non c'era ancora.
Ma non cambia nulla inserire o meno questa attesa di 5 secondi.
Bei ricordi il DoEvents :p
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho già scritto al forum internazionale. Per ora nessuna buona nuova.
Non si tratta di ricevere 2 SMS uguali spediti per errore ma di ricevere un SMS più la "conferma di ricezione". Difatti si visualizzano questi 2 SMS in una medesima videata con due riquadri, uno di colore verdino ed uno di colore bianco. E si pagano entrambi.
Ripeto: è uno solo l'SMS che viene spedito (almeno in queste prove)
 

Star-Dust

Expert
Licensed User
Longtime User
Questo potrebbe dipendere dal fatto che il ricevente, riceva due volte lo stesso sms per un errore del carrier (gestore)
Cmq visto che sono false entrambi non dovrebbe succedere in ogni caso.

Hai visto se hai impedito dei permessi particolari sull'Asus? Hai installato l'aggiornamento a Android 6.0?
 

AlpVir

Well-Known Member
Licensed User
Longtime User
E' un bel mistero.
Come vedi dallo screenshot allegato il messaggio è ripetuto: verde l'originale e grigio la "conferma di ricezione".
Almeno questo è quello che comprendo io.
Nota anche il segno di spunta a sinistra delle ore 08:31.
Dopo qualche minuto l'app MyTim Mobile mi segnala un doppio addebito (0.15+0.19 euro).
 

Attachments

  • Screenshot_2017-11-09-08-35-43.jpg
    Screenshot_2017-11-09-08-35-43.jpg
    105.6 KB · Views: 224

udg

Expert
Licensed User
Longtime User
In effetti sembra che il primo dei due sia il normale messaggio in uscita, mentre il secondo sia la conferma oppure una copia per te di ciò che è stato inviato.
LA differenza di importi farebbe propendere per la prima ipotesi.

Hai provato ad utilizzare il codice del LargeSMS ponendo a null il parametro relativo ad "android.app.PendingIntent" ? giusto per vedere se fa differenza..
 

Star-Dust

Expert
Licensed User
Longtime User
Al post#9 nel codice vedo il LargeSMS come nota, come messo e tolto successivamente, penso abbia provato
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ecco il codice che uso io, oramai avrò mandato migliaia e migliaia di SMS e non ho mai avuto problemi della ricevuta di ritorno, il dubbio che mi viene è (giustamente come ti hanno detto anche gli altri) che ci sia qualche altra cosa, comunque provalo lo stesso

B4X:
Sub SendLargeSms(Destination As String, Message As String)

  Dim r As Reflector
  r.Target = r.RunStaticMethod("android.telephony.SmsManager", "getDefault", Null, Null)
  Dim parts As Object
  parts = r.RunMethod2("divideMessage", Message, "java.lang.String")
  r.RunMethod4("sendMultipartTextMessage", _
  Array As Object(Destination, Null, parts, Null, Null), _
  Array As String("java.lang.String", "java.lang.String", _
  "java.util.ArrayList", "java.util.ArrayList", "java.util.ArrayList"))

End Sub
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
Risolto !
Ho mantenuto le due sempici istruzioni
B4X:
Dim Sms1 As PhoneSms
Sms1.Send2(numtel,txtSMS, False,False)
ed ho eliminato altre sub quali
SendSms(PhoneNumber As String, Text As String)
SendLargeSms(Destination As String, Message As String)
PE_SmsDelivered (PhoneNumber As String, Intent As Intent)
PE_SmsSentStatus(Success As Boolean, ErrorMessage As String, PhoneNumber As String, Intent As Intent)
che evidentemente interferivano in qualche modo, non so quale.
 
Top