Сделай P2P игру в андроид студии - PullRequest
0 голосов
/ 06 октября 2018

Я хочу сделать 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, потому что я хочу отправлять данные на другое устройство в основном и игровом действиях.Когда я пытаюсь сделать все в одном упражнении (скопировать весь код сетевого менеджера в основное занятие), все работает отлично.Пожалуйста, помогите мне сделать это.

...