Fix service discovery on android 12
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
<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.ACCESS_WIFI_STATE"/>
|
||||
<uses-permission android:required="true" android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.nsd.NsdManager;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
@@ -138,6 +139,31 @@ public class DiscoverActivity extends Activity
|
||||
public void startServiceDiscovery(final String serviceType)
|
||||
{
|
||||
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);
|
||||
|
||||
@@ -218,12 +244,14 @@ public class DiscoverActivity extends Activity
|
||||
// When the network service is no longer available.
|
||||
// Internal bookkeeping code goes here.
|
||||
Log.e(TAG, "Service lost: " + service);
|
||||
multicastReleaser.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStopped(String serviceType)
|
||||
{
|
||||
Log.i(TAG, "Discovery stopped: " + serviceType);
|
||||
multicastReleaser.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -231,6 +259,7 @@ public class DiscoverActivity extends Activity
|
||||
{
|
||||
Log.e(TAG, "Discovery failed: Error code: " + errorCode);
|
||||
nsdManager.stopServiceDiscovery(this);
|
||||
multicastReleaser.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -238,6 +267,7 @@ public class DiscoverActivity extends Activity
|
||||
{
|
||||
Log.e(TAG, "Discovery failed: Error code: " + errorCode);
|
||||
nsdManager.stopServiceDiscovery(this);
|
||||
multicastReleaser.run();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ public class StartActivity extends Activity
|
||||
{
|
||||
static final String TAG = "ChildMonitor";
|
||||
private final static int PERMISSIONS_REQUEST_RECORD_AUDIO = 298349824;
|
||||
private final static int PERMISSIONS_REQUEST_MULTICAST = 298349825;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -62,12 +63,21 @@ public class StartActivity extends Activity
|
||||
public void onClick(View v)
|
||||
{
|
||||
Log.i(TAG, "Starting connection activity");
|
||||
Intent i = new Intent(getApplicationContext(), DiscoverActivity.class);
|
||||
startActivity(i);
|
||||
if (isMulticastPermissionGranted()) {
|
||||
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() {
|
||||
return ContextCompat.checkSelfPermission(StartActivity.this, Manifest.permission.RECORD_AUDIO)
|
||||
== PackageManager.PERMISSION_GRANTED;
|
||||
@@ -79,11 +89,20 @@ public class StartActivity extends Activity
|
||||
PERMISSIONS_REQUEST_RECORD_AUDIO);
|
||||
}
|
||||
|
||||
private void requestMulticastPermission() {
|
||||
ActivityCompat.requestPermissions(StartActivity.this,
|
||||
new String[]{Manifest.permission.CHANGE_WIFI_MULTICAST_STATE},
|
||||
PERMISSIONS_REQUEST_MULTICAST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||
if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO && grantResults.length > 0
|
||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user