使用 webview 浏览相册
Using a webview to browse the photo gallery
Min SDK API 15
您好,
我使用的 webview 上有一个按钮,可以浏览应用程序的照片库。
但是,当在 webview 中单击按钮时,没有任何反应。
url 的格式为:
https://www.xxxxxxxxxxx
我添加了以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
我有一个片段,它将在启用 javascript 的 onCreateView 方法(仅限片段)中加载 webview。
if(!message.isEmpty()) {
WebView webView = (WebView)view.findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl(message);
}
我创建了一个简单的 html 页面来测试:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test Android Popup</title>
</head>
<body>
<label>Test Alert 1:</label>
<button type="button" onClick="alert('Test Alert Box1');">Click Me!</button>
<br>
<label>Test Browse file</label>
<input type="file" name="img">
</body>
</html>
因此 url 将加载到 webview 中。 Web 视图显示一个按钮,用户单击该按钮可浏览其图库中的照片。
网络视图如下所示:
None 个按钮在我单击它们时起作用。
非常感谢您的任何建议,
此代码片段适用于 < 4.3。但是,4.4 和 5.0 它失败了。
webView.setWebChromeClient(new WebChromeClient() {
/* Open File */
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mImageFilePath = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mImageFilePath = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
}
});
创建此文件并将其放在您的资产文件夹中:webdemo.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>title</title>
</head>
<body>
<h1>Web View Demo</h1>
<br>
<input type="button" value="Say hello"
onClick="showAndroidToast('Hello Android!')" />
<br />
File Uri: <label id="lbluri">no file uri</label>
<br />
File Path: <label id="lblpath">no file path</label>
<br />
<input type="button" value="Choose Photo" onClick="choosePhoto()" />
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
function setFilePath(file) {
document.getElementById('lblpath').innerHTML = file;
Android.showToast(file);
}
function setFileUri(uri) {
document.getElementById('lbluri').innerHTML = uri;
Android.showToast(uri);
}
function choosePhoto() {
var file = Android.choosePhoto();
window.alert("file = " + file);
}
</script>
</body>
</html>
专心javascript写到这里。
将你的activity写成如下:
WebViewDemo.java
public class WebViewDemo extends Activity
{
private WebView webView;
final int SELECT_PHOTO = 1;
@SuppressLint("SetJavaScriptEnabled")
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.show_web_view);
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
// Other webview settings
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setSupportZoom(true);
webView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");
webView.loadUrl("file:///android_asset/webdemo.html");
}
class MyJavascriptInterface
{
Context mContext;
/** Instantiate the interface and set the context */
MyJavascriptInterface(Context c)
{
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast)
{
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public String choosePhoto()
{
// TODO Auto-generated method stub
String file = "test";
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
return file;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
switch (requestCode)
{
case SELECT_PHOTO:
if (resultCode == RESULT_OK)
{
Uri selectedImage = intent.getData();
webView.loadUrl("javascript:setFileUri('" + selectedImage.toString() + "')");
String path = getRealPathFromURI(this, selectedImage);
webView.loadUrl("javascript:setFilePath('" + path + "')");
}
}
}
public String getRealPathFromURI(Context context, Uri contentUri)
{
Cursor cursor = null;
try
{
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
finally
{
if (cursor != null)
{
cursor.close();
}
}
}
}
使用此代码片段,看看它是否有效。
this screenshot below is taken from a Android 4.4 Kitkat device.
我不知道这个解决方案是否适合你。它可能只是您的解决方法或突破。
我希望它的一部分能有所帮助。
你可以这样实现
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals("alert://alert")) {
Toast.makeText(this, "alert", Toast.LENGTH_LONG).show();
} else if (url.equals("choose://image")) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
}
return true;
}
});
你的html应该是这样的
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test Android Popup</title>
</head>
<body>
<label>Test Alert 1:</label>
<form action="alert://alert">
<input type="submit" value="Click me!">
</form>
<br>
<label>Test Browse file</label>
<form action="image://choose">
<input type="submit" value="Choose File">
</form>
</body>
</html>
不幸的是,正如用户 Slartibartfast 在对您的问题的评论之一中所说,输入类型 "file" 不适用于 4.4 设备。在 google 代码中有一个 issue 声明这是一种预期行为(状态:WorkingAsIntended)。
即使如此,您提供的代码也适用于 4.4.4(在 Nexus 7 平板电脑上测试)和 < 4.4 os 版本。
在 5.0 上,他们添加了一个记录的 method 来执行此操作。我正在使用以下代码:
mWebView.setWebChromeClient(new WebChromeClient() {
// For Android < 3.0 - undocumented method
@SuppressWarnings("unused")
public void openFileChooser( ValueCallback<Uri> uploadMsg ) {
openFileChooser( uploadMsg, "" );
}
// For Android 3.0+ - undocumented method
public void openFileChooser( ValueCallback<Uri> uploadMsg, String acceptType ) {
mUploadCallback = uploadMsg;
openFileChooserActivity();
}
// For Android > 4.1 - undocumented method
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
openFileChooser( uploadMsg, "" );
}
// For Android > 5.0
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackLollipop = filePathCallback;
openFileChooserActivity();
return true;
}
});
注意 > 5.0 的回调参数更改:从 ValueCallback<Uri>
到 ValueCallback<Uri[]>
。
因此,对于 >= 4.4 和 < 4.4.4,您应该实现自己的文件上传机制。一些建议:
- 使用 java 脚本检查 android os 版本并提供一个
<input type="file">
它可以工作的地方。在 4.4 版本上,使用您自己的 url 架构创建一个 html 元素(如 Sushant 所说,例如 <form action="image://choose">
)。然后您可以在 shouldOverrideUrlLoading
中捕获它并使用文件路径从 java 调用 java 脚本函数,但您将无法访问文件的内容。对于小文件,您可以将 base64 格式的文件内容作为参数传递给您的 java 脚本函数,但对于较大的文件,您肯定会遇到 OutOfMemory 异常。[=48] =]
- 您可以执行上述步骤,但在 java 中处理文件上传并仅提供 java 脚本函数的路径。带有提交的按钮可以利用 Amrut Bidri 所说的触发您在 java.
中上传
因此,作为结论,我看到 os 版本介于 4.4 和 4.4.4 之间的两个选项:要么使用 java 脚本上传文件(内存问题),要么在 java 并在您的应用程序和 webview 之间实现您自己的通信机制。对于他们两个,您都需要有权访问您在 webview 中加载的网页。
我使用了java脚本上传方法,因为我们使用的是小文件,而且实现起来要快一些:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
... else if (url.startsWith(UPLOAD_FILE_URL_PREFIX)) {
openFileChooserActivity();
return true;
}
return false;
}
在 activity 结果上,我对 4.4 版本做了类似的事情(java 脚本函数 insertFileForUpload
处理文件上传):
private void invokeJavascriptWithFileContent(Uri fileUri) {
String fileContentInBase64 = readAndConvertFileToBase64(fileUri);
if (!fileContentInBase64.isEmpty()) {
String fileMimeType = getMimeType(activity, fileUri);
String fileName = getFileName(activity, fileUri);
// invoke javascript
String js = String.format("javascript:insertFileForUpload(\"%s\",\"%s\",\"%s\")",
fileName,
fileMimeType,
fileContentInBase64
);
mWebView.loadUrl(js);
}
}
public static String getMimeType(Context context, Uri fileUri)
{
ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(fileUri));
return type;
}
此外,关于https://github.com/delight-im/Android-AdvancedWebView,似乎文件上传有效,但他们说:'File uploads are handled automatically (check availability with AdvancedWebView.isFileUploadAvailable())'和'isFileUploadAvailable'包含以下代码:
/**
* Returns whether file uploads can be used on the current device (generally all platform versions except for 4.4)
*
* @return whether file uploads can be used
*/
public static boolean isFileUploadAvailable() {
return isFileUploadAvailable(false);
}
/**
* Returns whether file uploads can be used on the current device (generally all platform versions except for 4.4)
*
* On Android 4.4.3/4.4.4, file uploads may be possible but will come with a wrong MIME type
*
* @param needsCorrectMimeType whether a correct MIME type is required for file uploads or `application/octet-stream` is acceptable
* @return whether file uploads can be used
*/
public static boolean isFileUploadAvailable(final boolean needsCorrectMimeType) {
if (Build.VERSION.SDK_INT == 19) {
final String platformVersion = (Build.VERSION.RELEASE == null) ? "" : Build.VERSION.RELEASE;
return !needsCorrectMimeType && (platformVersion.startsWith("4.4.3") || platformVersion.startsWith("4.4.4"));
}
else {
return true;
}
}
所以你可能只是在普通的 webview 上遇到了同样的问题,但我还没有测试过这个库,所以我不能说。
我的答案可能乱七八糟,但我希望你能找到有用的东西。
通过这段代码可以获取手机文件的路径,只是我无法上传php中的文件。下面是我正在使用的 php 代码:
$arquivo = $_POST['lblpath'];
$url = "file:///storage/external_SD/fotos/IMG10022.jpg"; //url da imagem que venha de um textField
//PEGA INFORMAÇÕES DA IMAGEM
$file_info = getimagesize($url);
//VERIFICA EXTENSÃO DA IMAGEM
if ($file_info['mime'] == "image/jpeg")
$img = imagecreatefromjpeg($url);
else if ($file_info['mime'] == "image/gif")
$img = imagecreatefromgif($url);
else if ($file_info['mime'] == "image/png")
$img = imagecreatefrompng($url);
$altura = $file_info[1];
//PASSA AS MEDIDAS PARA A IMAGEM
$x = imagesx($img);
$y = imagesy($img);
$largura = ($altura * $x)/$y;
//CRIA A IMAGEM
$nova = imagecreatetruecolor($largura, $altura);
imagealphablending( $nova, false );
imagesavealpha( $nova, true );
imagecopyresampled($nova, $img, 0, 0, 0, 0, $largura, $altura, $x, $y);
//NOME DA IMAGEM
$imgName = end(explode("/", $url));
//LOCAL PARA SALVAR
$pasta = "images/"; // defina sua path
$local = $pasta . $imgName;
//SALVA NOVA IMAGEM
if ($file_info['mime'] == "image/jpeg")
imagejpeg($nova, $local, 100);
else if ($file_info['mime'] == "image/png")
imagepng($nova, $local, 9);
//DESTROI ELEMENTOS
imagedestroy($img);
imagedestroy($nova);
Min SDK API 15
您好,
我使用的 webview 上有一个按钮,可以浏览应用程序的照片库。
但是,当在 webview 中单击按钮时,没有任何反应。
url 的格式为:
https://www.xxxxxxxxxxx
我添加了以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
我有一个片段,它将在启用 javascript 的 onCreateView 方法(仅限片段)中加载 webview。
if(!message.isEmpty()) {
WebView webView = (WebView)view.findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl(message);
}
我创建了一个简单的 html 页面来测试:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test Android Popup</title>
</head>
<body>
<label>Test Alert 1:</label>
<button type="button" onClick="alert('Test Alert Box1');">Click Me!</button>
<br>
<label>Test Browse file</label>
<input type="file" name="img">
</body>
</html>
因此 url 将加载到 webview 中。 Web 视图显示一个按钮,用户单击该按钮可浏览其图库中的照片。
网络视图如下所示:
None 个按钮在我单击它们时起作用。
非常感谢您的任何建议,
此代码片段适用于 < 4.3。但是,4.4 和 5.0 它失败了。
webView.setWebChromeClient(new WebChromeClient() {
/* Open File */
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mImageFilePath = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mImageFilePath = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
}
});
创建此文件并将其放在您的资产文件夹中:webdemo.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>title</title>
</head>
<body>
<h1>Web View Demo</h1>
<br>
<input type="button" value="Say hello"
onClick="showAndroidToast('Hello Android!')" />
<br />
File Uri: <label id="lbluri">no file uri</label>
<br />
File Path: <label id="lblpath">no file path</label>
<br />
<input type="button" value="Choose Photo" onClick="choosePhoto()" />
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
function setFilePath(file) {
document.getElementById('lblpath').innerHTML = file;
Android.showToast(file);
}
function setFileUri(uri) {
document.getElementById('lbluri').innerHTML = uri;
Android.showToast(uri);
}
function choosePhoto() {
var file = Android.choosePhoto();
window.alert("file = " + file);
}
</script>
</body>
</html>
专心javascript写到这里。
将你的activity写成如下: WebViewDemo.java
public class WebViewDemo extends Activity
{
private WebView webView;
final int SELECT_PHOTO = 1;
@SuppressLint("SetJavaScriptEnabled")
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.show_web_view);
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
// Other webview settings
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setSupportZoom(true);
webView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");
webView.loadUrl("file:///android_asset/webdemo.html");
}
class MyJavascriptInterface
{
Context mContext;
/** Instantiate the interface and set the context */
MyJavascriptInterface(Context c)
{
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast)
{
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public String choosePhoto()
{
// TODO Auto-generated method stub
String file = "test";
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
return file;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
switch (requestCode)
{
case SELECT_PHOTO:
if (resultCode == RESULT_OK)
{
Uri selectedImage = intent.getData();
webView.loadUrl("javascript:setFileUri('" + selectedImage.toString() + "')");
String path = getRealPathFromURI(this, selectedImage);
webView.loadUrl("javascript:setFilePath('" + path + "')");
}
}
}
public String getRealPathFromURI(Context context, Uri contentUri)
{
Cursor cursor = null;
try
{
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
finally
{
if (cursor != null)
{
cursor.close();
}
}
}
}
使用此代码片段,看看它是否有效。
this screenshot below is taken from a Android 4.4 Kitkat device.
我不知道这个解决方案是否适合你。它可能只是您的解决方法或突破。 我希望它的一部分能有所帮助。
你可以这样实现
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals("alert://alert")) {
Toast.makeText(this, "alert", Toast.LENGTH_LONG).show();
} else if (url.equals("choose://image")) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
}
return true;
}
});
你的html应该是这样的
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test Android Popup</title>
</head>
<body>
<label>Test Alert 1:</label>
<form action="alert://alert">
<input type="submit" value="Click me!">
</form>
<br>
<label>Test Browse file</label>
<form action="image://choose">
<input type="submit" value="Choose File">
</form>
</body>
</html>
不幸的是,正如用户 Slartibartfast 在对您的问题的评论之一中所说,输入类型 "file" 不适用于 4.4 设备。在 google 代码中有一个 issue 声明这是一种预期行为(状态:WorkingAsIntended)。
即使如此,您提供的代码也适用于 4.4.4(在 Nexus 7 平板电脑上测试)和 < 4.4 os 版本。
在 5.0 上,他们添加了一个记录的 method 来执行此操作。我正在使用以下代码:
mWebView.setWebChromeClient(new WebChromeClient() {
// For Android < 3.0 - undocumented method
@SuppressWarnings("unused")
public void openFileChooser( ValueCallback<Uri> uploadMsg ) {
openFileChooser( uploadMsg, "" );
}
// For Android 3.0+ - undocumented method
public void openFileChooser( ValueCallback<Uri> uploadMsg, String acceptType ) {
mUploadCallback = uploadMsg;
openFileChooserActivity();
}
// For Android > 4.1 - undocumented method
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
openFileChooser( uploadMsg, "" );
}
// For Android > 5.0
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackLollipop = filePathCallback;
openFileChooserActivity();
return true;
}
});
注意 > 5.0 的回调参数更改:从 ValueCallback<Uri>
到 ValueCallback<Uri[]>
。
因此,对于 >= 4.4 和 < 4.4.4,您应该实现自己的文件上传机制。一些建议:
- 使用 java 脚本检查 android os 版本并提供一个
<input type="file">
它可以工作的地方。在 4.4 版本上,使用您自己的 url 架构创建一个 html 元素(如 Sushant 所说,例如<form action="image://choose">
)。然后您可以在shouldOverrideUrlLoading
中捕获它并使用文件路径从 java 调用 java 脚本函数,但您将无法访问文件的内容。对于小文件,您可以将 base64 格式的文件内容作为参数传递给您的 java 脚本函数,但对于较大的文件,您肯定会遇到 OutOfMemory 异常。[=48] =] - 您可以执行上述步骤,但在 java 中处理文件上传并仅提供 java 脚本函数的路径。带有提交的按钮可以利用 Amrut Bidri 所说的触发您在 java. 中上传
因此,作为结论,我看到 os 版本介于 4.4 和 4.4.4 之间的两个选项:要么使用 java 脚本上传文件(内存问题),要么在 java 并在您的应用程序和 webview 之间实现您自己的通信机制。对于他们两个,您都需要有权访问您在 webview 中加载的网页。
我使用了java脚本上传方法,因为我们使用的是小文件,而且实现起来要快一些:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
... else if (url.startsWith(UPLOAD_FILE_URL_PREFIX)) {
openFileChooserActivity();
return true;
}
return false;
}
在 activity 结果上,我对 4.4 版本做了类似的事情(java 脚本函数 insertFileForUpload
处理文件上传):
private void invokeJavascriptWithFileContent(Uri fileUri) {
String fileContentInBase64 = readAndConvertFileToBase64(fileUri);
if (!fileContentInBase64.isEmpty()) {
String fileMimeType = getMimeType(activity, fileUri);
String fileName = getFileName(activity, fileUri);
// invoke javascript
String js = String.format("javascript:insertFileForUpload(\"%s\",\"%s\",\"%s\")",
fileName,
fileMimeType,
fileContentInBase64
);
mWebView.loadUrl(js);
}
}
public static String getMimeType(Context context, Uri fileUri)
{
ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(fileUri));
return type;
}
此外,关于https://github.com/delight-im/Android-AdvancedWebView,似乎文件上传有效,但他们说:'File uploads are handled automatically (check availability with AdvancedWebView.isFileUploadAvailable())'和'isFileUploadAvailable'包含以下代码:
/**
* Returns whether file uploads can be used on the current device (generally all platform versions except for 4.4)
*
* @return whether file uploads can be used
*/
public static boolean isFileUploadAvailable() {
return isFileUploadAvailable(false);
}
/**
* Returns whether file uploads can be used on the current device (generally all platform versions except for 4.4)
*
* On Android 4.4.3/4.4.4, file uploads may be possible but will come with a wrong MIME type
*
* @param needsCorrectMimeType whether a correct MIME type is required for file uploads or `application/octet-stream` is acceptable
* @return whether file uploads can be used
*/
public static boolean isFileUploadAvailable(final boolean needsCorrectMimeType) {
if (Build.VERSION.SDK_INT == 19) {
final String platformVersion = (Build.VERSION.RELEASE == null) ? "" : Build.VERSION.RELEASE;
return !needsCorrectMimeType && (platformVersion.startsWith("4.4.3") || platformVersion.startsWith("4.4.4"));
}
else {
return true;
}
}
所以你可能只是在普通的 webview 上遇到了同样的问题,但我还没有测试过这个库,所以我不能说。
我的答案可能乱七八糟,但我希望你能找到有用的东西。
通过这段代码可以获取手机文件的路径,只是我无法上传php中的文件。下面是我正在使用的 php 代码:
$arquivo = $_POST['lblpath'];
$url = "file:///storage/external_SD/fotos/IMG10022.jpg"; //url da imagem que venha de um textField
//PEGA INFORMAÇÕES DA IMAGEM
$file_info = getimagesize($url);
//VERIFICA EXTENSÃO DA IMAGEM
if ($file_info['mime'] == "image/jpeg")
$img = imagecreatefromjpeg($url);
else if ($file_info['mime'] == "image/gif")
$img = imagecreatefromgif($url);
else if ($file_info['mime'] == "image/png")
$img = imagecreatefrompng($url);
$altura = $file_info[1];
//PASSA AS MEDIDAS PARA A IMAGEM
$x = imagesx($img);
$y = imagesy($img);
$largura = ($altura * $x)/$y;
//CRIA A IMAGEM
$nova = imagecreatetruecolor($largura, $altura);
imagealphablending( $nova, false );
imagesavealpha( $nova, true );
imagecopyresampled($nova, $img, 0, 0, 0, 0, $largura, $altura, $x, $y);
//NOME DA IMAGEM
$imgName = end(explode("/", $url));
//LOCAL PARA SALVAR
$pasta = "images/"; // defina sua path
$local = $pasta . $imgName;
//SALVA NOVA IMAGEM
if ($file_info['mime'] == "image/jpeg")
imagejpeg($nova, $local, 100);
else if ($file_info['mime'] == "image/png")
imagepng($nova, $local, 9);
//DESTROI ELEMENTOS
imagedestroy($img);
imagedestroy($nova);