Фильтровать список пиров (устройств) в Wifi Direct - PullRequest
0 голосов
/ 11 февраля 2020

Я занимаюсь разработкой приложения android для обмена данными между двумя устройствами с помощью Wifi Direct. Все работает отлично, я могу показать список пиров в своем приложении и могу передавать данные между ними. Моя единственная проблема - в списке пиров. Я просто хочу показать устройства, которые используют мое приложение и будут отображаться на телефоне отправителей, когда они находятся в режиме приема. я нашел связанный вопрос моей проблемы, но бесполезный для меня.

android wifi p2p: фильтрация обнаружения пиров

Вот мой фрагмент передачи, в котором я получаю список пиров

public class TransferFragment extends Fragment implements LocationListener, peerListClickListener {

private static final String TAG = TransferFragment.class.getName();

private WifiP2pManager mWifiP2pManager;
private WifiP2pManager.Channel mChannel;
private List<WifiP2pDevice> mPeerList = new ArrayList<>();
private IntentFilter mIntentFilter;
private BroadcastReceiver mReceiver;
PeerListAdapter peerListAdapter;
LocationManager locationManager;
RecyclerView peersRecyclerView;
String provider;
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        try {
            startDiscoverPeers();
            mHandler.postDelayed(this, 8000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initWifiP2p();
    getActivity().registerReceiver(mReceiver, mIntentFilter);

    locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
    assert locationManager != null;
    provider = locationManager.getBestProvider(new Criteria(), false);

}

@Override
public void onResume() {
    super.onResume();
    mHandler.post(mRunnable);

}

@Override
public void onDestroy() {
    super.onDestroy();
    getActivity().unregisterReceiver(mReceiver);
}

private void initWifiP2p() {

    mIntentFilter = new IntentFilter();
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    mWifiP2pManager = (WifiP2pManager) getActivity().getSystemService(Context.WIFI_P2P_SERVICE);
    assert mWifiP2pManager != null;
    mChannel = mWifiP2pManager.initialize(getActivity(), getActivity().getMainLooper(), null);
    mReceiver = new WiFiDirectReceiver(mWifiP2pManager, mChannel, (MainActivity) getActivity());
    deletePersistentGroups();
}

private void deletePersistentGroups() {
    try {
        Method[] methods = WifiP2pManager.class.getMethods();
        for (Method method : methods) {
            if (method.getName().equals("deletePersistentGroup")) {
                // Delete any persistent group
                for (int netid = 0; netid < 32; netid++) {
                    method.invoke(mWifiP2pManager, mChannel, netid, null);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_transfer, container, false);
    RippleBackground rippleBackground = view.findViewById(R.id.content);
    rippleBackground.startRippleAnimation();
    peersRecyclerView = view.findViewById(R.id.peer_recyclerview);

    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

}


private void startDiscoverPeers() {
    mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
            Log.e(TAG, "discover success");
        }

        @Override
        public void onFailure(int reason) {
            Log.e(TAG, "discover failure");
        }
    });
}

public void stopDiscover() {

    mHandler.removeCallbacks(mRunnable);
}

private void connectP2p(final WifiP2pDevice device) {

    final WifiP2pConfig config = new WifiP2pConfig();
    config.groupOwnerIntent = 0;
    config.deviceAddress = device.deviceAddress;
    config.wps.setup = WpsInfo.DISPLAY;
    mWifiP2pManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {

        @Override
        public void onSuccess() {
           Toast.makeText(getActivity(), "Connected To " + device.deviceName, Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onFailure(int errorCode) {

        }
    });
}


public void updateList(WifiP2pDeviceList peers) {
    mPeerList.clear();
    mPeerList.addAll(peers.getDeviceList());//here i am getting devices list//
    showPeersList();
}

@Override
public void onLocationChanged(Location location) {
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onPeerClicked(int position, WifiP2pDevice device) {
    connectP2p(device);
    peerListAdapter.notifyDataSetChanged();
}

public static String getDeviceStatus(int statusCode) {
    switch (statusCode) {
        case WifiP2pDevice.CONNECTED:
            return "Connected";
        case WifiP2pDevice.INVITED:
            return "Invited";
        case WifiP2pDevice.FAILED:
            return "Failed";
        case WifiP2pDevice.AVAILABLE:
            return "Available";
        case WifiP2pDevice.UNAVAILABLE:
            return "Unavailable";
        default:
            return "Unknown";

    }
}



@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 101: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // location-related task you need to do.
                if (ContextCompat.checkSelfPermission(getActivity(),
                        Manifest.permission.ACCESS_FINE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED) {

                    //Request location updates:
                    locationManager.requestLocationUpdates(provider, 400, 1, TransferFragment.this);
                }

            }
        }

    }
}

private void showPeersList() {

    peersRecyclerView.hasFixedSize();
    peerListAdapter = new PeerListAdapter(mPeerList, getActivity(), this);
    peersRecyclerView.setAdapter(peerListAdapter);
    peersRecyclerView.setNestedScrollingEnabled(false);
    peersRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));

}}

Я хочу знать, есть ли способ их отфильтровать, или мне нужно сделать какой-то сервис в моем приложении.

...