startActivityForResult出一个活动

时间:2014-10-09 13:34:32

标签: java android android-camera-intent

如何在活动上下文之外使用startActivityForResult,例如在常规java类

EX: 在主要活动中,Im调用SampleClass的方法。在这种方法中,我必须打开设备相机并获取图像并进行处理。

问题是控件没有转到SampleClass中的onActivityResult回调方法,而是转到MainActivity中的onActivityResult回调方法。我做错了什么?

我需要能够只处理Sample Class中的图像。我怎样才能实现这个目标

代码段

主要活动:

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
...
...

    SampleClass sample = new Sample(this);   
    sample.openCamera();
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 0){
        if(resultCode == RESULT_OK){
            syso("INSIDE MAIN ACTIVITY");
        }

        if(resultCode == RESULT_CANCELED){
            ...
        }
    }
}

}

示例类:

public class SampleClass extends Activity{

private Context context;

public SampleClass(Context context){
    this.context = context;
}

public void openCamera(){
    Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    ((Activity) context).startActivityForResult(photoIntent, 0);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 0){
        if(resultCode == RESULT_OK){
            //get the image 
            // process it.

            syso("INSIDE SAMPLE CLASS");
        }

        if(resultCode == RESULT_CANCELED){

        }
    }
}

}

如果我运行此程序,控制台上的输出是INSIDE MAIN ACTIVITY。我想要的是能够将INSIDE SAMPLE CLASS作为输出。

谢谢和问候

3 个答案:

答案 0 :(得分:2)

而不是使用

 SampleClass sample = new Sample(this);   
sample.openCamera();

只需使用

Intent intent = new Intent(this, SampleClass .class); 

并编写SampleClass onCreate调用openCamera()。

希望这会有所帮助。

答案 1 :(得分:1)

这是不可能的。将在该活动上调用onActivityResuly,该活动已经运行了另一个活动。

因此,如果您使用activity1实例运行另一个活动,则另一个活动将调用activity1.onActivityResult()

答案 2 :(得分:0)

问题是您使用MainActivity Context打开相机!! 肯定会触发MainACtivity的onActivityResult()。

((Activity) context).startActivityForResult(photoIntent, 0);

参见context object = MainActivity检查SimpleClass构造函数。

public SampleClass(Context context){
// when you call from mainActivity and send **this** it means context = MainActivty
this.context = context;
} 

如果你想要触发SampleClass onActivityResult(),那么就没有办法扩展Activity 然后把它称为挪威方式......

Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
context.startActivityForResult(photoIntent, 0);    // context must = SampleClass (); no other way

但如果您仍想在SimpleClass中使用handel图像,请遵循此代码remove extends Activity

SimpleClass

中的

public static void onActivityResult(int requestCode, int resultCode, Intent data) {

  if(requestCode == 0){
     if(resultCode == RESULT_OK){
        //get the image 
        // process it.

        syso("INSIDE SAMPLE CLASS");
     }

      if(resultCode == RESULT_CANCELED){

      }
   }
}

并在您的MainActivity类

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    SimpleClass.onActivityResult(requestCode,resultCode,data);
}

永远不会使用新关键词从活动中创建新对象Adnroid OS会在您说

时为您做到这一点
 Itnent foo = new(context,foo.class);

如果你这样做,这意味着黑客代码和Android操作系统。

我希望你明白并希望这有帮助