【发布时间】:2020-08-10 14:09:09
【问题描述】:
我正在尝试开始侦听 Android 设备上的一个 UDP 端口。我正在使用 Xamarin.Forms,并且正在物理 Android 手机上对其进行测试。
public void StartListening(int port = 13000)
{
ListenerPort = port;
udpClient = new UdpClient(ListenerPort);
udpClient.BeginReceive(new AsyncCallback(handleIncomingMessages), null);
}
这个函数在应用启动时使用:
public partial class App : Application
{
[...]
protected override void OnStart()
{
network.StartListening(LISTENING_ON_PORT);
}
}
关于 SO 的类似问题有很多,但大多数都是通过在 android manifest 中添加 INTERNET 权限来解决的。这是我的:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.ddand">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:label="ddAnd.Android" android:theme="@style/MainTheme"></application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
</manifest>
部署我的应用后我看到的是:
System.Net.Sockets.SocketException: '访问被拒绝'
没有提供其他细节。
我认为我的端口正被另一个进程使用,但我检查了其中的许多(1-1024 范围之外)并且使用它们都得到了相同的结果。
这个例外还有其他原因吗?您有什么想法可以解决问题(例如如何找到可用端口)?
编辑:
按照 cmets 中的建议,我尝试在运行时获得访问权限(尽管这不是必需的,INTERNET permission is granted by default by Xamarin in Debug mode)。
此行返回已授予权限的信息。
var havePermission = ContextCompat.CheckSelfPermission(this, Manifest.Permission.Internet);
尽管如此,我还是尝试在运行时手动获取访问权限
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Internet }, 1);
结果和以前一样。
【问题讨论】:
-
如何添加权限?仅将其添加到
AndroidManifest文件中?您是否请求运行时权限? -
仅添加到清单。感谢您的评论,我会检查我是否遗漏了什么
-
@WendyZang-MSFT 嗨,我已经编辑了我的帖子来回答你的建议。通常,Android 表示已授予 INTERNET 权限。此外,如 xamarin 文档中所述,不需要在运行时请求它
标签: c# android xamarin xamarin.forms xamarin.android