Android web视图中的文件上载不工作
我正在尝试通过网络视图上传文件,但目前还没有,我正在查看,下面是我的 MainActivity.javaAndroid web视图中的文件上载不工作,android,file,webview,upload,Android,File,Webview,Upload,我正在尝试通过网络视图上传文件,但目前还没有,我正在查看,下面是我的 MainActivity.java package ...; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.webkit.ValueCallback; import android.webkit.WebChromeClien
package ...;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = (WebView) findViewById(R.id.webView);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient());
wv.setWebChromeClient(new WebChromeClient() {
//The undocumented magic method override
//Eclipse will swear at you if you try to put @Override here
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
MainActivity.this.showAttachmentDialog(uploadMsg);
}
// For Android > 3.x
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
MainActivity.this.showAttachmentDialog(uploadMsg);
}
// For Android > 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
MainActivity.this.showAttachmentDialog(uploadMsg);
}
});
wv.loadUrl("http://www.tizag.com/phpT/fileupload.php");
}
private void showAttachmentDialog(ValueCallback<Uri> uploadMsg) {
this.mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
this.startActivityForResult(Intent.createChooser(i, "Choose type of attachment"), FILECHOOSER_RESULTCODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == this.mUploadMessage) {
return;
}
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
this.mUploadMessage.onReceiveValue(result);
this.mUploadMessage = null;
}
}
}
包。。。;
导入android.app.Activity;
导入android.content.Intent;
导入android.net.Uri;
导入android.os.Bundle;
导入android.webkit.ValueCallback;
导入android.webkit.WebChromeClient;
导入android.webkit.WebView;
导入android.webkit.WebViewClient;
公共类MainActivity扩展了活动{
private ValueCallback mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv=(WebView)findviewbyd(R.id.WebView);
wv.getSettings().setJavaScriptEnabled(true);
setWebViewClient(新的WebViewClient());
wv.setWebChromeClient(新WebChromeClient(){
//未记录的magic方法重写
//如果您试图在此处放置@Override,Eclipse将对您发牢骚
public void openFileChooser(ValueCallback uploadMsg){
MainActivity.this.showAttachmentDialog(uploadMsg);
}
//对于Android>3.x
public void openFileChooser(ValueCallback uploadMsg,String acceptType){
MainActivity.this.showAttachmentDialog(uploadMsg);
}
//对于Android>4.1
public void openFileChooser(ValueCallback uploadMsg、字符串接受类型、字符串捕获){
MainActivity.this.showAttachmentDialog(uploadMsg);
}
});
wv.loadUrl(“http://www.tizag.com/phpT/fileupload.php");
}
私有void showAttachmentDialog(ValueCallback uploadMsg){
this.mUploadMessage=uploadMsg;
意向i=新意向(意向.行动\u获取\u内容);
i、 addCategory(意图。类别可打开);
i、 集合类型(“*/*”);
this.startActivityForResult(Intent.createChooser(i,“选择附件类型”)、FILECHOOSER\u RESULTCODE);
}
@凌驾
ActivityResult上受保护的void(int-requestCode、int-resultCode、Intent-Intent){
if(requestCode==FILECHOOSER\u RESULTCODE){
if(null==this.mUploadMessage){
返回;
}
Uri result=intent==null | | resultCode!=result_OK?null:intent.getData();
此.mUploadMessage.onReceiveValue(结果);
this.mUploadMessage=null;
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="....MainActivity">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
和权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="...">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
如果您设置这3个文件并运行它,我已经将webview url设置为包含文件输入的页面,您将看到它不起作用。我使用的是API版本19+
我很快就要哭了。所以我遇到了这个GIT回购协议,我认为它会有帮助- 请看“输入文件示例” 我在Build.Gradle上遇到了问题,并在这里找到了解决方案-
希望这有帮助 所以我发现了这个GIT回购协议,我认为它将有助于- 请看“输入文件示例” 我在Build.Gradle上遇到了问题,并在这里找到了解决方案-
希望这有帮助 我忘了什么时候了,但是Android团队在4.x之后的某个时候删除了未记录的
openFileChooser
方法。我们让它普遍工作的方法是实现一个JavaBridge来调用文件选择器,并通过服务上传文件。然后,表单接收UUID,服务器可以使用该UUID解析上载的文件。它很复杂,但不管SDK或设备的WebView如何,它都能工作。@323好吧,有什么资源可以让我完成这个过程吗?所有的部分都在那里,但你必须自己把它们粘在一起。哦,为了将GUID注入到表单中,我们在loadUrl
调用中使用了javascript。通过Android的“活动暂停/恢复”使表单处于活动状态是另一个问题——导航到文件选择器很可能会重置表单数据,除非您将其持久化。可以说,这不是小事。把客户机代码放在一起,删除专有代码需要一段时间,而我就是没有时间。此外,我甚至不知道我是否仍然可以访问服务器端代码。我忘记了什么时候了,但是Android团队在4.x之后的某个时候删除了未记录的openFileChooser
方法。我们让它普遍工作的方法是实现一个JavaBridge来调用文件选择器,并通过服务上传文件。然后,表单接收UUID,服务器可以使用该UUID解析上载的文件。它很复杂,但不管SDK或设备的WebView如何,它都能工作。@323好吧,有什么资源可以让我完成这个过程吗?所有的部分都在那里,但你必须自己把它们粘在一起。哦,为了将GUID注入到表单中,我们在loadUrl
调用中使用了javascript。通过Android的“活动暂停/恢复”使表单处于活动状态是另一个问题——导航到文件选择器很可能会重置表单数据,除非您将其持久化。可以说,这不是小事。把客户机代码放在一起,删除专有代码需要一段时间,而我就是没有时间。此外,我甚至不知道我是否仍然可以访问服务器端代码。虽然这些链接可能会回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然这些链接可能会回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效。