qq_30757609 2017-03-10 06:13 采纳率: 0%
浏览 1205
已结题

为什么一按录音按钮,显示开始录音接着就结束录音?

package com.cbt.SHDemo;

import java.io.File;
import java.util.Date;

import com.cbt.SHDemo.EnvActivity.BackLoginListener;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class SleepActivity extends Activity {
private MediaPlayer mPlayer = null;
public String path = "";
private ImageButton bt_start;
private Button play_start;
private Button stop_play;
private Button exit;
private TextView Text_path;
private TextView Text_size;
private TextView Text_time;
private LinearLayout mlinearLayout;
private MediaRecorder mediaRecorder = null;
Date mdata1;
Date mdata2;
long time1;
long cha;
long time2;
private boolean isruning = false; // 定义一个布尔类型的变量来监控是否正在录音

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sleep);
    bt_start = (ImageButton) findViewById(R.id.start);
    stop_play = (Button) findViewById(R.id.stop_play);
    play_start = (Button) findViewById(R.id.start_play);
    exit = (Button) findViewById(R.id.exit);
    exit.setOnClickListener(new BackLoginListener());
    Text_path = (TextView) findViewById(R.id.textlujing);
    Text_size = (TextView) findViewById(R.id.textsize);
    Text_time = (TextView) findViewById(R.id.texttime);
    mlinearLayout = (LinearLayout) findViewById(R.id.stoplin);

    mlinearLayout.setVisibility(View.GONE);

    bt_start.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            int i = event.getAction();
            switch (i) {
            case MotionEvent.ACTION_DOWN:
                Toast.makeText(SleepActivity.this, "开启录音...",
                        Toast.LENGTH_SHORT).show();
                mediaRecorder = null;
                mdata1 = new Date();
                time1 = mdata1.getTime(); // 当前时间
                System.out.println("当前时间为1:" + time1);
                record();
                break;
            case MotionEvent.ACTION_UP:
                if (isruning) { // 如果正在录音
                    Toast.makeText(SleepActivity.this, "终止录音...",
                            Toast.LENGTH_SHORT).show();
                    mediaRecorder.stop(); // 停止录音
                    mediaRecorder.release(); // 释放资源
                    mlinearLayout.setVisibility(View.VISIBLE); // 可见
                    information();
                    mdata2 = new Date();

                    time2 = mdata2.getTime(); // 当前时间
                    System.out.println("当前时间为2:" + time2);
                    cha = (time2 - time1) / 1000;
                    System.out.println("时间差为:" + cha + "秒");
                    Text_time.setText(cha + " 秒");
                }
                break;
            default:
                break;
            }

            return false;
        }
    });

    play_start.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            System.out.println("play_start");
            Toast.makeText(SleepActivity.this, "播放录音...", Toast.LENGTH_SHORT)
                    .show();
            mPlayer = null;
            startPlaying();

        }
    });
    stop_play.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            stopPlaying();

        }
    });



}

// 该方法 是用来是实现录音功能并保存到制定文件中
class BackLoginListener implements OnClickListener {

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setClass(SleepActivity.this, HomePage.class);
        startActivity(intent);
        SleepActivity.this.finish();
    }
}
public void record() {

    if (mediaRecorder == null) {
        mediaRecorder = new MediaRecorder(); // 判断是都为空 如果为空new 一个对象
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置输入源为麦克风
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置输出格式
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频的编码
                                                                            // 默认
        // 创建一个临时文件来存储音频
        path = Environment.getExternalStorageDirectory().getPath()
                + "/test_Audio.mp3";
        mediaRecorder.setOutputFile(path);
        // mediaRecorder.getMaxAmplitude() 获取文件的大小
        try {
            mediaRecorder.prepare(); // 准备录音
        } catch (Exception e) {
            e.printStackTrace();
        }
        mediaRecorder.start(); // 开启录音
        isruning = true; // 正在录音
    }
}

private void startPlaying() {
    try {
        mPlayer = new MediaPlayer();
        // 设置要播放的文件
        mPlayer.setDataSource(path);
        mPlayer.prepare();
        mPlayer.start();

    } catch (Exception e) {
        mPlayer.release();
        e.printStackTrace();
    }
}

// 停止播放
private void stopPlaying() {
    if (mPlayer == null) {
        Toast.makeText(SleepActivity.this, "您还没播放任何音频", Toast.LENGTH_SHORT)
                .show();
    } else {

        mPlayer.release();
        mPlayer = null;
        play_start.setEnabled(true);
        Toast.makeText(SleepActivity.this, "已终止播放", Toast.LENGTH_SHORT)
                .show();
    }

}

// 设置文件信息布局information

public void information() {
    File mfile = new File(path);
    Text_path.setText(path);
    getFilesize size = new getFilesize();
    long msize = size.getFileSize(mfile) / 1024; // 获得文件大小
    Text_size.setText(msize + "KB");

}

}

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?