Search code examples
androidandroid-broadcast

Receiving the Broadcast


I want to make a application that gets the incoming calling number if the call is from a specific number then do some stuff . I want to get the incoming calling number even when the application is not running .. I am using the BraodcastReceiver to get the incoming number .

I have two java class one which extends he activity and the other extends the BraodcastReceiver for getting the incoming calling number .

Main class which extends activity :

package digicare.ringmanager;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class Main_Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_layout, menu);
        return true;
    }
}

it is pretty simple and the Number checker class which extends the BroadcastReceiver :

package digicare.ringmanager;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;

public class number_checker extends BroadcastReceiver {
    private int ringer_mode ;
    private String AM_str;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        AudioManager AM =(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
        Log.w("start", "starting the Main_Activity");

        AM_str=String.valueOf(ringer_mode);
        Log.w("Ringer_mode at start", AM_str);

        //setting the ringer mode on number match
        try {
            Bundle extras=intent.getExtras();
            if (extras !=null){

                String state = extras.getString(TelephonyManager.EXTRA_STATE);
                Log.w("state at start",state);
                if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                    String phonenumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);


                    //AM.setRingerMode(1);
                    ringer_mode =AM.getRingerMode();
                    AM_str=String.valueOf(ringer_mode);
                    Log.w("Ringer_mode at ringing", AM_str);

                    Log.w("Number", phonenumber);

                    if (phonenumber.equals("1234")){
                        Log.w("yahoo", "Number matched");

                        if (ringer_mode==AudioManager.RINGER_MODE_SILENT || ringer_mode==AudioManager.RINGER_MODE_VIBRATE ){

                            AM.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                            Log.w("Phone number is matched .!", "Now , ringer mode is normal");
                            int now_nor =AM.getRingerMode();
                            String now_nor_str=String.valueOf(now_nor);
                            Log.w("ring_mode at num matched",now_nor_str);

                        }
                    }

                }
                if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK ) || state.equals(TelephonyManager.EXTRA_STATE_IDLE)){

                    int now_nor =AM.getRingerMode();
                    String now_nor_str=String.valueOf(now_nor);
                    Log.w("ring_mode at offHock",now_nor_str);

                    if (ringer_mode==AudioManager.RINGER_MODE_NORMAL){
                        AM.setRingerMode(AudioManager.RINGER_MODE_NORMAL );
                        Log.w("Normal", "");
                    }else if (ringer_mode==AudioManager.RINGER_MODE_SILENT ){
                        AM.setRingerMode(AudioManager.RINGER_MODE_SILENT );
                        Log.w("silent", "");
                    }else if (ringer_mode==AudioManager.RINGER_MODE_VIBRATE ){
                        AM.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                        Log.w("vibrat", "");
                    }
                    // Log.w("Again", "Now the Ringer mode is get back ");

                    int now =AM.getRingerMode();
                    String now_str=String.valueOf(now);
                    Log.w("ring_mode at end ",now_str);
                }   
            }
        } catch (Exception e) {
            // TODO: handle exception
            Log.w("MY_DEBUG_TAG", e);

        }
    }
}

And the AndroidManifist.xml is this :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="digicare.ringmanager"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
    android:minSdkVersion="5"
    android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>


    <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="digicare.ringmanager.Main_Activity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

       <receiver android:name="number_checker" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"/>


        </intent-filter>

    </receiver>

    </application>

    </manifest>

but this not working this cannot get the incoming calling number . wot could i do ???? have to call the number_checker class for register the Braodcast ???

please help i am a new android developer


Solution

  • You can either dynamically register an instance of this class with Context.registerReceiver() or statically publish an implementation through the tag in your AndroidManifest.xml.

    Note: If registering a receiver in your Activity.onResume() implementation, you should unregister it in Activity.onPause(). (You won't receive intents when paused, and this will cut down on unnecessary system overhead). Do not unregister in Activity.onSaveInstanceState(), because this won't be called if the user moves back in the history stack.

    also check this link :

    http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html

    NEW Update:

    check this link http://androidexample.com/Incomming_Phone_Call_Broadcast_Receiver__-_Android_Example/index.php?view=article_discription&aid=61&aaid=86

    Update 2

    put . before the receiver name. like this <receiver android:name=".number_checker" >