我正在使用一个显示一些不错的HTML的WebView。其中一张图片应从图片库中选择并显示在WebView中。
所以,基本上,我需要Javascript来访问Java(为了打开Gallery),以及Java来访问Javascript(以获得结果)
我使用了以下代码:
public class JavaScriptInterface
{
Context mContext;
Uri currImageURI;
JavaScriptInterface(Context c)
{
mContext = c;
}
public void imageFromGallery()
{
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),1);
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
String retResult="";
if (resultCode == RESULT_OK)
{
if (requestCode == 1)
{
currImageURI = data.getData();
retResult=getRealPathFromURI(currImageURI);
}
}
mWebView.loadUrl("javascript:updateImage("+retResult+")");
}
public String getRealPathFromURI(Uri contentUri)
{
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( contentUri,proj,null,null,null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
现在,从我的脚本调用Java工作正常。我添加了onClick="Android.imageFromGallery()"
,它正确地打开了图库。
顺便说一句 - 它让我在Astro,文件管理器和图库之间做出选择。如何将其限制为Gallery,以便它不会询问用户使用哪个文件浏览器?
无论如何,问题来自于Java调用Javascript来传递结果。
显然updateImage()
(我的JS函数只显示图像名称)没有得到Java代码的调用。
我在这里做错了什么?
编辑:解决了第一个问题 - 我可以使用
直接调用图库 Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(getImageFromGalleryIntent, 1);
答案 0 :(得分:1)
解决! 错误是将onActivityResult作为函数添加到JavascriptInterface类中,而它需要在WebView定义中位于其外部。
(之前我无法回答我自己的问题,因为我的声誉不够高,所以我不得不等几个小时)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_OK)
{
if (requestCode == 1)
{
Uri currImageURI = data.getData();
String retResult = getRealPathFromURI(currImageURI);
mWebView.loadUrl("javascript:updateImage('"+retResult+"')");
}
}
}
public String getRealPathFromURI(Uri contentUri)
{
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( contentUri,proj,null,null,null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
public class JavaScriptInterface
{
Context mContext;
Uri currImageURI;
JavaScriptInterface(Context c)
{
mContext = c;
}
public void imageFromGallery()
{
Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(getImageFromGalleryIntent, 1);
}
}
}