P2P connection does not work on Android 11 and above

43 Views Asked by At

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?

0

There are 0 best solutions below