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.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"
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user