Android - customizable new screen for incoming calls

I am trying to create a new incoming call screen in android,

when I receive an incoming call that runs in my application, but it immediately rings and the incoming call screen is by default suitable.

what am I doing wrong?

my code is:

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); } } 

Journal:

  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 
+6
source share
3 answers

Well, to make my new page ahead, I need to get some sleep ... so the new code would 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 a way to replace it instead of opening a new ontop application?

Thanks!

+2
source

You get a ClassCastException because your manifest defines MyPhoneBroadcastReceiver as a receiver, not an activity. To create an intent, you do not need an action, since it takes Context , and one with onReceive() . Extend it to BroadcastReceiver and slightly change the intent as follows:

 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); } } 
+3
source

Add this to your manifest:

 <activity> <intent-filter> <action android:name="android.intent.action.ANSWER" /> <action android:name="android.intent.action.PHONE_STATE" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 
0
source

Source: https://habr.com/ru/post/927616/


All Articles