我正在处理以android意图拍摄的图像。我注意到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
}
}
}
}
}
答案 0 :(得分:2)
尝试使用asynctask,这将减轻在主线程上完成的工作,然后您可以使用此结果按需进行。 https://developer.android.com/reference/android/os/AsyncTask了解更多信息。
答案 1 :(得分:2)
@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
}});} } }
///将代码放入run方法中。要在捕获片段后运行的代码。
答案 2 :(得分:1)
您需要在活动中使用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
}
}
}