繁体   English   中英

如何为 ImageButton 同时获得 OnClick 和 OnTouch 侦听器?

[英]How can i get both OnClick and OnTouch Listeners for an ImageButton?

我正在尝试构建一个录音应用程序。 当我按住我的图像按钮时,它开始录制我的声音,当我释放按钮时,文件存储在我的手机中。 但是当我不按住按钮时,只需单击图像按钮,然后应用程序就会关闭。 我希望如果我不小心按下了按钮,它会向我展示祝酒词。 我该怎么做?

这是我的代码:

public class MainActivity extends AppCompatActivity {
    ImageButton recordButton;
    String pathSave = "";
    MediaRecorder mediaRecorder;
    MediaPlayer mediaPlayer;
    final int REQUEST_PERMISSION_CODE = 1000;

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

        if(!checkPermissionFromDevice())
            requestPermission();
            recordButton = findViewById(R.id.recordButton);
            recordButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        if(checkPermissionFromDevice()){
                            String folder_main = "AudioRecord";

                            File f = new File(Environment.getExternalStorageDirectory(), folder_main);
                            if (!f.exists()) {
                                f.mkdirs();
                            }
                            pathSave = Environment.getExternalStorageDirectory().getAbsolutePath()+"/AudioRecord/"+ UUID.randomUUID().toString()+"_audio_record.wav";
                            Toast.makeText(MainActivity.this,pathSave,Toast.LENGTH_SHORT).show();
                            setupMediaRecorder();
                            try {
                                mediaRecorder.prepare();
                                mediaRecorder.start();
                            } catch (IOException e){
                                e.printStackTrace();
                            }
                            Toast.makeText(MainActivity.this,"Recording Started...",Toast.LENGTH_SHORT).show();
                            textView.setText("Recording Started...");
                            //textView.setText(pathSave);
                        } else{
                            requestPermission();
                        }
                        return true;

                    case MotionEvent.ACTION_UP:
                        mediaRecorder.stop();
                        doFileUpload();
                        Toast.makeText(MainActivity.this,"Recording Finished...",Toast.LENGTH_SHORT).show();
                        return true;
                }
                return false;
            }
        });
    }
}

我不清楚你在要求什么,但我看到的最简单的决定是节省行动时间以及行动何时发生 - 检查已经过去了多少时间。 system.currentTimeMillis() 应该足够了。 它是最简单的,但甚至不是最好的。

MediaRecorder.stop() 上的 Android 文档

公共无效停止()

停止录制。 在 start() 之后调用它。 停止录制后,您必须重新配置它,就像它刚刚构建一样。 请注意,如果在调用 stop() 时未收到有效的音频/视频数据,则会故意向应用程序抛出 RuntimeException。 如果 stop() 在 start() 之后立即调用,就会发生这种情况 失败让应用程序采取相应的措施来清理 output 文件(例如删除 output 文件),因为 output 文件在发生这种情况时构造不正确。

如果在 start() 之前调用,则抛出 IllegalStateException。

您需要在调用mediaRecorder.stop();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM