Java startActivityForResult并在活动完成后继续

Java startActivityForResult并在活动完成后继续,java,android,android-intent,android-activity,Java,Android,Android Intent,Android Activity,我正在处理一张安卓拍摄的图像。我注意到startActivityForResult启动该活动并继续执行下一行代码(这就是我的处理代码所在的位置)。是否有方法仅在活动完成时继续?我知道将代码放在onActivityResult中,但是当我尝试处理不起作用时,我得到消息“应用程序可能在其主线程上做了太多的工作。”下面是我的代码示例 package e.app.test; import android.Manifest; import android.content.Intent; import

我正在处理一张安卓拍摄的图像。我注意到startActivityForResult启动该活动并继续执行下一行代码(这就是我的处理代码所在的位置)。是否有方法仅在活动完成时继续?我知道将代码放在onActivityResult中,但是当我尝试处理不起作用时,我得到消息“应用程序可能在其主线程上做了太多的工作。”下面是我的代码示例

package e.app.test;


import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;


import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.RotatedRect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.opencv.utils.Converters;

import java.io.File;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    private Button takePictureButton;
    private ImageView imageView;
    private Uri file;
    private Bitmap largeBitmap,scaled,processedBMP;
    volatile boolean IntentComplete = false;
    int h,w;


    //image holder
    Mat bwIMG, dsIMG, usIMG, cIMG, hovIMG;
    MatOfPoint2f approxCurve;

    Mat dst;
    Mat gray;
    Mat processedMat;

    // Vertices of
    short numberOfStrips = 0;
    Point[] extendedVertices = new Point[4];
    Point[] vertices = new Point[4];
    Point pt = new Point(0,0); //Temporary point variable
    int threshold;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        takePictureButton = (Button) findViewById(R.id.button_image);
        imageView = (ImageView) findViewById(R.id.imageview);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            takePictureButton.setEnabled(false);
            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
        }
        takePictureButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePicture(view);
                // WHERE I WANT TO DO MY HEAVY PROCESSING
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 0) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                takePictureButton.setEnabled(true);
            }
        }
    }

    public void takePicture(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        file = FileProvider.getUriForFile(this, "e.stcm.c_stick_interface.fileprovider", getOutputMediaFile());
        intent.putExtra(MediaStore.EXTRA_OUTPUT, file);
        startActivityForResult(intent, 100);
    }

    private static File getOutputMediaFile(){
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "CameraDemo");

        if (!mediaStorageDir.exists()){
            if (!mediaStorageDir.mkdirs()){
                Log.d("CameraDemo", "failed to create directory");
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        return new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 100) {
            if (resultCode == RESULT_OK) {
                //processedFile = file;
                try
                {
                    //WHERE I TRIED TO DO MY HEAVY PROCESSING
                }
                catch (Exception e)
                {
                    //handle exception
                }
            }
        }
    }
}

尝试使用asynctask,这将减轻在主线程上完成的工作,然后您可以根据需要使用其结果继续进行。了解更多信息

您需要在活动中使用
void OnActyivityResult()
完成所需的其余操作

像这样:

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 1) {
                if (resultCode == RESULT_OK) {
                 //do stuffs
                }
           }

        }

//将您的代码放入run方法中。捕获snip后要运行的代码。

接下来的代码行将做什么?这是一系列处理。我正在调整图像的大小,然后识别并裁剪图像中的矩形轮廓,然后将其发送到远程服务器。AsyncTask.execute(new Runnable(){@Override public void run(){//TODO your background code//Write your code here….捕获后要执行的});请原谅我是一个noob,我试着查看@Marcelo的链接和你的代码片段,但我似乎不知道在我刚刚上传的代码中应该把它放在哪里是的,我提到过我试过了,我的处理不起作用,我得到的信息是“应用程序可能在其主线程上做了太多的工作。”
    @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
     if (resultCode == RESULT_OK) {
     AsyncTask.execute(new Runnable() { 
     @Override public void run() { 
            //Write your code here which you want to execute after capture 
     }});} } }