如何在延迟时在Android上播放声音?

时间:2018-03-13 00:23:16

标签: android opencv

我正在做一个按颜色进行物体检测的小型学校项目。当物体到达屏幕中心时,它必须有声音。所以声音不会保持不间断,我试图延迟它。但每次应用程序到达播放声音时,它都会关闭。我已经在这里和其他论坛进行了研究,所提出的解决方案无效。

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{

    static {
        if(!OpenCVLoader.initDebug()){
            Log.d("TAG", "OpenCV not loaded");
        } else {
            Log.d("TAG", "OpenCV loaded");
        }
    }

    public void voltatela(View v) {
        setContentView(R.layout.activity_main);
    }

    Mat imgHVS, imgThresholded;
    Scalar sc1, sc2;
    JavaCameraView cameraView;
    int largura, altura;

    public void Verde(View v) {
        sc1 = new Scalar(45, 20, 10);
        sc2 = new Scalar(75, 255, 255);
        irTelaCamera();
    }

    public void Azul(View v) {
        sc1 = new Scalar(80, 50, 50);
        sc2 = new Scalar(100, 255, 255);
        irTelaCamera();
    }

    public void Vermelho(View v) {
        sc1 = new Scalar(110, 100, 50);
        sc2 = new Scalar(130, 255, 255);
        irTelaCamera();
    }

    public void irTelaCamera(){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.telacamera);
        cameraView = (JavaCameraView)findViewById(R.id.cameraview);
        cameraView.setCameraIndex(0); //0 para traseira e 1 para dianteira
        cameraView.setCvCameraViewListener(this);
        cameraView.enableView();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager windowmanager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
    }

    @Override
    protected void onPause() {
        super.onPause();
        cameraView.disableView();
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        imgHVS = new Mat(width,height, CvType.CV_16UC4);
        imgThresholded = new Mat(width,height, CvType.CV_16UC4);
        largura = width;
        altura = height;
    }

    @Override
    public void onCameraViewStopped() {

    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        Point centrotela = new Point((largura*0.5),(altura*0.5));
        final MediaPlayer som = MediaPlayer.create(this, R.raw.bip);
        Imgproc.medianBlur(imgHVS,imgHVS,1);
        Imgproc.cvtColor(inputFrame.rgba(), imgHVS,Imgproc.COLOR_BGR2HSV);
        Core.inRange(imgHVS, sc1, sc2, imgThresholded);
        Imgproc.GaussianBlur(imgThresholded, imgThresholded, new Size(3, 3), 1, 1);
        Mat circles = new Mat();
        double dp = 1.2d;
        int minRadius = 20;
        int maxRadius = 0;
        double param1 = 100, param2 = 20;
        int desvio = (int) (minRadius*0.5);
        Imgproc.HoughCircles(imgThresholded, circles, Imgproc.HOUGH_GRADIENT, dp, imgThresholded.rows()/4, 100, 20, minRadius, maxRadius);
        int numCircles = (circles.rows() == 0) ? 0 : circles.cols();
        for (int i = 0; i < numCircles; i++) {
            double[] circleCoordinates = circles.get(0, i);
            int x = (int) circleCoordinates[0], y = (int) circleCoordinates[1];
            Point center = new Point(x, y);
            int radius = (int) circleCoordinates[2];
            if((((center.x-desvio) <= centrotela.x) && ((center.x+desvio) >= centrotela.x))) {
                if ((((center.y-desvio) <= centrotela.y) && ((center.y+desvio) >= centrotela.y))) {
                    som.start();
                    Imgproc.circle(imgThresholded, center, radius, new Scalar(100, 255, 255), 4);

                    // Play sound after 2 sec delay
                    final Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            som.stop();
                        }
                    }, 2000);
            }}
        }
        Imgproc.circle(imgThresholded,centrotela,50, new Scalar(100,255,255),7);
        Imgproc.circle(imgThresholded,centrotela,25, new Scalar(100,255,255),4);
        Imgproc.circle(imgThresholded,centrotela,5, new Scalar(100,255,255),-1);
        return imgThresholded;
    }
}

2 个答案:

答案 0 :(得分:0)

你必须写sop.start();而不是处理程序内的sop.stop();

答案 1 :(得分:-1)

您是否曾尝试在其他主题中播放声音(AsyncTask?请参阅example here)。如果你已经产生了一个任务,你将不得不跟踪,否则,你将最终创建太多线程播放相同的声音。