Autore Topic: Inviare un sms da intent  (Letto 971 volte)

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Inviare un sms da intent
« il: 17 Luglio 2011, 12:08:54 CEST »
0
ciao, ho un piccolo problema con un intent.
Devo fare in modo che invii un sms in automatico senza però aspettare che l'utente lo invii.

Ho scritto questo:

Codice (Java): [Seleziona]
 Uri smsUri = Uri.parse("tel:123456");
            Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
            intent.putExtra("sms_body", "testo");
            intent.setType("vnd.android-dir/mms-sms");
 
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

solo che in questo caso si avvia l'applicazione sms e aspetta la pressione del tasto invia.

Come posso fare in modo che venga inviato subito?

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Inviare un sms da intent
« Risposta #1 il: 17 Luglio 2011, 13:55:32 CEST »
0

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Inviare un sms da intent
« Risposta #2 il: 17 Luglio 2011, 14:38:43 CEST »
0
ok, ma come faccio a metterlo dentro ad un Intent?
PendingIntent mi richiede come 3° argomento un Intent.

Io sto praticamente crendo un widget che alla pressione di un bottone invia in autometico un SMS, cercando in giro ho visto che l'unico modo per gestire il click sui pulsanti è tramite un PendingIntent, c'è magari un modo più semplice?

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Inviare un sms da intent
« Risposta #3 il: 17 Luglio 2011, 14:50:58 CEST »
0
Usa un Service. Crei un intent con gli extra (numero e testo), il pending intent chiama il service (getService()), il Service estrapola gli extra e tramite SmsManager invia il messaggio.

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Inviare un sms da intent
« Risposta #4 il: 17 Luglio 2011, 15:24:08 CEST »
0
ok grazie, ho provato ma ho alcuni problemi, praticamente crasha all'avvio...
Questo è il mio codice:

Questa è la mia Main Activity
Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget_layout);
    }
   
}

Questo è il mio Provider con il Service
Codice (Java): [Seleziona]
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.SmsManager;
import android.widget.Toast;

public class MioProvider extends AppWidgetProvider {

        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
               
                Intent updateIntent = new Intent(context, inviaSMS.class);
                updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
                updateIntent.putExtra("Numero", "1234");
                updateIntent.putExtra("Messaggio", "qwerty");
                context.startService(updateIntent);
               
       
        }
}
       
        public static class inviaSMS extends Service{
               
                public int onStartCommand(Intent intent, int flags, int startId){
                       
                        Bundle extra = intent.getExtras();
                        if(extra!=null){
                               
                                int idWidget = extra.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
                                String numero = extra.getString("numero");
                                String messaggio = extra.getString("messaggio");
                               
                                SmsManager smsManager = SmsManager.getDefault();
                               
                                smsManager.sendTextMessage(numero, null, messaggio, null, null);
                               
                                Toast.makeText(this, "Inviato", Toast.LENGTH_LONG);
                        }
                        return Service.START_STICKY;
                }

                @Override
                public IBinder onBind(Intent intent) {                 
                        return null;
                }
               
        }
           
}

Questo il Manifest (e credo che i casini siano qui dentro):
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.italiandevteam.creditotim"
     android:versionCode="1"
     android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name="MioProvider">
                        <intent-filter>
                                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                        </intent-filter>
                        <meta-data android:name="android.appwidget.provider"
                                android:resource="@xml/widget_info" />
                </receiver>
                <service android:name="MioProvider$inviaSMS"></service>
    </application>
    <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
        <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>

e questo il logcat:
Codice: [Seleziona]
07-17 15:17:40.604: ERROR/AndroidRuntime(16212): FATAL EXCEPTION: main
07-17 15:17:40.604: ERROR/AndroidRuntime(16212): java.lang.RuntimeException: Unable to start service com.italiandevteam.creditotim.MioProvider$inviaSMS@405204c0 with Intent { cmp=com.italiandevteam.creditotim/.CreditoTimProvider$inviaSMS (has extras) }: java.lang.IllegalArgumentException: Invalid destinationAddress
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2338)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.app.ActivityThread.access$2800(ActivityThread.java:132)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1106)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.os.Looper.loop(Looper.java:143)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.app.ActivityThread.main(ActivityThread.java:4196)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at java.lang.reflect.Method.invokeNative(Native Method)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at java.lang.reflect.Method.invoke(Method.java:507)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at dalvik.system.NativeStart.main(Native Method)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212): Caused by: java.lang.IllegalArgumentException: Invalid destinationAddress
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.telephony.SmsManager.sendTextMessage(SmsManager.java:175)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.telephony.SmsManager.sendTextMessage(SmsManager.java:107)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at com.italiandevteam.creditotim.MioProvider$inviaSMS.onStartCommand(CreditoTimProvider.java:63)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2321)
07-17 15:17:40.604: ERROR/AndroidRuntime(16212):     ... 10 more
07-17 15:17:40.654: WARN/dalvikvm(1450): disableGcForExternalAlloc: false
07-17 15:17:40.664: WARN/dalvikvm(1450): disableGcForExternalAlloc: false
07-17 15:17:42.165: DEBUG/DEBUG(1450): updateCellLayoutCache(3.5555556, 3.5607476)
07-17 15:17:43.757: DEBUG/StatusBarPolicy(1401): onSignalStrengthsChanged
07-17 15:17:48.832: DEBUG/dalvikvm(11150): GC_EXPLICIT freed 84K, 46% free 3670K/6727K, external 0K/0K, paused 59ms
07-17 15:17:53.857: DEBUG/dalvikvm(15137): GC_EXPLICIT freed 51K, 57% free 3341K/7623K, external 770K/1282K, paused 83ms
07-17 15:17:55.759: DEBUG/StatusBarPolicy(1401): onSignalStrengthsChanged
07-17 15:17:56.640: DEBUG/lights(1322): set_light_buttons_func: on=5329233 brightness=81
07-17 15:17:56.640: DEBUG/lights(1322): set_light_buttons_func: on=16777215 brightness=255
07-17 15:17:58.762: DEBUG/StatusBarPolicy(1401): onSignalStrengthsChanged
07-17 15:18:00.593: WARN/ActivityManager(1322): Timeout executing service: ServiceRecord{40d04b58 com.italiandevteam.creditotim/.MioProvider$inviaSMS}
07-17 15:18:00.643: INFO/ActivityManager(1322): Crashing app skipping ANR: ProcessRecord{40b30128 16212:com.italiandevteam.creditotim/10128} Executing service com.italiandevteam.creditotim/.CreditoTimProvider$inviaSMS
07-17 15:18:03.656: INFO/power(1322): *** set_screen_state 0
07-17 15:18:03.656: DEBUG/PowerManagerService(1322): setScreenStateLocked++, on: false, err: 0
07-17 15:18:03.656: DEBUG/SensorService(1322): noteStopSensor: uid = 0x3e8, handle = 0x4
07-17 15:18:03.656: DEBUG/PowerManagerService(1322): setScreenStateLocked, turn off the button light
07-17 15:18:03.666: DEBUG/lights(1322): set_light_buttons_func: on=0 brightness=0
07-17 15:18:03.666: VERBOSE/KeyguardViewMediator(1322): password timeout delay 269956ms
07-17 15:18:03.676: DEBUG/KeyguardViewManager(1322): show(); mKeyguardView==com.android.internal.policy.impl.LockPatternKeyguardView@40552538
07-17 15:18:03.676: DEBUG/HtcLockScreen(1322): createPatternUnlockScreen() ...
07-17 15:18:03.676: DEBUG/HtcLockScreen(1322): packageInfo - PackageInfo{40cb63d8 com.htc.lockscreen}
07-17 15:18:03.686: DEBUG/HtcLockScreen(1322): other exception - com.htc.lockscreen.HtcPatternUnlockScreen
07-17 15:18:03.696: INFO/[POST_RESELECT](1450): [spanChange] (o, oldStart, newStart, oldEnd, newEnd)=(android.text.Selection$START@401092a8,-1,0,-1,0)
07-17 15:18:03.696: INFO/[POST_RESELECT](1450): [spanChange] (o, oldStart, newStart, oldEnd, newEnd)=(android.text.Selection$END@40119c38,-1,0,-1,0)
07-17 15:18:03.746: DEBUG/AlarmManager(1322): ACTION_SCREEN_OFF
07-17 15:18:03.756: WARN/InputManagerService(1322): Receive : Intent.ACTION_SCREEN_OFF
07-17 15:18:03.756: WARN/InputManagerService(1322): Disable input method client.
07-17 15:18:03.766: DEBUG/UsbnetService(1322): BroadcastReceiver::onReceive+
07-17 15:18:03.776: DEBUG/UsbnetService(1322): onReceive SCREEN_OFF
07-17 15:18:03.786: DEBUG/ContactMessageStore(1433): start background delete task...
07-17 15:18:03.796: DEBUG/SurfaceFlinger(1322): About to give-up screen, flinger = 0x15f278
07-17 15:18:03.817: DEBUG/HtcLockScreen2.0(1322): HtcLockScreen: onScreenRestart
07-17 15:18:03.847: DEBUG/Background traffic light(1450): traffic light: GREEN, mBackgroundTrafficLight = true
07-17 15:18:03.847: ERROR/HtcLockScreen2.0(1322): MusicCtrl: updateImage~ exception:null
07-17 15:18:03.847: WARN/System.err(1322): java.lang.NullPointerException
07-17 15:18:03.847: WARN/System.err(1322):     at com.htc.lockscreen.MusicCtrl.updateImage(MusicCtrl.java:279)
07-17 15:18:03.847: WARN/System.err(1322):     at com.htc.lockscreen.MusicCtrl.access$100(MusicCtrl.java:24)
07-17 15:18:03.847: WARN/System.err(1322):     at com.htc.lockscreen.MusicCtrl$2.onServiceConnected(MusicCtrl.java:152)
07-17 15:18:03.847: WARN/System.err(1322):     at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1098)
07-17 15:18:03.847: WARN/System.err(1322):     at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1115)
07-17 15:18:03.847: WARN/System.err(1322):     at android.os.Handler.handleCallback(Handler.java:587)
07-17 15:18:03.847: WARN/System.err(1322):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-17 15:18:03.847: WARN/System.err(1322):     at android.os.Looper.loop(Looper.java:143)
07-17 15:18:03.847: WARN/System.err(1322):     at com.android.server.ServerThread.run(SystemServer.java:718)

EDIT:
Problema risolto, avevo sbagliato con delle lettere minuscole/maiuscole
Ora funziona ;)
Grazie mille per i suggerimenti!
« Ultima modifica: 17 Luglio 2011, 15:26:10 CEST da ultimoprofeta »

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Inviare un sms da intent
« Risposta #5 il: 17 Luglio 2011, 15:38:46 CEST »
0
Scusate il doppio post ma ho trovato un nuovo problema...

La mia idea era quella di associare al widget un bottone che mi permettesse di inviare un sms quando viene premuto, purtroppo con il codice postato sopra l'sms viene inviato solo al momento in cui il widget viene aggiunto in home mentre non succede nulla quando premo il bottone...sapete aiutarmi a sistemare il codice?
« Ultima modifica: 17 Luglio 2011, 15:40:40 CEST da ultimoprofeta »

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Inviare un sms da intent
« Risposta #6 il: 17 Luglio 2011, 15:49:45 CEST »
0
Invece di fare :
Codice (Java): [Seleziona]
context.startService(updateIntent);
Usa:
Codice (Java): [Seleziona]
PendingIntent pendingIntent = PendingIntent.getService(context, 0, updateIntent, 0);
E associalo sul clic alla RemoteViews con :
Codice (Java): [Seleziona]
remoteViews.setOnClickPendingIntent(R.id.id_del_tuo_button, pendingIntent);

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Inviare un sms da intent
« Risposta #7 il: 17 Luglio 2011, 17:05:19 CEST »
0
ho inserito al posto di:
Codice (Java): [Seleziona]
context.startService(updateIntent);
questo:
Codice (Java): [Seleziona]
PendingIntent pendingIntent = PendingIntent.getService(context, 0, updateIntent, 0);
RemoteViews rv = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
rv.setOnClickPendingIntent(R.id.button, pendingIntent);

solo che adesso non parte più l'sms...cosa ho sbagliato?

EDIT:
Avevo dimenticato di aggiornare la RemoteViews con:

Codice (Java): [Seleziona]
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
« Ultima modifica: 18 Luglio 2011, 15:09:13 CEST da ultimoprofeta »