【问题标题】:Null pointer exception when calling startActivityForResult()调用 startActivityForResult() 时出现空指针异常
【发布时间】:2013-01-13 17:23:36
【问题描述】:

从另一个类中的类调用 startActivityForResult() 时遇到问题(空指针异常),代码如下:

public class OCRActivity extends Activity {

public OCRActivity(String operator)
{
    this.operator = operator;
}


public void startCameraActivity() {

    final Intent capture_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(capture_intent, 1); // I get the Null pointer Exception here
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {

        if(requestCode == 1){
            //get the Uri for the captured image
            picUri = data.getData();
            //carry out the crop operation
            performCrop();
        }
}

这是我打电话给startCameraActivity()的地方

public class WayToFillActivity extends Activity implements OnClickListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.way_to_fill);

    CAMERA_BTN = (Button) findViewById(R.id.camera_btn);
    CAMERA_BTN.setOnClickListener(this);
    Intent operator_intent =  getIntent();
    OPERATOR = operator_intent.getStringExtra("operator");
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.camera_btn)
    {
        OCRActivity ocr = new OCRActivity(OPERATOR);
        ocr.startCameraActivity();

    }

}

如果我做错了什么,请告诉我!!

Logcat

01-13 16:22:26.583: E/AndroidRuntime(32425): java.lang.NullPointerException
01-13 16:22:26.583: E/AndroidRuntime(32425):    at     android.app.Activity.startActivityForResult(Activity.java:3190)
01-13 16:22:26.583: E/AndroidRuntime(32425):    at com.almannaa.EasyRecharge.OCRActivity.startCameraActivity(OCRActivity.java:176)

【问题讨论】:

  • 请发布日志猫..
  • 您不会通过构造函数实例化活动。另外,我不明白你为什么不从你的WayToFillActivity启动相机捕捉意图
  • OCRActivity 类太大,有很多方法,我才知道错误在哪里
  • 你不应该在 OCRActivity 中扩展 Activity,或者如果你故意这样做,那么你不应该直接实例化它的实例,它应该具有 Activity 所需的所有覆盖(onCreate 等)
  • 那么你对类和扩展它们感到困惑。启动 Activity 的唯一方法是通过 Intent,无论是来自 Android(启动器或其他应用程序)还是来自您自己的代码。 OCRActivity ocr = new OCRActivity(OPERATOR) 是一个错误。您应该重新考虑设计以及您的活动如何相互关联。

标签: android android-activity nullpointerexception start-activity


【解决方案1】:

您将OCRActivity 视为一个普通的Java 类,而不是另一个Activity。因此,当您调用 startActivityForResult() 时,您会得到一个 NPE,因为 Activity 的 onCreate() 尚未被调用,这意味着它的当前实例对于调用 startActivityForResult() 无效

请尝试使用:

public class WayToFillActivity extends Activity implements OnClickListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.way_to_fill);

    CAMERA_BTN = (Button) findViewById(R.id.camera_btn);
    CAMERA_BTN.setOnClickListener(this);
    Intent operator_intent =  getIntent();
    OPERATOR = operator_intent.getStringExtra("operator");
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.camera_btn)
    {
        OCRActivity ocr = new OCRActivity(OPERATOR);
        ocr.startCameraActivity();

    }

}

public void startCameraActivity() {

    final Intent capture_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(capture_intent, 1); // I get the Null pointer Exception here
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {

        if(requestCode == 1){
            //get the Uri for the captured image
            picUri = data.getData();
            //carry out the crop operation
            performCrop();
        }
}
}

您可能应该将像performCrop() 之类的函数(以及任何其他不需要在活动本身中的函数,并且可以通过接收数据作为参数并返回它来工作)移动到一个单独的类中(称为实用程序或其他)。

【讨论】:

  • 你的意思是从 OCRActivity 类到 WayToFillActivity 类获取我想要的所有方法??而且performCrop()也是startActivityForResult
  • 是的,这也可以。但这将是糟糕的类设计。我不知道你说的But also performCrop() is startActivityForResult是什么意思。
  • 在 performCrop() 方法里面有startActivityForResult()
  • 我明白了,我改变了调用方法的方式。在另一个活动中创建活动对象是错误的。这就是为什么它不起作用谢谢你的帮助
  • @FirasAlMannaa 你最后的评论对我有帮助。我被困在这里。谢谢
【解决方案2】:

也许你应该检查数据是否不为空。

@Override        
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1 && data != null) {

        if(resultCode == RESULT_OK){
            //get the Uri for the captured image
            picUri = data.getData();
            //carry out the crop operation
            performCrop();
        } }

【讨论】:

  • 在到达onActivityResult之前发生异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多