2016-03-18 204 views
4

我有问题,从与新的Nexus 5X(棉花糖)服务器接收UDP

我有收到的所有UDP数据包的另一个真实设备不断收到UDP数据包,但似乎事情发生了转变在Android的API 23

CODE:

任何有同样的问题?

     if (s == null || s.isClosed()){ 


          Log.v("udp", "----------------------------------------------------new socket---------------------------------"); 


          s = new DatagramSocket(null); 
          s.setReuseAddress(true); 
          s.setBroadcast(true); 
          s.setSoTimeout(5000); 
          s.bind(new InetSocketAddress(8002)); 
          p = new DatagramPacket(message, message.length); 

          try{ 
           Thread.sleep(100); 
          } 
          catch(Exception e){ 

          } 
         } 



         //Log.v("test","---------------------------------------------------- Pas1 ---------------------------------"); 
         message = new byte[100]; 
         //p = new DatagramPacket(message, message.length); 
         p.setLength(message.length); 

         s.receive(p); 

的问题是:

我收到随机的广播包,同时在我收到的所有其他真实设备。如果它在缓冲区中有一个数据包,它只会“触发”,但如果它没有在“内部”中调用,则会出现套接字超时时间。

谢谢!

+0

你的监听器上有MulticastLock,对不对? – SergeyA

+0

是的。我有一个多点传送锁。此代码在asyntask中运行。 –

+0

对不起,没有更多的想法。我在Android上有一个可用的UDP广播,但是我从未在棉花糖上试过它,所以不能说任何合理的东西。 – SergeyA

回答

2

Android Marsmallow介绍休眠模式,在一段时间后会暂停网络访问。也许这也影响你的应用程序。

以下限制适用于您的应用程序,而在打盹:

- 网络访问暂停

- ...

http://developer.android.com/training/monitoring-device-state/doze-standby.html

坏消息是tha除了要求用户将您的应用程序列入免除电池优化应用程序的清单外,您无法对此做太多的了解。但请注意,因为Google可能会从Play商店中删除您的应用程序(这是为什么我没有包含它的源代码)。

”然而,谷歌认为“应用程序的核心功能”的重要性不在于用户而在于开发人员谷歌用户和开发人员可能与添加应用程序到白名单中的手段,但如果谷歌认为,这是不值得,谷歌将自己当作是比用户更重要,禁止应用程序。“(https://commonsware.com/blog/2015/11/11/google-anti-trust-issues.html

晴唯一可行的选择是使用谷歌云消息传递,但这可能不是一个很好的解决方案。

+0

感谢这个信息!有趣的..我看看。 –

+0

是不是一个休眠问题。似乎Nexus5X阻止广播UDP –

0

坏消息... 我禁用了电池优化,但Android M有一个接收广播UDP数据包的异常操作。

看到这张照片:

enter image description here

我还有一个Android设备(4.1.2)接收的所有数据包相同的代码!

这怎么可能?

有时会接收所有数据包,有时会停止(任何数据包)。

代码以禁用电池优化:

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); 
     } 
    } 

在Android清单:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> 

当我运行的AsyncTask接收UDP数据包,我检查这些设置:

isDeviceIdleMode() - > FALSE

isIgnoringBatteryOptimiza tions() - > TRUE

所以,这意味着睡眠不起作用,对吧?那么,谁封锁了这个数据包?

+0

你找到解决方案吗? – rsc

+0

看到这个论坛:https://code.google.com/p/android/issues/detail?id=204823 –