Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复我的应用程序崩溃而不是拨打电话?_Java_Android - Fatal编程技术网

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);