Android Call Intent Null指针异常

时间:2013-05-25 09:09:32

标签: android android-intent nullpointerexception call

我的智慧在这里结束了。我有一个实现OnClickListener cous的类我需要对我的应用程序按钮进行相同的操作。这曾经工作得很好。但是因为我通过从应用偏好中获取一些所需的数据来添加一些功能。 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,我也尝试过硬编码只是一个phonenumber。警报工作正常,但只要我点击正面按钮,应用程序崩溃了 我像这样添加Listener:

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

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

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

2 个答案:

答案 0 :(得分:1)

使用活动上下文。还要检查是否已初始化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();
        }

    });

答案 1 :(得分:1)

执行此操作....将您在构造函数中传递的上下文对象转换为字段变量。并将startActivity更改为context.startActivity。它会工作。

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

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

应更改为 YourActivityClass.this而不是getApplicationContext

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