【问题标题】:Android Call Intent Null pointer exceptionAndroid Call Intent Null 指针异常
【发布时间】:2013-05-25 09:09:32
【问题描述】:

我的智慧到此为止。我有一个实现OnClickListener 的类,我需要对我的应用程序中的按钮执行相同的操作。这曾经工作得很好。但是因为我通过从应用程序偏好中获取一些需要的数据来添加一些功能。 startActivity 抛出空指针异常。
这是类:

//Imports
public class CallClickListener extends Activity implements View.OnClickListener {

    protected AppPreferences appPrefs;
    String contactPersonName;
    String contactPersonTelephone;
    String name;

    public CallClickListener(Context context){
        Log.d("TRACE", "init CallClick");
        appPrefs = new AppPreferences(context);

        try {

            JSONObject object = appPrefs.getConsultantObject();

            contactPersonName = object.getString("contactPersonName");
            contactPersonTelephone = object.getString("contactPersonTelephone");
            name = object.getString("name");

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View view) {
        final View v = view;

        AlertDialog.Builder alert = new AlertDialog.Builder(view.getContext());
        alert.setTitle("Anrufen");
        alert.setMessage("Kontakt für " + name + ", " + contactPersonName + " anrufen");
        alert.setPositiveButton("Anrufen", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:"+contactPersonTelephone));
                startActivity(callIntent);// this line throws the exception
            }
        });
        alert.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(v.getContext(), "Abbruch", Toast.LENGTH_SHORT).show();
            }
        });
        alert.show();
    }
}

字符串都来自 appPrefs,我还尝试硬编码电话号码以防万一。警报工作正常,但只要我点击正面按钮,应用程序就会崩溃
我这样添加监听器:

bCall.setOnClickListener(new CallClickListener(getApplicationContext()));

我添加了必要的通话权限。

我是 Android 开发新手,我缺少什么?

【问题讨论】:

    标签: android android-intent nullpointerexception call


    【解决方案1】:

    这样做....将您在构造函数中传递的上下文对象变成字段变量。并将 startActivity 更改为context.startActivity。然后就可以了。

    编辑:突出显示完整的解决方案。

    bCall.setOnClickListener(new CallClickListener(getApplicationContext()));

    应改为 YourActivityClass.this 而不是getApplicationContext

    在同一任务中启动 Activity 不适用于不是 Activity 的上下文对象。因此,您需要将上下文更改为Activity,或者在新任务中启动活动。同样,如果您没有在提供给构造函数的上下文上调用 startActivity,您将获得 NPE,因为您的 CallClickListerner 没有上下文。

    【讨论】:

    • 这听起来很有希望,但结果是一样的 :(
    • @M4tchB0X3r 我刚刚通过对数字进行编码来尝试您的代码。警报对话框有效。单击按钮时,它确实会拨打电话。我不知道你为什么会得到 NPE
    • bCall.setOnClickListener(new CallClickListener(getApplicationContext()));应该是 YourActivityClass.this 而不是 getApplicationContext。试试看。
    • srym 不太一样,现在我得到了这个错误! “从 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?”不知道这意味着什么
    • @SamarthJain 我之前确实提出了相同的建议,但不确定。所以再次编辑了我的答案。因为他说 alertdialog 有效
    【解决方案2】:

    使用活动上下文。还要检查你是否初始化了 bCall。如果你没有,你会得到 NullPointerException。

         bCall.setOnClickListener(ActivityName.this);
    

    还可以查看此链接以了解何时使用活动上下文以及何时使用应用程序上下文

    When to call activity context OR application context?

    编辑:

    确保您已在清单文件中添加权限

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

    供参考使用以下。我的班级扩展了活动

       Button b= (Button) findViewById(R.id.button1); 
       b.setOnClickListener(new OnClickListener()
        {
    
            @Override
            public void onClick(View v1) {
                // TODO Auto-generated method stub
                  final View v = v1;
    
                    AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());
                    alert.setTitle("Anrufen");
                    alert.setMessage("Kontakt für " );
                    alert.setPositiveButton("Anrufen", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Intent callIntent = new Intent(Intent.ACTION_CALL);
                            callIntent.setData(Uri.parse("tel:8095992052"));
                            startActivity(callIntent);// this line throws the exception
                        }
                    });
                    alert.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Toast.makeText(v.getContext(), "Abbruch", Toast.LENGTH_SHORT).show();
                        }
                    });
                    alert.show();
            }
    
        });
    

    【讨论】:

    • 感谢您的快速回复。我显然首先将按钮分配给资源。但是当我尝试您的代码时,我收到错误“CallClickListener”不是封闭类
    • 我使用应用程序上下文来获取应用程序首选项
    • @M4tchB0X3r 我再次检查。
    • 是的,我有。就像我说的那样,它曾经有效。但是由于实现了动态字符串,它崩溃了
    • @M4tchB0X3r 记录这个contactPersonTelephone并检查它是否为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多