【问题标题】:Uploading file not working using a webview in Xamarin Android App在 Xamarin Android App 中使用 webview 上传文件不起作用
【发布时间】:2022-06-16 17:03:31
【问题描述】:

我使用 Xamarin 创建了移动应用程序。我可以使用 nfc 卡登录,并且可以访问真实页面。但我无法使用 html 文件上传按钮打开文件选择器。如果我可以使用 webchromeclient 它的工作。但我应该使用移动应用程序上传文件。当我按下上传文件按钮时,文件选择器没有打开

namespace MYPROJECTMOBILE
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar")]
    public class MainActivity : Activity
    {
        WebView webView;
        static MainActivity context;
        static string cardNo = "";
        static string pernr = "";
        public static IValueCallback mUploadCallbackAboveL;
        public static Android.Net.Uri imageUri;
        public static MainActivity Instance;
        public static int PHOTO_REQUEST = 10023;
        public static IValueCallback mUploadMessage;
        public static int FILECHOOSER_RESULTCODE = 1;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            SetContentView(Resource.Layout.activity_main);
            Instance = this;
            context = this;
            cardNo = Intent.GetStringExtra("CARD_ID") ?? string.Empty;
            pernr = Intent.GetStringExtra("PERNR") ?? string.Empty;
            webView = FindViewById<WebView>(Resource.Id.webView1);
            webView.SetWebViewClient(new ExtendWebViewClient());
            webView.SetWebChromeClient(new WebChromeClient());
            webView.ClearCache(true);
            webView.ClearFormData();
            CookieManager.Instance.RemoveAllCookie();
            webView.Settings.JavaScriptEnabled = true;
            webView.Settings.DomStorageEnabled = true;
            webView.Settings.AllowFileAccess = true;
            webView.Settings.AllowFileAccessFromFileURLs = true;
            webView.Settings.AllowUniversalAccessFromFileURLs = true;
            webView.Settings.AllowContentAccess = true;
            webView.LoadUrl("https://website.com.tr/");
        }
        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.menu_main, menu);
            return true;
        }

        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            int id = item.ItemId;
            if (id == Resource.Id.action_settings)
            {
                return true;
            }
            return base.OnOptionsItemSelected(item);
        }

        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 override void OnBackPressed()
        { 
        }
        protected override void OnActivityResult(int requestCode, Result resultCode, Intent intent)
        {
            if (requestCode == FILECHOOSER_RESULTCODE)
            {
                if (null == mUploadMessage) return;
                Android.Net.Uri result = intent == null || resultCode != Result.Ok ? null : intent.Data;
                mUploadMessage.OnReceiveValue(result);
                mUploadMessage = null;
            }
            else if (requestCode == PHOTO_REQUEST)
            {
                Android.Net.Uri result = intent == null || resultCode != Result.Ok ? null : intent.Data;
                if (mUploadCallbackAboveL != null)
                {
                    onActivityResultAboveL(requestCode, resultCode, intent);
                }
                else if (mUploadMessage != null)
                {
                    mUploadMessage.OnReceiveValue(result);
                    mUploadMessage = null;
                }
            }
        }
        private void onActivityResultAboveL(int requestCode, Result resultCode, Intent data)
        {
            if (requestCode != PHOTO_REQUEST || mUploadCallbackAboveL == null)
            {
                return;
            }
            Android.Net.Uri[] results = null;
            if (resultCode == Result.Ok)
            {
                results = new Android.Net.Uri[] { imageUri };
                results[0] = MainActivity.imageUri;
            }
            mUploadCallbackAboveL.OnReceiveValue(results);
            mUploadCallbackAboveL = null;
        }
        public class ExtendWebViewClient : WebViewClient
        {
            bool isLoggedIn;
            bool redirected;
            [Obsolete]
            public override bool ShouldOverrideUrlLoading(WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
            public override void OnPageFinished(WebView view, string url)
            {
                if (url.Contains("https://website.com.tr/Login"))
                {
                    if (pernr != "") { 
                    view.EvaluateJavascript("javascript:{" +
                        "WaitScreen.Show();" +
                        "ins=document.getElementsByTagName('input');" +
                        "ins[0].value='" + pernr + "';" +
                        "ins[1].value='" + cardNo + "';" +
                        "ins[2].value=false;" +
                        "document.getElementsByTagName('button')[0].click();" +
                        "};", new JavascriptResult());
                    }
                    else
                    {
                        Intent activityIntent = new Intent(context, typeof(NfcActivity));
                        context.StartActivity(activityIntent);
                    }
                    pernr = "";
                    cardNo = "";
                }
            }
        }
        internal class JavascriptResult : Java.Lang.Object, IValueCallback
        {
            public string result;
            public void OnReceiveValue(Java.Lang.Object value)
            {
                result = ((Java.Lang.String)value).ToString();
            }
        }
    }
} 

" 我可以用这部分在网络上上传照片

<input type="file" id="myFile" name="filename">
<input type="submit">

"

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main"
    android:minWidth="25px"
    android:minHeight="25px">
    <android.webkit.WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView1" />

</RelativeLayout>

"

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.NFC" />
        <uses-permission android:name="android.permission.NFC_TRANSACTION_EVENT" />
        <uses-permission android:name="android.permission.BIND_NFC_SERVICE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.CAMERA" />
        
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                       android:value="true" />

【问题讨论】:

  • 当你在web view中使用上传文件功能时,你需要重写WebChromeClient for Android 5.0及更高版本中的OnShowFileChooser方法。 xamarin.android上传文件也有类似情况link

标签: c# android html xamarin upload


【解决方案1】:

在您的自定义 WebChromeClient 中,您必须像这里一样覆盖 OnShowFileChooser(...)

https://docs.microsoft.com/en-us/answers/questions/198451/problem-opening-camera-with-webview-and-input-type.html

我还检查了相机权限,并在以这种方式使用之前询问用户:

var activity = Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;

int CAMERA_PERMISSION_REQUEST_CODE = 2323;

if (activity.PackageManager.CheckPermission(Android.Manifest.Permission.Camera, activity.PackageName) != Android.Content.PM.Permission.Granted)

{

var permissions = new string[] { Android.Manifest.Permission.Camera }; activity.RequestPermissions(权限, CAMERA_PERMISSION_REQUEST_CODE);

}

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多