I'm trying to create a background process which monitors the phone state and displays a toast message if the state is changed. so far, ive implemented these, but when i install and run. It does nothing. It wont display anything. Im posting my codes here. pls help me out.
StateMonitor.java
`
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;
public class PhoneStateMonitor extends PhoneStateListener {
Context context;
public PhoneStateMonitor(Context context) {
super();
// TODO Auto-generated constructor stub
this.context=context;
}
//This Method Automatically called when changes is detected in Phone State
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber);
Toast.makeText(context, "Phone State - "+state+" Incoming Number - "+incomingNumber, Toast.LENGTH_LONG).show();//Giving the Message that Phone State Changed
//Checking The phone state
switch(state)
{
case TelephonyManager.CALL_STATE_IDLE: //Phone is in Idle State
Toast.makeText(context, "Phone State is IDLE", Toast.LENGTH_LONG).show();
break;
case TelephonyManager.CALL_STATE_RINGING: //Phone is Ringing
Toast.makeText(context, "Phone State is RINGING", Toast.LENGTH_LONG).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK: //Call is Received
Toast.makeText(context, "Call State is OFFHOOK",Toast.LENGTH_LONG).show();
break;
}
}
}
`
PhoneReceiver.java
`import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
//Automatically called when State Change is Detected because this Receiver is Registered for PHONE_STATE intent filter in AndroidManifest.xml
public class PhoneStateReceiver extends BroadcastReceiver {
TelephonyManager manager;
PhoneStateMonitor phoneStateListener;
static boolean isAlreadyListening=false;
//This Method automatically Executed when Phone State Change is Detected
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
phoneStateListener =new PhoneStateMonitor(context);//Creating the Object of Listener
manager=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);//Getting the Telephony Service Object
if(!isAlreadyListening)//Checking Listener is Not Registered with Telephony Services
{
manager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);//Registering the Listener with Telephony to listen the State Change
isAlreadyListening=true; //setting true to indicate that Listener is listening the Phone State
}
}
}
`
Android Manifest.xml
`<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pavan.phonecall"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- Permission for Reading Phone State -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<!-- If this app is not running then this will be automatically called when phone state change detected(Look at Intent Filter) -->
<receiver android:name=".PhoneStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>`
When i install from eclipse , it says apk installed. When i call my phone, Toast message doesnt pop up. where am i going wrong? please help! thanks!
When you install the app, it stays in stopped
state until you start the application with some UI control (i.e. Activity
). It became compulsory from Android 3.1 APIs (API 12).
So ultimately, you need at least one Activity
in your application apart from just BroadcastReceiver
to move your app out of that stopped
state. Otherwise it will not receive any broadcasts.
Reference: