如何修复崩溃而不是打电话的应用程序?

时间:2019-04-17 20:02:52

标签: java android

我正在尝试制作一个在收到特定消息时启动通话的应用程序。一切正常,只是应用程序在应调用时崩溃。

问题出在我使用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"));
           startActivity(callIntent);
        }
    }

编辑:

我也尝试了以下代码:

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. 

2 个答案:

答案 0 :(得分:1)

确保您的AndroidManifest.xml中有此

 <uses-permission android:name="android.permission.CALL_PHONE" />

您的方法应该看起来像这样:

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

}

答案 1 :(得分:0)

问题是您试图将Activity用作另一个类。根据经验,如果您正在调用Activity构造函数,那么您做错了什么。该类不应该是一个活动,或者您不应该调用构造函数。

在您的用例中,最好在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);
}

编辑:

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+107222222"));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(callIntent);