【问题标题】:How can i get both OnClick and OnTouch Listeners for an ImageButton?如何获得 ImageButton 的 OnClick 和 OnTouch 侦听器?
【发布时间】:2019-11-21 16:12:08
【问题描述】:

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

这是我的代码:

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;
            }
        });
    }
}

【问题讨论】:

  • 权限在manifest文件中吗?他们是否被应用程序授予?如果您显示异常会很有用。
  • 是的,我在清单文件中设置了权限,它们是由应用授予的。按住按钮时会录制我的声音。但是,当我单击按钮而不是按住它时,会显示此错误。进程:com.example.audiorecordingpractice,PID:18206 java.lang.RuntimeException:停止失败。在 android.media.MediaRecorder.native_stop(Native Method)
  • 可能是这个原因,因为mediarecorder在释放按钮时无法初始化,触发ACTION_UP。启动 mediarecorder 后,您可以使用布尔标志 started = true。而在ACTION_UP事件中,你可以检查started的值是否为真,然后继续。

标签: java android android-imageview onclicklistener ontouchlistener


【解决方案1】:

MediaRecorder.stop() 上的 Android 文档

公共无效停止()

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

投掷 如果在 start() 之前调用 IllegalStateException。

你需要在调用mediaRecorder.stop();时捕获这个异常

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 2013-11-01
    • 1970-01-01
    • 2012-01-02
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多