2011-11-07 57 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

我描述它在我的回答很克利裏。你遇到了什麼錯誤? –

相關問題