Я хочу сделать P2p игру в андроид студии.Для этого я создал 2 класса, которые устанавливают соединение p2p.Теперь я хочу использовать этот класс в любом действии в моей игре (потому что мне нужно, чтобы любое действие отправляло данные для второго устройства).Как я могу это сделать?
Это мой класс сетевого менеджера:
public class NetworkManager extends AppCompatActivity {
WifiManager wifiManager;
public static WifiP2pManager wifiP2pManager;
WifiP2pManager.Channel channel;
BroadcastReceiver broadcastReceiver;
IntentFilter intentFilter;
List<WifiP2pDevice> peers = new ArrayList<>();
String[] deviceNameArray;
WifiP2pDevice[] deviceArray;
static final int MESSAGE_READ = -1;
ServerClass serverClass;
ClientClass clientClass;
SendReceive sendReceive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiP2pManager = (WifiP2pManager) getApplicationContext().getSystemService(Context.WIFI_P2P_SERVICE);
channel = wifiP2pManager.initialize(getApplicationContext(), getApplicationContext().getMainLooper(), null);
broadcastReceiver = new WifiDirectBroadcastReceiver(wifiP2pManager, channel, this);
intentFilter = new IntentFilter();
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
}
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
case MESSAGE_READ:
byte[] readBuff = (byte[]) msg.obj;
String tempMsg = new String(readBuff, 0, msg.arg1);
Toast.makeText(getApplicationContext(), tempMsg, Toast.LENGTH_LONG).show();
}
return true;
}
});
public WifiP2pManager.PeerListListener peerListListener = new WifiP2pManager.PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
if (!peerList.getDeviceList().equals(peers)){
peers.clear();
peers.addAll(peerList.getDeviceList());
deviceNameArray = new String[peerList.getDeviceList().size()];
deviceArray = new WifiP2pDevice[peerList.getDeviceList().size()];
int index = 0;
for (WifiP2pDevice device : peerList.getDeviceList()){
deviceNameArray[index] = device.deviceName;
deviceArray[index] = device;
index++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, deviceNameArray);
//mainActivity.listView.setAdapter(adapter); **ERROR** NEED TO FIND A WAY TO MAKE THIS ADAPTER
}
if (peerList.getDeviceList().size() == 0){
Toast.makeText(getApplicationContext(), "NO DEVICE FOUND", Toast.LENGTH_SHORT).show();
return;
}
}
};
public WifiP2pManager.ConnectionInfoListener connectionInfoListener = new WifiP2pManager.ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(WifiP2pInfo info) {
final InetAddress groupOwnerAddress = info.groupOwnerAddress;
if (info.groupFormed && info.isGroupOwner) {
Toast.makeText(getApplicationContext(), "Host", Toast.LENGTH_SHORT).show();
serverClass = new ServerClass();
serverClass.start();
}
else{
Toast.makeText(getApplicationContext(), "Client", Toast.LENGTH_SHORT).show();
clientClass = new ClientClass(groupOwnerAddress);
clientClass.start();
}
}
};
public class ServerClass extends Thread{
Socket socket;
ServerSocket serverSocket;
@Override
public void run() {
try {
serverSocket = new ServerSocket(8888);
socket = serverSocket.accept();
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class SendReceive extends Thread{
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
public SendReceive(Socket socket) {
this.socket = socket;
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (socket != null){
try {
bytes = inputStream.read(buffer);
if (bytes > 0)
handler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void write(byte[] bytes){
try {
outputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ClientClass extends Thread{
Socket socket;
String hostAdd;
public ClientClass(InetAddress hostAddress) {
hostAdd = hostAddress.getHostAddress();
socket = new Socket();
}
@Override
public void run() {
try {
socket.connect(new InetSocketAddress(hostAdd, 8888),500);
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Это мой класс WifiDirectBroadcastReceiver:
public class WifiDirectBroadcastReceiver extends BroadcastReceiver {
WifiP2pManager wifiP2pManager;
WifiP2pManager.Channel channel;
NetworkManager networkManager;
public WifiDirectBroadcastReceiver(WifiP2pManager wifiP2pManager, WifiP2pManager.Channel channel, NetworkManager networkManager) {
this.wifiP2pManager = wifiP2pManager;
this.channel = channel;
this.networkManager = networkManager;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (wifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)){
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == wifiP2pManager.WIFI_P2P_STATE_ENABLED)
Toast.makeText(context, "Wifi is ON", Toast.LENGTH_SHORT).show();
else
Toast.makeText(context, "Wifi is OFF", Toast.LENGTH_SHORT).show();
} else if (wifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){
if (wifiP2pManager != null)
wifiP2pManager.requestPeers(channel,networkManager.peerListListener);
} else if (wifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)){
if (wifiP2pManager == null)
return;
NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if (networkInfo.isConnected())
wifiP2pManager.requestConnectionInfo(channel, networkManager.connectionInfoListener);
} else if (wifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)){
}
}
Я хочу в основной активностииспользуйте классы WifiP2pManager.PeerListListener и SendReceive, потому что я хочу отправлять данные на другое устройство в основном и игровом действиях.Когда я пытаюсь сделать все в одном упражнении (скопировать весь код сетевого менеджера в основное занятие), все работает отлично.Пожалуйста, помогите мне сделать это.