如何调用/启动一个应用程序调用结束时? [英] How to Invoke/Start an application when a call is ended?
问题描述
在code,我是presently使用如下:
我的主类
公共类指数扩展的BroadcastReceiver {
@覆盖
公共无效的onReceive(上下文的背景下,意图意图){
TelephonyManager telephonyManager =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(新CustomPhoneStateListener(上下文),PhoneStateListener.LISTEN_CALL_STATE);
}
}
在 CustomPhoneStateListener类
公共类CustomPhoneStateListener扩展PhoneStateListener {
公共活动ACTIV =新的活动(){
公共无效startActivity(意向我){}
};
上下文语境;
公共CustomPhoneStateListener(上下文的背景下){
超();
this.context =背景;
}
@覆盖
公共无效onCallStateChanged(INT状态,串incomingNumber){
super.onCallStateChanged(州,incomingNumber);
开关(州){
案例TelephonyManager.CALL_STATE_IDLE:
Toast.makeText(背景下,通话已结束,Toast.LENGTH_SHORT).show();
//该过程转移到下一个应用程序。
意图I =新的意图(Intent.ACTION_MAIN);
PackageManager经理= activ.getPackageManager();
I = manager.getLaunchIntentForPackage(com.timetracker.app);对于我的新的应用程序//包名
i.addCategory(Intent.CATEGORY_LAUNCHER);
activ.startActivity(ⅰ);
打破;
案例TelephonyManager.CALL_STATE_OFFHOOK:
Toast.makeText(背景下,电话呼叫采取Toast.LENGTH_SHORT).show();
打破;
案例TelephonyManager.CALL_STATE_RINGING:
振铃时//
Toast.makeText(背景下,电话响起来,Toast.LENGTH_SHORT).show();
打破;
默认:
打破;
}
}
}
和Android清单文件:
< XML版本=1.0编码=UTF-8&GT?;
<舱单的xmlns:机器人=http://schemas.android.com/apk/res/android
包=com.android.call
安卓版code =1
机器人:VERSIONNAME =1.0>
<使用-SDK安卓的minSdkVersion =8/>
<应用机器人:图标=@可绘制/图标机器人:标签=@字符串/ APP_NAME>
<接收器的Android版本:NAME =指数>
<意向滤光器>
<作用机器人:名称=android.intent.action.PHONE_STATE/>
<作用机器人:名称=android.view.InputMethod/>
&所述; /意图滤光器>
< /接收器>
< /用途>
<使用-权限的Android:名称=android.permission.READ_PHONE_STATE/>
<使用-权限的Android:名称=android.permission.CALL_PHONE/>
< /舱单>
通过使用上述code,我能够得到的,我在执行各自的操作敬酒的消息,但我不能给任何意图或使用<强> Package_Manger 我不能够转移到下一个应用程序。
在log_cat消息返回尝试执行$ C $下调用应用程序时:
D / AndroidRuntime(312):关闭虚拟机
:W / dalvikvm(312):主题ID = 1:螺纹退出与未捕获的异常(组= 0x4001d800)
致命异常:主要
E / AndroidRuntime(312):显示java.lang.NullPointerException
E / AndroidRuntime(312):在android.content.ContextWrapper.getPackageManager(ContextWrapper.java:85)
E / AndroidRuntime(312):在com.android.call.CustomPhoneStateListener.onCallStateChanged(CustomPhoneStateListener.java:39)
E / AndroidRuntime(312):在android.telephony.PhoneStateListener $ 2.handleMessage(PhoneStateListener.java:319)
E / AndroidRuntime(312):在android.os.Handler.dispatchMessage(Handler.java:99)
E / AndroidRuntime(312):在android.os.Looper.loop(Looper.java:123)
E / AndroidRuntime(312):在android.app.ActivityThread.main(ActivityThread.java:4627)
E / AndroidRuntime(312):在java.lang.reflect.Method.invokeNative(本机方法)
E / AndroidRuntime(312):在java.lang.reflect.Method.invoke(Method.java:521)
E / AndroidRuntime(312):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
E / AndroidRuntime(312):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E / AndroidRuntime(312):在dalvik.system.NativeStart.main(本机方法)
它看起来像问题是从使用来临主动
这样的声明:
公开活动ACTIV =新的活动(){
公共无效startActivity(意向我){}
};
在这里,你要创建一个没有上下文的新活动。也许你应该只是传递活动到您的权利CustomPhoneStateListener,而不是Context。或者使用上下文
获得PackageManager:
PackageManager经理= context.getPackageManager();
The code that I am presently using is as follows:
My main class
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);
}
}
the CustomPhoneStateListener class
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;
}
}
}
and the Android Manifest file as:
<?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>
By using the above code I am able to get the toast message for the respective actions that I am performing ,but I am not able to give any Intent or by using the Package_Manger I am not able to shift to the next app.
The log_cat message returned when trying to execute the code for invoking the app:
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)
It looks like the problem is coming from the use of active
declared like this:
public Activity activ=new Activity(){
public void startActivity(Intent i) {}
};
Here you're creating a new Activity without a context. Maybe you should just pass the Activity right into your CustomPhoneStateListener instead of the Context. Or use the context
to get the PackageManager:
PackageManager manager = context.getPackageManager();
这篇关于如何调用/启动一个应用程序调用结束时?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!