但是如果可以直接利用wifi direct的方式連接的話,不需要連接AP就可以直接溝通了。
在MainActivity.java中,透過implement WifiP2pManager.PeerListListener, 以及WifiP2pManager.ConnectionInfoListener來做。
這個寫法是直接搜尋附近最近一個可以連線的裝置,找到之後會自動連線。
完整程式碼 MainActivity.java:
- import android.annotation.SuppressLint;
- import android.bluetooth.BluetoothAdapter;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.net.NetworkInfo;
- import android.net.wifi.WifiManager;
- import android.net.wifi.WpsInfo;
- import android.net.wifi.p2p.WifiP2pConfig;
- import android.net.wifi.p2p.WifiP2pDevice;
- import android.net.wifi.p2p.WifiP2pDeviceList;
- import android.net.wifi.p2p.WifiP2pGroup;
- import android.net.wifi.p2p.WifiP2pInfo;
- import android.net.wifi.p2p.WifiP2pManager;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.TextView;
- import java.util.ArrayList;
- import java.util.List;
- public class MainActivity extends AppCompatActivity implements WifiP2pManager.PeerListListener, WifiP2pManager.ConnectionInfoListener {
- private final String TAG = "MainActivity";
- private boolean isDeviceFound = false;
- private TextView tvMacAddress, tvConnectDevice, tvConnectStatus;
- private WifiP2pManager.Channel mChannel;
- private WifiP2pManager mWifiP2pManager;
- private final IntentFilter intentFilter = new IntentFilter();
- private List
peers = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // find view by id tvMacAddress = (TextView)findViewById(R.id.id_tvMacAddress); tvConnectDevice = (TextView)findViewById(R.id.id_tvConnectDevice); tvConnectStatus = (TextView)findViewById(R.id.id_tvConnectStatus); disconnectFunc(); WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); BluetoothAdapter myDevice = BluetoothAdapter.getDefaultAdapter(); if (mWifiManager != null) { // Turn on wifi mWifiManager.setWifiEnabled(true); // get my device and mac address tvMacAddress.setText(myDevice.getName() + ", MAC[" + mWifiManager.getConnectionInfo().getMacAddress() + "]"); } // setup wifi p2p 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); registerReceiver(mReceiver, intentFilter); mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); mChannel = mWifiP2pManager.initialize(this, getMainLooper(), null); mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Log.d(TAG,"discoverPeers onSuccess"); } @Override public void onFailure(int reasonCode) { Log.d(TAG,"discoverPeers onFailure"); } }); } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { Log.d(TAG,"WIFI_P2P_STATE_CHANGED_ACTION"); } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { Log.d(TAG,"WIFI_P2P_PEERS_CHANGED_ACTION"); if (mWifiP2pManager != null) { mWifiP2pManager.requestPeers(mChannel, MainActivity.this); } } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { Log.d(TAG,"WIFI_P2P_CONNECTION_CHANGED_ACTION"); if (mWifiP2pManager == null) { return; } NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); if (networkInfo.isConnected()) { mWifiP2pManager.requestConnectionInfo(mChannel, MainActivity.this); } } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { Log.d(TAG,"WIFI_P2P_THIS_DEVICE_CHANGED_ACTION"); } } }; // search available devices and auto connect first one @Override public void onPeersAvailable(WifiP2pDeviceList peerList) { peers.clear(); peers.addAll(peerList.getDeviceList()); String[] peersMacAddress, peersDeviceName; if (peers.size() == 0) { Log.d(TAG, "No devices found"); tvConnectStatus.setText("no connected"); peersMacAddress = new String[1]; peersMacAddress[0]="No Devices found"; peersDeviceName = new String[1]; peersDeviceName[0]="No Devices found"; } else{ peersMacAddress = new String[peers.size()]; peersDeviceName = new String[peers.size()]; int i=0, j=0; for(WifiP2pDevice device: peers){ peersDeviceName[i++] = device.deviceName; peersMacAddress[j++] = device.deviceAddress; // find the first device and auto connect if(device.deviceAddress.equals(peersMacAddress[0])){ tvConnectDevice.setText(peersDeviceName[0] + ", MAC[" + peersMacAddress[0] + "]"); if(!isDeviceFound){ connectFunc(); isDeviceFound = true; } } } } } // check connect status @Override public void onConnectionInfoAvailable(WifiP2pInfo info) { tvConnectDevice.setText("Stop Searching"); tvConnectStatus.setText("Device already connected"); } private void connectFunc(){ Log.d(TAG, "connectFunc"); WifiP2pDevice device = peers.get(0); WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; config.wps.setup = WpsInfo.PBC; mWifiP2pManager.connect(mChannel, config, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Log.d(TAG,"connect success"); tvConnectStatus.setText("device connected"); } @Override public void onFailure(int reason) { Log.d(TAG,"connect fail"); } }); } private void disconnectFunc(){ Log.d(TAG, "disconnectFunc"); if (mWifiP2pManager != null && mChannel != null) { mWifiP2pManager.requestGroupInfo(mChannel, new WifiP2pManager.GroupInfoListener() { @Override public void onGroupInfoAvailable(WifiP2pGroup group) { if (group != null && mWifiP2pManager != null && mChannel != null && group.isGroupOwner()) { mWifiP2pManager.removeGroup(mChannel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Log.d(TAG, "removeGroup onSuccess -"); } @Override public void onFailure(int reason) { Log.d(TAG, "removeGroup onFailure -" + reason); } }); } } }); } } }
補上xml:
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.chris.myapplication.MainActivity">
- <TextView
- android:id="@+id/id_tvMyDevice"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="My Device:"
- app:layout_constraintStart_toStartOf="parent" />
- <TextView
- android:id="@+id/id_tvMacAddress"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="My Mac Address"
- app:layout_constraintTop_toBottomOf="@+id/id_tvMyDevice" />
- <TextView
- android:id="@+id/id_tvDeviceFound"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
- android:text="Device Found:"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/id_tvMacAddress" />
- <TextView
- android:id="@+id/id_tvConnectDevice"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Searching..."
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/id_tvDeviceFound" />
- <TextView
- android:id="@+id/id_tvConnectStatus"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
- android:text="no connected"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/id_tvConnectDevice" />
- </android.support.constraint.ConstraintLayout>
在AndroidManifest.xml加入權限:
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="android.permission.BLUETOOTH"/>
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
連線成功之後,接下來有時間再來寫加入UDP傳輸試試看。
END
沒有留言:
張貼留言