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