package com.wifitalk.Activity; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import com.wifitalk.R; import com.wifitalk.Config.AppConfig; import android.annotation.SuppressLint; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaRecorder; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.TextView; @SuppressLint("ClickableViewAccessibility") public class MainActivity extends Activity { private Button speakButton;// 按住说话 private TextView message; private SendSoundsThread sendSoundsThread = new SendSoundsThread(); private ReceiveSoundsThread receiveSoundsThread = new ReceiveSoundsThread(); private boolean isFirst = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); message = (TextView) findViewById(R.id.Message); speakButton = (Button) findViewById(R.id.speakButton); speakButton.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { message.setText("松开结束"); if (isFirst) { sendSoundsThread.start(); receiveSoundsThread.start(); isFirst = false; } sendSoundsThread.setRunning(true); receiveSoundsThread.setRunning(false); } else if (event.getAction() == MotionEvent.ACTION_UP) { message.setText("按住说话"); sendSoundsThread.setRunning(false); receiveSoundsThread.setRunning(true); } return false; } }); } class SendSoundsThread extends Thread { private AudioRecord recorder = null; private boolean isRunning = false; private byte[] recordBytes = new byte[640]; public SendSoundsThread() { super(); // 录音机 int recordBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufferSize); } @Override public synchronized void run() { super.run(); recorder.startRecording(); while (true) { if (isRunning) { try { DatagramSocket clientSocket = new DatagramSocket(); InetAddress IP = InetAddress.getByName("192.168.137.0");// 向这个网络广播 //注意:单纯的广播后果:接收线程虽然已经停止 但是当按键弹起后它会启动 就会接收网络广播 造成听到自己的声音 recorder.read(recordBytes, 0, recordBytes.length); DatagramPacket sendPacket = new DatagramPacket(recordBytes, recordBytes.length, IP, AppConfig.Port); clientSocket.send(sendPacket); clientSocket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } } class ReceiveSoundsThread extends Thread { private AudioTrack player = null; private boolean isRunning = false; private byte[] recordBytes = new byte[640]; public ReceiveSoundsThread() { // 播放器 int playerBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); player = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, playerBufferSize, AudioTrack.MODE_STREAM); } @Override public synchronized void run() { super.run(); try { @SuppressWarnings("resource") DatagramSocket serverSocket = new DatagramSocket(AppConfig.Port); while (true) { if (isRunning) { DatagramPacket receivePacket = new DatagramPacket(recordBytes, recordBytes.length); serverSocket.receive(receivePacket); byte[] data = receivePacket.getData(); player.write(data, 0, data.length); player.play(); } } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } } @Override protected void onDestroy() { super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); } }

panwill LV5
2024年4月19日
andyzhang9678 LV1
2024年3月28日
johnZhang2024 LV1
2024年2月28日
lxb_tw123 LV1
2023年12月10日
hceirkj LV1
2023年9月22日
476740677 LV1
2023年6月2日
levishao LV1
2023年3月15日
微信网友_6360398282903552 LV1
2023年2月22日
hzzhuzhai LV1
2023年2月8日
大出血 LV1
2023年1月6日

youwuzuichen LV11
2024年12月19日
anjuw521 LV1
2024年7月9日
2636804923 LV6
2024年6月20日
panwill LV5
2024年4月19日
andyzhang9678 LV1
2024年3月28日
johnZhang2024 LV1
2024年2月28日
lxb_tw123 LV1
2023年12月10日
hceirkj LV1
2023年9月22日
pgx123 LV1
2023年7月21日
404279232
2023年6月27日
暂无贡献等级