Java 如何修复我的应用程序崩溃而不是拨打电话?
我正在尝试制作一个应用程序,当它收到特定消息时启动呼叫。一切正常,只是应用程序在启动呼叫时崩溃 问题出在我使用Java 如何修复我的应用程序崩溃而不是拨打电话?,java,android,Java,Android,我正在尝试制作一个应用程序,当它收到特定消息时启动呼叫。一切正常,只是应用程序在启动呼叫时崩溃 问题出在我使用startActivity()的那一行。我不知道它为什么会坠毁。有人能帮我吗 public class SmsBroadcastReceiver extends BroadcastReceiver { public static final String SMS_BUNDLE = "pdus"; @Override public void onReceive(
startActivity()
的那一行。我不知道它为什么会坠毁。有人能帮我吗
public class SmsBroadcastReceiver extends BroadcastReceiver {
public static final String SMS_BUNDLE = "pdus";
@Override
public void onReceive(Context context, Intent intent) {
Bundle intentExtras = intent.getExtras();
//....
String cod = "message";
if(smsBody.compareTo(cod) == 0){
CallClass obj = new CallClass();
obj.call();
}
//....
编辑:
我还尝试了下面的代码:
private class CallClass extends AppCompatActivity {
public void call() {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+107222222"));
try{
startActivity(callIntent);
}
catch(SecurityException e) {
e.printStackTrace();
}
}
}
但这并不能解决我的问题。我检查并授予了应用程序启动呼叫所需的所有权限。在调试模式下,我收到以下消息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: romania.ovi.smsapp, PID: 9715
java.lang.RuntimeException: Unable to start receiver romania.ovi.smsapp.SmsBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3388)
....
W/System: A resource failed to call close.
确保您的AndroidManifest.xml中有此文件
<uses-permission android:name="android.permission.CALL_PHONE" />
问题是您试图将一个活动用作另一个类。根据经验,如果您正在调用活动构造函数,则说明您做错了什么。该类不应该是活动,或者您不应该调用构造函数 在您的用例中,最好在BroadcastReceiver本身中编写调用代码
@Override
public void onReceive(Context context, Intent intent) {
...
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+107222222"));
context.startActivity(callIntent);
}
编辑:
你有什么例外?还有,startActivity的代码是什么?它在哪里失败了?“我不知道为什么它需要给出上下文、意图和捆绑包作为参数。”–我猜你已经扩展了
ActivityCompat
(或者ContextCompat
),它有一个startActivity()
方法,该方法要求第一个参数使用上下文。但是,这不是一个活动
类。它是一个带有一堆静态方法的助手类。但是,看看您的方法,如果这是一个简单的辅助方法,您似乎不想扩展任何内容。您只需在传入方法的上下文中调用startActivity()
。非常感谢@Mike。我做了一个新的计算,扩展了AppCompatActivity
,在那里startActivity()
没有询问Bundle
和Context
。我已经更新了问题。我创建了一个新类,它扩展了AppCompatActivity
,这样我就可以毫无问题地使用startActivity()
。但应用程序仍然崩溃。它会在你调用startActivity后崩溃吗?尝试包装startActivity(callIntent);使用try/catch块try{startActivity(callIntent);}catch(SecurityException e){e.printStackTrace();}在e.printStackTrace()上设置断点;线路。如果它在安全性方面失败,在你尝试使用它之前,你需要检查用户是否授予了使用该手机功能的权限。我给了它打电话所需的所有权限,但应用程序仍然崩溃。我发布了问题的调试日志。如果你能看一看,我会很高兴的。谢谢。您是否在AndroidManifest.xml文件中声明了CallClass活动?我唯一担心的另一件事是,onReceive()回调可能没有在UI线程中运行,因此,您可能需要执行包装在runOnUiThread()块中的startActivity()调用。它仍然不起作用。我在调试控制台上收到此消息:java.lang.RuntimeException:无法启动receiver.ovi.smsapp.SmsBroadcastReceiver:android.util.AndroidRuntimeException:从活动上下文外部调用startActivity()需要标志\u Activity\u NEW\u TASK。这真的是你想要的吗?
@ovidiuşvat编辑了答案。现在应该可以了。
public void call(String message, Context context) {
if(message.compareTo("SpecificMessage")){
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+40773733585"));
startActivity(callIntent);
}
}
@Override
public void onReceive(Context context, Intent intent) {
...
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+107222222"));
context.startActivity(callIntent);
}
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+107222222"));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(callIntent);