Fix service discovery on android 12

This commit is contained in:
edr
2023-06-30 17:45:04 +02:00
parent 40fd35c20e
commit 6ceda0b022
3 changed files with 52 additions and 2 deletions

View File

@@ -8,6 +8,7 @@
<uses-permission android:required="true" android:name="android.permission.INTERNET"/> <uses-permission android:required="true" android:name="android.permission.INTERNET"/>
<uses-permission android:required="true" android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:required="true" android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:required="true" android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:required="true" android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:required="true" android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<application <application
android:allowBackup="true" android:allowBackup="true"

View File

@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.nsd.NsdManager; import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdServiceInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@@ -138,6 +139,31 @@ public class DiscoverActivity extends Activity
public void startServiceDiscovery(final String serviceType) public void startServiceDiscovery(final String serviceType)
{ {
final NsdManager nsdManager = (NsdManager)this.getSystemService(Context.NSD_SERVICE); final NsdManager nsdManager = (NsdManager)this.getSystemService(Context.NSD_SERVICE);
if (nsdManager == null) {
Log.e(TAG, "Could not obtain nsdManager");
return;
}
WifiManager wifi = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
final Runnable multicastReleaser;
if (wifi != null) {
final WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
multicastReleaser = new Runnable() {
@Override
public void run() {
multicastLock.release();
}
};
} else {
multicastReleaser = new Runnable() {
@Override
public void run() {
}
};
}
final ListView serviceTable = (ListView) findViewById(R.id.ServiceTable); final ListView serviceTable = (ListView) findViewById(R.id.ServiceTable);
@@ -218,12 +244,14 @@ public class DiscoverActivity extends Activity
// When the network service is no longer available. // When the network service is no longer available.
// Internal bookkeeping code goes here. // Internal bookkeeping code goes here.
Log.e(TAG, "Service lost: " + service); Log.e(TAG, "Service lost: " + service);
multicastReleaser.run();
} }
@Override @Override
public void onDiscoveryStopped(String serviceType) public void onDiscoveryStopped(String serviceType)
{ {
Log.i(TAG, "Discovery stopped: " + serviceType); Log.i(TAG, "Discovery stopped: " + serviceType);
multicastReleaser.run();
} }
@Override @Override
@@ -231,6 +259,7 @@ public class DiscoverActivity extends Activity
{ {
Log.e(TAG, "Discovery failed: Error code: " + errorCode); Log.e(TAG, "Discovery failed: Error code: " + errorCode);
nsdManager.stopServiceDiscovery(this); nsdManager.stopServiceDiscovery(this);
multicastReleaser.run();
} }
@Override @Override
@@ -238,6 +267,7 @@ public class DiscoverActivity extends Activity
{ {
Log.e(TAG, "Discovery failed: Error code: " + errorCode); Log.e(TAG, "Discovery failed: Error code: " + errorCode);
nsdManager.stopServiceDiscovery(this); nsdManager.stopServiceDiscovery(this);
multicastReleaser.run();
} }
}; };

View File

@@ -31,6 +31,7 @@ public class StartActivity extends Activity
{ {
static final String TAG = "ChildMonitor"; static final String TAG = "ChildMonitor";
private final static int PERMISSIONS_REQUEST_RECORD_AUDIO = 298349824; private final static int PERMISSIONS_REQUEST_RECORD_AUDIO = 298349824;
private final static int PERMISSIONS_REQUEST_MULTICAST = 298349825;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -62,12 +63,21 @@ public class StartActivity extends Activity
public void onClick(View v) public void onClick(View v)
{ {
Log.i(TAG, "Starting connection activity"); Log.i(TAG, "Starting connection activity");
Intent i = new Intent(getApplicationContext(), DiscoverActivity.class); if (isMulticastPermissionGranted()) {
startActivity(i); Intent i = new Intent(getApplicationContext(), DiscoverActivity.class);
startActivity(i);
} else {
requestMulticastPermission();
}
} }
}); });
} }
private boolean isMulticastPermissionGranted() {
return ContextCompat.checkSelfPermission(StartActivity.this, Manifest.permission.CHANGE_WIFI_MULTICAST_STATE)
== PackageManager.PERMISSION_GRANTED;
}
private boolean isAudioRecordingPermissionGranted() { private boolean isAudioRecordingPermissionGranted() {
return ContextCompat.checkSelfPermission(StartActivity.this, Manifest.permission.RECORD_AUDIO) return ContextCompat.checkSelfPermission(StartActivity.this, Manifest.permission.RECORD_AUDIO)
== PackageManager.PERMISSION_GRANTED; == PackageManager.PERMISSION_GRANTED;
@@ -79,11 +89,20 @@ public class StartActivity extends Activity
PERMISSIONS_REQUEST_RECORD_AUDIO); PERMISSIONS_REQUEST_RECORD_AUDIO);
} }
private void requestMulticastPermission() {
ActivityCompat.requestPermissions(StartActivity.this,
new String[]{Manifest.permission.CHANGE_WIFI_MULTICAST_STATE},
PERMISSIONS_REQUEST_MULTICAST);
}
@Override @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO && grantResults.length > 0 if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO && grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) { && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startActivity(new Intent(getApplicationContext(), MonitorActivity.class)); startActivity(new Intent(getApplicationContext(), MonitorActivity.class));
} else if (requestCode == PERMISSIONS_REQUEST_MULTICAST) {
// its okay if the permission was denied... the user will have to type the address manually
startActivity(new Intent(getApplicationContext(), DiscoverActivity.class));
} }
} }
} }