I'm trying to make an new incoming call screen in android,
when i get an incoming call my app starts - but crashes immediately, and the default incoming call screen is coming up.
what am i doing wrong?
my code:
AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myfirstapp"
android:versionCode="7"
android:versionName="7">
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="10"></uses-sdk>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<receiver android:name=".MyPhoneBroadcastReceiver" android:enabled="true">
<intent-filter android:priority="99999">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<activity
android:name=".Call" >
</activity>
</application>
</manifest>
MyPhoneBroadcastReceiver.java:
package com.example.myfirstapp;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
public class MyPhoneBroadcastReceiver extends Activity{
public void onReceive(final Context context, Intent intent) {
Intent main_intent = new Intent(this, Call.class);
context.startActivity(main_intent);
}
}
Call.java:
package com.example.myfirstapp;
import android.app.Activity;
import android.os.Bundle;
public class Call extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
the log is:
10-14 20:59:51.056: E/AndroidRuntime(1826): FATAL EXCEPTION: main
10-14 20:59:51.056: E/AndroidRuntime(1826):
java.lang.RuntimeException: Unable to instantiate receiver
com.example.myfirstapp.MyPhoneBroadcastReceiver:
java.lang.ClassCastException:
com.example.myfirstapp.MyPhoneBroadcastReceiver cannot be cast to
android.content.BroadcastReceiver 10-14 20:59:51.056:
E/AndroidRuntime(1826): at
android.app.ActivityThread.handleReceiver(ActivityThread.java:2210)
10-14 20:59:51.056: E/AndroidRuntime(1826): at
android.app.ActivityThread.access$1500(ActivityThread.java:130) 10-14
20:59:51.056: E/AndroidRuntime(1826): at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)
10-14 20:59:51.056: E/AndroidRuntime(1826): at
android.os.Handler.dispatchMessage(Handler.java:99) 10-14
20:59:51.056: E/AndroidRuntime(1826): at
android.os.Looper.loop(Looper.java:137) 10-14 20:59:51.056:
E/AndroidRuntime(1826): at
android.app.ActivityThread.main(ActivityThread.java:4745) 10-14
20:59:51.056: E/AndroidRuntime(1826): at
java.lang.reflect.Method.invokeNative(Native Method) 10-14
20:59:51.056: E/AndroidRuntime(1826): at
java.lang.reflect.Method.invoke(Method.java:511) 10-14 20:59:51.056:
E/AndroidRuntime(1826): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-14 20:59:51.056: E/AndroidRuntime(1826): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 10-14
20:59:51.056: E/AndroidRuntime(1826): at
dalvik.system.NativeStart.main(Native Method) 10-14 20:59:51.056:
E/AndroidRuntime(1826): Caused by: java.lang.ClassCastException:
com.example.myfirstapp.MyPhoneBroadcastReceiver cannot be cast to
android.content.BroadcastReceiver 10-14 20:59:51.056:
E/AndroidRuntime(1826): at
android.app.ActivityThread.handleReceiver(ActivityThread.java:2205)
10-14 20:59:51.056: E/AndroidRuntime(1826): ... 10 more
Tap Call Screen. Under “Unknown call settings,” tap the types of callers you'd like to screen. To screen automatically, choose Automatically screen. Decline robocalls.
You are getting a ClassCastException
because your manifest defines MyPhoneBroadcastReceiver
as a receiver, not an activity. You don't need an activity to create the intent, since it takes a Context
, and one is provided with onReceive()
. Have it extend BroadcastReceiver
and alter the intent slightly like this:
public class MyPhoneBroadcastReceiver extends BroadcastReceiver{
public void onReceive(final Context context, Intent intent) {
Intent main_intent = new Intent(context, CallActivity.class);
context.startActivity(main_intent);
}
}
Ok, in order to make my new page in the front i need to make it sleep for a while... so the new code will be:
public class MyPhoneBroadcastReceiver extends BroadcastReceiver{
public void onReceive(final Context context, Intent intent) {
Thread pageTimer = new Thread(){
public void run(){
try{
sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
} finally {
Intent i = new Intent();
i.setClass(context, Call.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
};
pageTimer.start();
}
}
But - the original incoming call program is still running in the background...
Is there any way to replace it instead opening new app ontop of it?
Thanks!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With