我拨打电话取消应用。如果您的手机处于桌面或地面的后退位置(加速计数据),它基本上会取消即将召开的通话。我制作了一个Broadcast Receiver
,并在清单上输入了这个android.intent.action.PHONE_STATE
public class PhoneCallReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent si=new Intent(context, MyService.class);
context.startService(si);
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
//telephonyService.silenceRinger();
telephonyService.endCall();
Log.e("in try catch", "yes");
Log.e("in try catch", "call cancel");
shrededit.putInt("newcallingstate", 0);
shrededit.commit();
context.stopService(si);
} catch (Exception e) {
e.printStackTrace();
}
Log.e("pr", "out side true block");
}
}
如果我只使用没有加速度计服务类的代码,但是当我使用加速度计类并在下面的代码之前做出意图时,我的代码运行得非常好。我的应用程序没有取消呼叫或没有给出任何类型或错误。我认为但不完全确定它是上下文问题。 所以请帮助我。
答案 0 :(得分:0)
不,它不是上下文问题所有这些代码都非常好,你只需要条件或使用共享偏好条件。 首先在服务类中创建一个sharedpreferences对象,或者在intent中显示一个。像这样
SharedPreferences sharedpref=this.getSharedPreferences("your_file_name",Context.MODE_PRIVATE);
SharedPreferences.Editor sharededit=sharedpref.edit();
sharededit.putBoolean("String_name", true);
sharededit.commit();
这里布尔值并不重要,你可以选择它和你依赖的其他数据类型。
然后在Broadcast receiver
课程中,您必须再次使用这些SharedPreference
和SharedPreference.Editor
函数,并通过此方法获得之前的boolean
值
boolean value=sharededit.getBoolean("callingStop", true);
比制造这样的条件
if(value==true){TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
//telephonyService.silenceRinger();
telephonyService.endCall();
} catch (Exception e) {
e.printStackTrace();
} }
这就是现在你的代码运行没有任何错误。