2011-11-07 58 views
0

,我目前使用的代码如下:如何在通话结束时调用/启动应用程序?

主类

public class Index extends BroadcastReceiver{ 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
      telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE); 
     } 
    } 

CustomPhoneStateListener类

public class CustomPhoneStateListener extends PhoneStateListener { 

     public Activity activ=new Activity(){ 
      public void startActivity(Intent i) {} 
      }; 
      Context context; 
     public CustomPhoneStateListener(Context context) { 
      super(); 
      this.context = context; 
     } 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      super.onCallStateChanged(state, incomingNumber); 
      switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: 

       Toast.makeText(context, "call has ended", Toast.LENGTH_SHORT).show(); 
    // The process to transfer to the next application. 
        Intent i = new Intent(Intent.ACTION_MAIN); 
       PackageManager manager = activ.getPackageManager(); 
i = manager.getLaunchIntentForPackage("com.timetracker.app");// package name for my new app 
       i.addCategory(Intent.CATEGORY_LAUNCHER); 
       activ.startActivity(i); 
       break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 

       Toast.makeText(context, "Phone call has taken", Toast.LENGTH_SHORT).show(); 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 

       //when Ringing 
       Toast.makeText(context, "Phone is ringing", Toast.LENGTH_SHORT).show(); 
       break; 
       default: 
       break; 
      } 
     } 
    } 

和Android清单文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.android.call" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
       <receiver android:name=".Index" > 
        <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE"/> 
       <action android:name="android.view.InputMethod" /> 
       </intent-filter> 
       </receiver> 
</application> 

    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.CALL_PHONE"/> 
</manifest> 

通过使用上面的代码我能够得到我正在执行相应的动作敬酒的消息,但我不能给任何意图或使用Package_Manger我不能够转移到下一个应用程序。

D/AndroidRuntime(312): Shutting down VM 
: W/dalvikvm(312): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
FATAL EXCEPTION: main 
    E/AndroidRuntime(312): java.lang.NullPointerException 
    E/AndroidRuntime(312): at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:85) 
    E/AndroidRuntime(312): at com.android.call.CustomPhoneStateListener.onCallStateChanged(CustomPhoneStateListener.java:39) 
    E/AndroidRuntime(312): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:319) 
    E/AndroidRuntime(312): at android.os.Handler.dispatchMessage(Handler.java:99) 
    E/AndroidRuntime(312): at android.os.Looper.loop(Looper.java:123) 
    E/AndroidRuntime(312): at android.app.ActivityThread.main(ActivityThread.java:4627) 
    E/AndroidRuntime(312): at java.lang.reflect.Method.invokeNative(Native Method) 
    E/AndroidRuntime(312): at java.lang.reflect.Method.invoke(Method.java:521) 
    E/AndroidRuntime(312): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    E/AndroidRuntime(312): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    E/AndroidRuntime(312): at dalvik.system.NativeStart.main(Native Method) 

回答

1

它看起来像这个问题是从使用active声明如下到来:

public Activity activ=new Activity(){ 
     public void startActivity(Intent i) {} 
    }; 

在这里,我们创建没有上下文的新活动。也许你应该只将Activity传递给你的CustomPhoneStateListener而不是Context。或者使用context得到PackageManager:

PackageManager manager = context.getPackageManager();

+0

谢谢..现在它正在工作.. – DAS

1

为此,您需要监听的手机状态:

的log_cat消息试图执行的代码调用应用程序时返回。当您接到广播接收器的电话时,请启动此服务,并将其中的部分操作放在一边。

public class MyPhoneStateListener extends Service{ 

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
     StateListener phoneStateListener = new StateListener(); 
     TelephonyManager telephonymanager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
     telephonymanager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
    }catch(Exception e){ } 

} 

class StateListener extends PhoneStateListener{ 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 
     switch(state){ 
      case TelephonyManager.CALL_STATE_RINGING: 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       break; 
      case TelephonyManager.CALL_STATE_IDLE: 
       //Here call your function to invoke another app. 
       startAnotherApp(String pkgName); 
       break; 
     } 
    } 
}; 

private void startAnotherApp(String pkgName){ 
    Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
    if (null != intent) { 
    try { 
     startActivity(intent); 
    } catch(Exception e) { } 
} 

} 

@Override 
public void onDestroy() { 

} 

}

权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+0

嗨,我无法启动应用程序,我有固定的一些返回的错误,并尝试过,但没有结果。 – DAS

+0

使用此启动另一个应用程序:私人无效startAnotherApp(字符串PKGNAME){ 意图意图= getPackageManager()getLaunchIntentForPackage(的packageName); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 如果(空=意图!){ 尝试{ startActivity(意向); }赶上(例外五){}} } –

+0

我描述它在我的回答很克利里。你遇到了什么错误? –

相关问题