在Xamarin Android应用程序中使用网络视图上传文件不起作用



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

在您的自定义WebChromeClient中,您必须覆盖OnShowFileChooser(…(,如下所示

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

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

var activity=插件.CurrentActivity.CrossCurrentActivity.CurrentActivity;

int CAMERA_PERMISSION_REQUEST_CODE=2323;

if(activity.PackageManager.CheckPermission(Android.Manifest.Permission.Camera,activity.PageName(!=安卓系统。内容。PM。权限。授予(

var permissions=新字符串[]{Android.Manifest.Permission.Camera};活动RequestPermissions(权限,CAMERA_PERMISSION_REQUEST_CODE(;

}

最新更新