I'm developing a process to discover and connect to nearby printers using P2p. I referred to the official Android documentation and it is normal on Android 9 version phones, but p2p devices are not received on devices with version 11 or higher.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />/>
<uses-permission
android:required="true"
android:name="android.permission.INTERNET" />
<uses-permission
android:required="true"
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:required="true"
android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
private class P2pListener implements P2pPeerListener {
@Override
public void onPeerFound(WifiP2pDevice peer) {
if (DEBUG) Log.d(TAG, "onPeerFound: " + P2pMonitor.toString(peer));
}
@Override
public void onPeerLost(WifiP2pDevice peer) {
if (DEBUG) Log.d(TAG, "onPeerLost: " + P2pMonitor.toString(peer));
}
}
mP2pManager = p2pManager;
if (DEBUG) Log.d(TAG, "P2pDiscoveryProcedure()");
mChannel = mP2pManager.initialize(service, Looper.getMainLooper(), null);
mListeners.add(listener);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (DEBUG) Log.d(TAG, "P2pDiscoveryProcedure onReceive()");
String action = intent.getAction();
if (DEBUG) Log.d(TAG, "action = " + action);
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
if (DEBUG) Log.d(TAG, "WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)");
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
boolean isP2pEnabled = state == WifiP2pManager.WIFI_P2P_STATE_ENABLED;
if (DEBUG) Log.d(TAG, "WIFI_P2P_STATE_CHANGED_ACTION: enabled=" + isP2pEnabled);
if (isP2pEnabled) {
mP2pManager.stopPeerDiscovery(mChannel, null);
mP2pManager.discoverPeers(mChannel, null);
}
} if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
if (DEBUG) Log.d(TAG, "WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)");
WifiP2pDeviceList list = intent.getParcelableExtra(
WifiP2pManager.EXTRA_P2P_DEVICE_LIST);
Collection<WifiP2pDevice> newPeers = list.getDeviceList();
updatePeers(newPeers);
if (newPeers.isEmpty()) {
// Remind system we are still interested
mP2pManager.stopPeerDiscovery(mChannel, null);
mP2pManager.discoverPeers(mChannel, null);
}
}
}
};
mBroadcastMonitor = service.receiveBroadcasts(receiver,
WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION,
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mP2pManager.discoverPeers(mChannel, null);
I applied everything including ‘permissions’ and ‘intent filters’ required in the document.
However, in onReceive(), if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) is received, but if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) is not received.
Are additional codes or permissions required for Android 11 or higher?