首页>代码>Android开发WIFI局域网对讲机WifiTalk>/Wifi对讲机/src/com/wifitalk/Activity/MainActivity.java
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日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友