UDP-сокет не принимает дейтаграммы на Android 6 (M)
Мой код ниже работает нормально на Android 5.1.1, показывая датаграмму, полученную на моей консоли.
byte[] message = new byte[500];
try {
String text;
int server_port = 3421;
DatagramPacket p = new DatagramPacket(message, message.length);
DatagramSocket s = new DatagramSocket(server_port);
s.receive(p);
Log.d("APP", "After received");
final String hexMsg = bytesToHex(message);
Log.d("APP","message:" + hexMsg);
s.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
По какой-то неизвестной причине, когда я запускаю тот же код на Android 6.0.1, я не получаю никаких дейтаграмм. Ошибка не отображается на консоли.
Мой UDP-сервер отправляет датаграмму непосредственно на мое устройство Android (так что это не трансляция).
Полный код класса:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1) {
String pkg=getPackageName();
PowerManager pm=getSystemService(PowerManager.class);
if (!pm.isIgnoringBatteryOptimizations(pkg)) {
Intent i= new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
.setData(Uri.parse("package:" + pkg));
startActivity(i);
}
}
new myAsync().execute();
}
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
class myAsync extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
byte[] message = new byte[500];
try {
String text;
int server_port = 3421;
DatagramPacket p = new DatagramPacket(message, message.length);
DatagramSocket s = new DatagramSocket(server_port);
s.receive(p);
Log.d("APP", "After received");
final String hexMsg = bytesToHex(message);
Log.d("APP","message:" + hexMsg);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), hexMsg, Toast.LENGTH_LONG).show();
}
});
s.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// Handle/Update UI Part
}
}
}
Есть идеи, в чем может быть проблема?
1 ответ
Решение
Я смог заставить его работать, сделав 2 изменения:
1) Разрешение повторного использования адреса с помощью:
DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress(server_port));
вместо
DatagramSocket s = new DatagramSocket(server_port);
2) Использование Runnable Thread вместо метода Async.