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日
暂无贡献等级

