Add AIDL file: ITelephony.aidl
package com.jebel.dialtest;
import static android.telephony.TelephonyManager.*;
import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;
import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.android.internal.telephony.ITelephony;
public class DialActivity extends Activity {
private static final String TAG = "DialActivity";
private EditText number;
private Button dialButton;
private Button dialDerectlyButton;
private Button callButton;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
number = (EditText)findViewById(R.id.editText1);
dialButton = (Button)findViewById(R.id.bt_dial);
dialDerectlyButton = (Button)findViewById(R.id.bt_dial_directly);
callButton = (Button)findViewById(R.id.bt_call);
dialButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String numberStr = number.getText().toString();
dialNumber(numberStr);
}
});
dialDerectlyButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String numberStr = number.getText().toString();
dialNumberDirectly(numberStr);
}
});
callButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String numberStr = number.getText().toString();
callNumber(numberStr);
}
});
//Set the listener of Phone State
TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
//TelStateListener listener = new TelStateListener();
tm.listen(new TelStateListener(), PhoneStateListener.LISTEN_CALL_STATE|PhoneStateListener.LISTEN_DATA_ACTIVITY|PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
/*tm.listen(new TelStateListener(), PhoneStateListener.LISTEN_DATA_ACTIVITY);
tm.listen(new TelStateListener(), PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);*/
}
private void dialNumber(String number)
{
Uri uri = Uri.parse("tel:"+number);
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
//Maybe the ServiceManager was showed in former android version.
//ITelephony iTel = ITelephony.Stub.asInterface(ServiceManager.getService("phone"));
}
private void dialNumberDirectly(String number)
{
TelephonyManager telMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Class<TelephonyManager> c = TelephonyManager.class;
try
{
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
Class cl = iTelephony.getClass();
Method m = cl.getDeclaredMethod("dial", String.class);
m.setAccessible(true);
m.invoke(iTelephony, number);
Log.i(TAG, "Dial phone: "+number);
}
catch (Exception e)
{
Log.e(TAG, "Fail to call phone: "+number, e);
}
}
private void callNumber(String number)
{
TelephonyManager telMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Class<TelephonyManager> c = TelephonyManager.class;
try
{
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
Class cl = iTelephony.getClass();
Method m = cl.getDeclaredMethod("call", String.class);
m.setAccessible(true);
m.invoke(iTelephony, number);
Log.i(TAG, "Dial phone: "+number);
}
catch (Exception e)
{
Log.e(TAG, "Fail to call phone: "+number, e);
}
}
private void autoAnswer()
{
TelephonyManager telMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Class<TelephonyManager> c = TelephonyManager.class;
try
{
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = null;
iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
iTelephony.answerRingingCall();
}
catch (Exception e)
{
Log.e(TAG, "Fail to answer ring call.", e);
}
}
class TelStateListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
Log.i(TAG, "%%%Begin onCallStateChanged and incomingNumber: "+ incomingNumber);
switch (state)
{
case CALL_STATE_IDLE:
Log.i(TAG, "CALL_STATE_IDLE...");
break;
case CALL_STATE_OFFHOOK:
Log.i(TAG, "CALL_STATE_OFFHOOK...");
break;
case CALL_STATE_RINGING:
//autoAnswer();
Log.i(TAG, "CALL_STATE_RINGING...");
break;
default:
Log.i(TAG, "state is :" + state);
break;
}
Log.i(TAG, "%%%End onCallStateChanged and incomingNumber: "+ incomingNumber);
}
@Override
public void onDataConnectionStateChanged(int state)
{
Log.i(TAG, "%%%Begin onDataConnectionStateChanged...");
switch (state)
{
case DATA_DISCONNECTED:
Log.i(TAG, "DATA_DISCONNECTED...");
break;
case DATA_CONNECTING:
Log.i(TAG, "DATA_CONNECTING...");
break;
case DATA_CONNECTED:
Log.i(TAG, "DATA_CONNECTED...");
break;
case DATA_SUSPENDED:
Log.i(TAG, "DATA_SUSPENDED...");
break;
default:
Log.i(TAG, "Unkown state: "+state);
break;
}
Log.i(TAG, "%%%End onDataConnectionStateChanged...");
}
@Override
public void onDataConnectionStateChanged(int state, int networkType)
{
Log.i(TAG, "%%%Begin onDataConnectionStateChanged2 and networkType: "+networkType);
switch (state)
{
case DATA_DISCONNECTED:
Log.i(TAG, "DATA_DISCONNECTED...");
break;
case DATA_CONNECTING:
Log.i(TAG, "DATA_CONNECTING...");
break;
case DATA_CONNECTED:
Log.i(TAG, "DATA_CONNECTED...");
break;
case DATA_SUSPENDED:
Log.i(TAG, "DATA_SUSPENDED...");
break;
default:
Log.i(TAG, "Unkown state: "+state);
break;
}
Log.i(TAG, "%%%End onDataConnectionStateChanged2 and networkType: "+networkType);
}
@Override
public void onDataActivity(int direction)
{
Log.i(TAG, "%%%Begin onDataActivity...");
switch (direction)
{
case DATA_ACTIVITY_NONE:
Log.i(TAG, "DATA_ACTIVITY_NONE...");
break;
case DATA_ACTIVITY_IN:
Log.i(TAG, "DATA_ACTIVITY_IN...");
break;
case DATA_ACTIVITY_OUT:
Log.i(TAG, "DATA_ACTIVITY_OUT...");
break;
case DATA_ACTIVITY_INOUT:
Log.i(TAG, "DATA_ACTIVITY_INOUT...");
break;
case DATA_ACTIVITY_DORMANT:
Log.i(TAG, "DATA_ACTIVITY_DORMANT...");
break;
default:
Log.i(TAG, "Unkown direction: "+direction);
break;
}
Log.i(TAG, "%%%End onDataActivity...");
}
}
}
==============================================
package com.jebel.dialtest;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneStatReceiver extends BroadcastReceiver
{
private static final String TAG = "PhoneStatReceiver";
private static boolean incomingFlag = false;
private static String incoming_number = null;
private Context context;
@Override
public void onReceive(Context context, Intent intent)
{
this.context = context;
//Out
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
incomingFlag = false;
String phoneNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:" + phoneNumber);
}
else //In
{
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState())
{
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;
incoming_number = intent.getStringExtra("incoming_number");
Log.i(TAG, "RINGING :" + incoming_number);
//End the call.
endCall();
Log.i(TAG, "End call from "+incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if (incomingFlag)
{
Log.i(TAG, "incoming ACCEPT :" + incoming_number);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (incomingFlag)
{
Log.i(TAG, "incoming IDLE");
}
break;
}
}
}
private void endCall()
{
TelephonyManager telMgr = (TelephonyManager)this.context.getSystemService(Context.TELEPHONY_SERVICE);
Class<TelephonyManager> c = TelephonyManager.class;
try
{
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = null;
iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
iTelephony.endCall();
}
catch (Exception e)
{
Log.e(TAG, "Fail to answer ring call.", e);
}
}
}