2012-10-13 2 views
6

Я пытаюсь сделать новый входящий экран вызова в андроиде,Android - Customized новых входящего вызова экран

, когда я получаю входящий звонок моих запусков приложения - но падает сразу, а экран по умолчанию входящего вызова приходит вверх.

Что я делаю неправильно?

мой код:

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

} 

бревно является:

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 
+2

Вы получаете любой выход журнала из аварии? – Eric

+1

Должно ли 'MyPhoneBroadcastReceiver' расширять' BroadcastReceiver' вместо 'Activity'? – Geobits

+0

Я использую Activity for: Intent main_intent = new Intent (this, CallActivity.class); context.startActivity (main_intent); –

ответ

2

Ok, чтобы сделать мою новую страницу в передней части мне нужно, чтобы сделать его спать на некоторое время ... поэтому новый код будет :

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

Но - оригинальная программа входящего вызова по-прежнему работает в фоновом режиме ...

есть ли способ, чтобы заменить его вместо того, чтобы открывать новое приложение наверх это?

Спасибо!

+1

Я немного поработал над этим и нашел много сообщений, в которых говорится, что этого не может быть сделано - хотя это приложение требует делать то, что вы хотите (https://play.google.com/store/apps/ подробности? ID = com.perracolabs.tcc). Однако приложение не работает на моем Galaxy Nexus, так что это может быть не то, что будет работать на всех телефонах. Если вы нашли решение этой проблемы, прокомментируйте это! –

+0

Вышеприведенное приложение не заменяет экран входящих вызовов - скриншоты для подтверждения исходящего вызова - поэтому я не считаю, что можно заменить приложение по умолчанию, только чтобы наложить что-то еще поверх него. –

3

Вы получаете ClassCastException, потому что ваш манифест определяет MyPhoneBroadcastReceiver как приемник, а не деятельность. Вам не нужна деятельность для создания намерения, так как она занимает Context, а другая - onReceive(). Имейте это продлить BroadcastReceiver и изменить намерение немного как это:

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

Спасибо за это, но я получил еще одну ошибку, которую мне нужно установить «FLAG_ACTIVITY_NEW_TASK». , поэтому я изменил код на: Intent i = new Intent(); i.setClass (контекст, Call.class); i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity (i); Теперь он работает, но отображается под исходным экраном входящих вызовов (поэтому я вижу его только после того, как я закончил вызов) ... –

+0

Не думаю, что вы можете полностью переопределить встроенный экран вызовов, по крайней мере, до Имбирный пряник. Независимо от того, работает ли он на новых API-интерфейсах, я не смог понять. Похоже, что просто походка в Google указывает на то, что это сделано по соображениям безопасности. Я вижу много попыток, но большинство просто тупик: «О, вы не можете этого сделать». Удачи вам в поиске, но, по крайней мере, вы устранили свои проблемы с крушением. – Geobits

+1

Спасибо за помощь!Я вижу такие приложения, как https://play.google.com/store/apps/details?id=com.perracolabs.tccp и: http://code.google.com/p/incomingcallplus/, которые меняют этот экран. поэтому это должно быть возможно. –

0

Добавьте к этому манифесту:

<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

, пожалуйста, объясните свой ответ. – arghtype

+0

. Когда вы добавите их в манифест, он поймает события вызова до того, как телефон сделает – WhiteWolfza

Смежные вопросы