繁体   English   中英

无法将类型 Android.Net.Uri 隐式转换为 System.Uri

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM