Bonjour,
Je souhaite développer une Application Android permettant d'envoyer un SMS d'absence en cas d'appel téléphonique ou de SMS reçu. En cas de réception d'un SMS, un SMS d'absence est automatiquement envoyé. En revanche, en cas d'appel téléphonique cela ne marche pas.
Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
 
		super.onStart(intent, startId);
 
		this.startId = startId;
 
		// Only load extras if intent exists (wasn't recycled)
		if (intent != null)
		{
			Bundle infoBundle = intent.getExtras();
 
			setSilentStatus(infoBundle.getBoolean("extraSilentStatus"));
			setCallText(infoBundle.getInt("extraCallText"));
			setLogStatus(infoBundle.getBoolean("extraLogStatus"));
			setMessageContent(infoBundle.getString("extraMessage"));
			setInformStatus(infoBundle.getBoolean("extraInformStatus"));
			setDelayDuration(infoBundle.getInt("extraDelay"));
			setRepeatStatus(infoBundle.getBoolean("extraRepeatStatus"));
			setFilterStatus(infoBundle.getInt("extraFilterStatus"));
		}
 
		// Initializations
		pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
		wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Auto-Away");
 
        sentPI = PendingIntent.getBroadcast(this, 0, new Intent("android.provider.Telephony.SMS_SENT"), 0);
		aManager = (AudioManager)getBaseContext().getSystemService(Context.AUDIO_SERVICE);
 
		if(getSilentStatus())
			aManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
 
		setPhoneCall(false);
		setFile(getFilterStatus());
		setNotifyCount(0);
		createNotification();
 
		if (getFilterStatus() != 0)
			grabNumbers(getFile());
 
		if(getLogStatus())
			loadLog(logFile);
 
		// Create SMS Broadcast Receiver if Texting is Enabled
		if(getCallText() != CALL_ONLY)
		{
			smsReceiver = new BroadcastReceiver()
			{
				@SuppressLint({ "NewApi", "NewApi" })
				@Override
				public void onReceive(Context context, Intent intent)
				{
					Bundle bundle = intent.getExtras();
					SmsMessage[] msgs = null;
 
					if(null != bundle)
					{
						setReturnAddress(null);
						Object[] pdus = (Object[]) bundle.get("pdus");
						msgs = new SmsMessage[pdus.length];
 
						for (int i = 0; i < msgs.length; i++)
						{
							msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
							setReturnAddress(msgs[i].getOriginatingAddress());
						}
 
						Log.i(TAG, "Text Message has been received from: " + hyphenate(getReturnAddress()));
						initTextSend();
					}
				}
			};
			registerReceiver(smsReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
		}
 
        resend = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent) 
            {
            	// Resending here WILL DRAIN battery if error is persistent (NO DATA in a Gym Locker etc)
                switch (getResultCode())
                {
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    	Log.e(TAG, "Text did NOT send (GENERIC_FAILURE)");
                    	Log.i(TAG, "Attempting to resend");
                    	sendSms();
                    break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                    	Log.e(TAG, "Text did NOT send (NO_SERVICE)");
                    	if(noServiceResendAttempts > 5)
                    	{
                    		Log.i(TAG, "Attempting resend: " + (noServiceResendAttempts++));
                    		sendSms();
                    	}
                    	else
                    	{
                    		createNotificationFromString(getResources().getString(R.string.error_no_service));
                    		noServiceResendAttempts = 0;
                    	}
                    break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                    	Log.e(TAG, "Text did NOT send (RADIO_OFF)");
                    	createNotificationFromString(getResources().getString(R.string.error_radio_off));
                    break;
                }
            }
        };
        registerReceiver(resend, new IntentFilter("android.provider.Telephony.SMS_SENT"));
 
        // Create PhoneStateListener (If Calls are Selected)
        if(getCallText() != TEXT_ONLY)
 
        smsCallReceiver = new BroadcastReceiver()
        {
		@Override
		public void onReceive(Context context, Intent intent)
		{
			{
	        TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
	        PhoneStateListener listener = new PhoneStateListener()
	        {
	        	@Override
	        	public void onCallStateChanged(int state, String incomingNumber)
	        	{
	        		switch(state)
	        		{
		        		case TelephonyManager.CALL_STATE_IDLE:
		        			Log.d(TAG, "Phone: Idle");
		        		break;
		        		case TelephonyManager.CALL_STATE_RINGING:
		        			Log.d(TAG, "Phone: Ringing.");
 
		        			setReturnAddress(incomingNumber);
		        			setPhoneCall(true);
 
		        			Handler handler = new Handler();
		        			Runnable runnable = new Runnable()
		        			{
		        				public void run()
		        				{
			        				initTextSend();
		        				}
		        			};
 
		        			handler.removeCallbacks(runnable);
		        			Log.i(TAG, "Incoming call from: " + getReturnAddress());
		        			handler.postDelayed(runnable, (long)1000);
		        		break;
		        		case TelephonyManager.CALL_STATE_OFFHOOK:
		        			Log.d(TAG, "Phone: Off Hook");
		        		break;
	        		}
	        	}
	        };
	        tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
			}
			String savedNumber;
			savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
			setReturnAddress(savedNumber);
		}
        };
        registerReceiver(smsCallReceiver, new IntentFilter("android.intent.action.NEW_OUTGOING_CALL"));
	}
qui déclenche celui-ci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
	@SuppressLint({ "NewApi", "NewApi" })
	private void initTextSend()
	{
		if (noRepetition() && notListed())
		{
			// Add address to list of "Already Notified"
			addresses.add(getReturnAddress());
 
			int phoneOffset = 0;
 
			// Add 30 Second Call Padding
			if (getPhoneCall() && (getDelayDuration() < 30))
				phoneOffset = 30;
 
			Handler tHandler = new Handler();
			Runnable tGo = new Runnable()
			{
				public void run()
				{
					// If logging is enabled, log address
					if(getLogStatus())
						logAddress();
 
					// Create Notification
					createNotification();
 
					// No longer important
					setPhoneCall(false);
 
					// Send Text Message
					sendSms();
				}
			};
			tHandler.removeCallbacks(tGo);
			Log.i(TAG, "Timer set, waiting " + (getDelayDuration() + phoneOffset) + "s");
			tHandler.postDelayed(tGo, (long)(1000 * (getDelayDuration() + phoneOffset)));
		}
	}
 
	@SuppressLint({ "NewApi", "NewApi", "NewApi" })
	private void sendSms()
	{
		SmsManager manager = SmsManager.getDefault();
 
		wakeLock.acquire();
		Log.d(TAG, "Wake Lock Acquired!");
 
		if (getMessageContent(getInformStatus()).length() > 160)
		{
			ArrayList<String> messagelist = manager.divideMessage(getMessageContent(getInformStatus()));
 
			manager.sendMultipartTextMessage(getReturnAddress(), null, messagelist, null, null);
			Log.i(TAG, "Multipart Text Message Sent!");
		}
		else
		{
			manager.sendTextMessage(getReturnAddress(), null, getMessageContent(getInformStatus()), sentPI, null);
			Log.i(TAG, "Text Message Sent!");
		}
 
		wakeLock.release();
		Log.d(TAG, "Wake Lock Released!");
	}
D'avance merci pour votre aide