Search code examples
androidtelephonymanagerphone-state-listener

problems with onCellLocationChanged


I need to start service when my device change cell connection and I presume to do that with onCellLocationChanged() implements below but the beeps start only if I receive incoming calls...

my listener:

public class CellLocationListener extends PhoneStateListener {

    @Override
    public void onCellLocationChanged(CellLocation location) {
        super.onCellLocationChanged(location);

        int cid = 0;
        int lac = 0;

        if (location != null) {
            if (location instanceof GsmCellLocation) {
                cid = ((GsmCellLocation) location).getCid();
                lac = ((GsmCellLocation) location).getLac();
            }
            else if (location instanceof CdmaCellLocation) {
                cid = ((CdmaCellLocation) location).getBaseStationId();
                lac = ((CdmaCellLocation) location).getSystemId();
            }
        }

        String cellInfo = Integer.toString(lac)+"-"+Integer.toString(cid);

        Log.v("logg","CELL CHANGED:"+cellInfo);
    }
}

I've used the same cellInfo on mainactivity and when I start it cellInfo chages its value but no beeps from broadcas receiver....

on manifest:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES" />

<receiver android:name="dado.auto3gdataswitch.CellChangeReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

my broadcastReceiver

  public class CellChangeReceiver extends BroadcastReceiver {

     TelephonyManager telephony;

     public void onReceive(Context context, Intent intent) {
        CellLocationListener phoneListener = new CellLocationListener();
        telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener, CellLocationListener.LISTEN_CALL_STATE);

        Toast.makeText(context, "ON receiver", Toast.LENGTH_LONG).show();

        final MediaPlayer mp = MediaPlayer.create(context, R.raw.beep); 
        mp.start();
        mp.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {      
                mp.stop();
                mp.release();
            }
        });

        Log.v("logg","onreceiver");

    }
}

I hear a beep only if I receive incoming call and not if I change cell....

What's wrong??


Solution

  • I've foud a better solution!!!

    in my mainActivity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        final TelephonyManager telm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    
        int events = PhoneStateListener.LISTEN_CELL_LOCATION;
        telm.listen(phoneStateListener, events);
    
    .....
    }
    
    private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
    
        @Override
        public void onCellLocationChanged(CellLocation location) {
            super.onCellLocationChanged(location);
    
            int cid = 0;
            int lac = 0;
    
            if (location != null) {
                if (location instanceof GsmCellLocation) {
                    cid = ((GsmCellLocation) location).getCid();
                    lac = ((GsmCellLocation) location).getLac();
                }
                else if (location instanceof CdmaCellLocation) {
                    cid = ((CdmaCellLocation) location).getBaseStationId();
                    lac = ((CdmaCellLocation) location).getSystemId();
                }
            }
    
            String cellBase = Integer.toString(lac)+"-"+Integer.toString(cid);
    
            Toast.makeText(getBaseContext(), cellBase, Toast.LENGTH_LONG).show();
            Log.v("logg", "cell:"+cellBase);
    
            final MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.beep);    
            mp.start();
            mp.setOnCompletionListener(new OnCompletionListener() {
    
                @Override
                public void onCompletion(MediaPlayer mp) {
    
                    mp.stop();
                    mp.release();
                }
            });
        }       
    };