簡體   English   中英

在 Xamarin Android 應用程序中使用 webview 上傳文件不起作用

[英]Uploading file not working using a webview in Xamarin Android App

我用 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();
            }
        }
    }
} 

" 我可以用這部分上傳 web 中的照片

<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" />

在您的自定義 WebChromeClient 中,您必須像這里一樣覆蓋 OnShowFileChooser(...)

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

我還檢查了相機權限,並在以這種方式使用它之前詢問用戶:

var 活動 = 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 權限 = 新字符串 [] { Android.Manifest.Permission.Camera }; activity.RequestPermissions(權限,CAMERA_PERMISSION_REQUEST_CODE);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM