问题
Hi all i want to invoke a my own activity over the default incoming call activity.. i have done this with using broadcast receivers i am invoking my activity when getting incoming call. but it is working fine for first time from second time when i get incoming call then default incoming call activity is coming over my activity . i don't know what is the problem can any one please help me ..
Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.satish.service"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver
android:name="MyCallReceiver"
android:enabled="true" >
<intent-filter android:priority="10">
<action android:name="android.intent.action.PHONE_STATE" >
</action>
</intent-filter>
</receiver>
<receiver
android:name="TestReceiver"
android:enabled="true" >
<intent-filter android:priority="10">
<action android:name="jason.wei.custom.intent.action.TEST" >
</action>
</intent-filter>
</receiver>
<activity
android:name="CallActivity"
android:clearTaskOnLaunch="true"
android:launchMode="singleTask" >
<intent-filter android:priority="1000"></intent-filter>
</activity>
</application>
</manifest>
Java Code:
public class MyCallReceiver extends BroadcastReceiver{
public static final String CUSTOM_INTENT = "jason.wei.custom.intent.action.TEST";
Context context = null;
private static final String TAG = "Phone call";
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE);
Log.w("DEBUG", state);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
Intent i = new Intent();
i.setAction(CUSTOM_INTENT);
context.sendBroadcast(i);
}
}
}
}
public class TestReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MyCallReceiver.CUSTOM_INTENT)) {
System.out.println("GOT THE INTENT");
context.startActivity(new Intent(context, CallActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
}
}
public class CallActivity extends Activity implements OnClickListener{
private ITelephony telephonyService;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTheme(android.R.style.Theme_Dialog);
((Button)findViewById(R.id.call)).setOnClickListener(this);
((Button)findViewById(R.id.end)).setOnClickListener(this);
TelephonyManager telephony = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.call:
telephonyService.answerRingingCall();
break;
case R.id.end:
telephonyService.endCall();
finish();
break;
default:
break;
}
}
}
回答1:
Actually the full code was i posted aboove just replace the the below code
public class TestReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MyCallReceiver.CUSTOM_INTENT)) {
System.out.println("GOT THE INTENT");
context.startActivity(new Intent(context, CallActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
}
}
with the below code
public class TestReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
if (intent.getAction().equals(MyCallReceiver.CUSTOM_TEST_INTENT)) {
System.out.println("GOT THE INTENT");
final String mobileNumber = intent.getExtras().getString("number");
Thread thread = new Thread(){
private int sleepTime = 400;
@Override
public void run() {
super.run();
try {
int wait_Time = 0;
while (wait_Time < sleepTime ) {
sleep(100);
wait_Time += 100;
}
}catch (Exception e) {
Toast.makeText(context,
"Error Occured Because:" + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
finally {
}
context.startActivity(new Intent(context, CallActivity.class).putExtra("number", mobileNumber)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
};
thread.run();
}
}
}
回答2:
I created a thread to call my activity and in that i wrote one statement before that start activity that is sleep for 500ms . that is my solutions... if any one is not under statd then ask me i will post code here.
来源:https://stackoverflow.com/questions/10069667/how-to-call-an-activity-when-getting-incoming-call