
[英]Cannot implicitly convert type 'System.Uri' to 'System.Collections.Generic.List<string>' ERROR
[英]Cannot implicitly convert type Android.Net.Uri to System.Uri
这段代码:
mUploadMessage.OnReceiveValue(new Uri[] { result });
结果:错误 CS0029 无法将类型“Android.Net.Uri”隐式转换为“System.Uri”
在 Visual Studio 2022 中,使用 Android.Net 和 Xamarin。
我试图进行类型转换,例如:
mUploadMessage.OnReceiveValue(new Uri[] { (Uri)result });
然后我收到错误:错误 CS0030 无法将类型“Android.Net.Uri”转换为“System.Uri”
我也尝试过:
mUploadMessage.OnReceiveValue(new Uri[] { result as Uri });
但是,然后错误是:错误 CS0039 无法通过引用转换、装箱转换、拆箱转换、包装转换或 null 类型转换将类型“Android.Net.Uri”转换为“System.Uri”
所以,我尝试了更长的转换:
Android.Net.Uri result = intent.Data;
String urlResult = result.ToString();
Uri sysUrl = new System.Uri(urlResult);
mUploadMessage.OnReceiveValue(new Uri[] { sysUrl });
但是,随后生成的错误是:错误 CS1503 参数 1:无法从“System.Uri[]”转换为“Java.Lang.Object?”
接下来,我尝试了这个:
Android.Net.Uri result = intent.Data;
String urlResult = result.ToString();
mUploadMessage.OnReceiveValue(urlResult);
编译没有错误,但随后执行我得到的功能:Java.Lang.ClassCastException Message=java.lang.String cannot be cast to android.net.Uri[]
最后,我尝试了这个:
Android.Net.Uri result = intent.Data;
mUploadMessage.OnReceiveValue(result);
结果是:Java.Lang.ClassCastException Message=android.net.Uri$HierarchicalUri cannot be cast to android.net.Uri[]
原来的套路是:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent intent)
{
if (requestCode == FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Android.Net.Uri result = intent.Data;
mUploadMessage.OnReceiveValue(new Uri[] { result });
mUploadMessage = null;
}
}
这是 MainActivity.cs 中的代码:
using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using Android.Webkit;
using Xamarin.Forms.Platform.Android;
using Android.Content;
using System.ComponentModel.Design;
namespace myapp.Droid
{
[Activity(Label = "myapp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static IValueCallback mUploadMessage;
public static int FILECHOOSER_RESULTCODE = 1;
public static IValueCallback mUMA;
public static int FCR = 1;
public static IValueCallback mUploadCallbackAboveL;
public static int PHOTO_REQUEST = 10023;
public static Uri imageUri;
public static MainActivity Instance;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
WebView webview = new WebView(this);
SetContentView(webview);
webview.Settings.UseWideViewPort = true;
webview.Settings.LoadWithOverviewMode = true;
webview.Settings.DefaultTextEncodingName = "UTF-8";
webview.Settings.JavaScriptEnabled = true;
webview.Settings.DomStorageEnabled = true;
webview.Settings.AllowFileAccessFromFileURLs = true;
webview.Settings.JavaScriptCanOpenWindowsAutomatically = true;
webview.Settings.AllowUniversalAccessFromFileURLs = true;
webview.Settings.AllowContentAccess = true;
webview.Settings.AllowFileAccess = true;
webview.SetWebViewClient(new OverWebView(this));
webview.SetWebChromeClient(new myWebChromeClient(this));
webview.LoadUrl("https://mywebapp.net");
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
public class OverWebView : WebViewClient
{
// For API level 24 and later
public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
{
view.Settings.JavaScriptEnabled = true;
view.Settings.DomStorageEnabled = true;
view.Settings.AllowFileAccessFromFileURLs = true;
view.Settings.JavaScriptCanOpenWindowsAutomatically = true;
view.LoadUrl(request.Url.ToString());
return false;
}
private MainActivity mainActivity;
public OverWebView(MainActivity mainActivity)
{
this.mainActivity = mainActivity;
}
}
public class myWebChromeClient : WebChromeClient
{
Activity mActivity = null;
public myWebChromeClient(Activity activity)
{
mActivity = activity;
}
public override bool OnShowFileChooser(WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
{
MainActivity.mUploadMessage = filePathCallback;
PhotoUtils.openFileChooseProcess(mActivity);
return true;
}
}
public class PhotoUtils
{
private static string TAG = "PhotoUtils";
public static void openFileChooseProcess(Activity activity)
{
Intent i = new Intent(Intent.ActionGetContent);
i.AddCategory(Intent.CategoryOpenable);
i.SetType("image/*");
activity.StartActivityForResult(Intent.CreateChooser(i, "UploadImage"), MainActivity.FILECHOOSER_RESULTCODE);
}
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent intent)
{
if (requestCode == FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Android.Net.Uri result = intent.Data;
mUploadMessage.OnReceiveValue(result);
mUploadMessage = null;
}
}
}
}
正如错误消息告诉您的那样,您尝试引用 class Uri
被编译为System.Uri
。 那不是你需要的。
您需要Android.Net.Uri
。
最简单的解决方法是指定你想要Uri
的名称空间:
mUploadMessage.OnReceiveValue(new Android.Net.Uri[] { result });
另一种解决方法是using
来声明:
using Uri = Android.Net.Uri;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.