我实现了一个使用JavascriptInterface的Webview.它没有混淆时工作正常,但Proguard立即活跃,它不起作用.我在这里看了其他答案,但我还是无法让它发挥作用.
一些WebView类:
public class Activity_Webview {
private WebView webView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface (), "HTMLOUT");
webView.setWebViewClient(mWebViewClient);
}
public class JavaScriptInterface implements NonObfuscateable{
@JavascriptInterface
public void processHTML(String html) {
handleFinishFromWebView(html);
}
}
Run Code Online (Sandbox Code Playgroud)
我在Proguard尝试过的:
-keep public class * implements com.project.NonObfuscateable
-keepclassmembers class * implements NonObfuscateable {
public void processHTML(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
我也试过这个(当没有实现NonObfuscateable接口时:
-keep public class com.project.Activity_Webview.JavaScriptInterface
-keep public class * implements com.project.Activity_Webview.JavaScriptInterface
-keepclassmembers class * implements com.project.Activity_Webview.JavaScriptInterface {
<fields>;
<methods>;
}
Run Code Online (Sandbox Code Playgroud)
有人知道可能出现什么问题吗?提前致谢
我正面临着一个严重的android OS Jelly Bean 4.2的错误,在我的程序中,我使用JavaScript来获取网页的高度,它完全适用于Android 2.2到4.1但是当我尝试在android 4.2中使用相同的代码时JavaScript界面无法正常工作.
我该如何解决这个问题?
我目前正在webview中以HTML格式向用户显示一堆数据.我在每个条目下面都有一些链接,单击时应该在我的应用程序中调用方法.Android WebView的javascript界面似乎是处理这些事情的最佳(唯一?)方式.但是,每当我单击该链接时,都会收到以下错误消息:ERROR/Web Console(6112): Uncaught TypeError: Object [my namespace]@4075ff10 has no method 'edit' at [base URL]:55
我声明了以下接口:
public class JavaScriptInterface {
Context context;
JavaScriptInterface(Context c) {
context = c;
}
public void edit(String postid) {
Log.d("myApp", "EDIT!");
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将它添加到我的WebView:
final WebView threadView = (WebView) findViewById(R.id.webViewThread);
threadView.getSettings().setJavaScriptEnabled(true);
threadView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
Run Code Online (Sandbox Code Playgroud)
最后,我在我的HTML中调用它如下:
<div class="post-actions">
<div class="right">
<a onClick="Android.edit('4312244');">Edit</a>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
当我通过模拟器或adb连接到我的手机调试我的应用程序时,真正的踢球者就是这一切.当我构建和发布应用程序时,它会中断.
我的智慧结束了.任何帮助或建议将不胜感激!
我正在尝试使用带有输入框的webview,获取字符串,并将其传递给第二个活动.由于某种原因,该按钮没有做任何事情,我收到错误:
未捕获的TypeError:对象[object Object]在file:///android_asset/www/index.js上没有方法'changeActivity':3
所以我的HTML说:
<input id="name" value="" />
<button onclick="checkMovie()"> Check it! </button>
Run Code Online (Sandbox Code Playgroud)
我的JS说:
function checkMovie() {
var movieName = document.getElementById('name').value;
webapi.changeActivity(movieName);}
Run Code Online (Sandbox Code Playgroud)
我的Android代码说:
public class MainActivity extends Activity implements OnClickListener {
// Setting up known variables
JavaScriptInterface JSInterface;
Button find;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// changing main layout to show the splash first
setContentView(R.layout.activity_main);
// Tie my webviews and set up the webview to handle JS
WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
// Expecting UI
webView.setWebChromeClient(new …Run Code Online (Sandbox Code Playgroud) 用proguard混淆后我的项目失败了javascriptinterface
这是与proguard配置的一些建议的链接,但它不适用于我的情况
http://groups.google.com/group/android-developers/browse_thread/thread/f889e846fbf7ec3f?pli=1
所以来自Javascript的调用松散绑定到相关的Java方法
关于那个我的proguard配置
-keep public class com.trans_code.android.JavascriptCallback
-keep public class * implements com.trans_code.android.JavascriptCallback
-keepclassmembers class * implements com.trans_code.android.JavascriptCallback {
<methods>;
}
-keepclassmembers class * implements JavascriptCallback {
void on*(***);
}
-keep public class com.trans_code.** {
public protected *;
}
-keepclasseswithmembernames class com.MyActivity$JavascriptInterface
-keepclasseswithmembernames class com.MyActivity$JavascriptInterface {
public protected *;
}
Run Code Online (Sandbox Code Playgroud)
如果有人知道如何配置proguard让它过滤掉相关的方法和类,将帮助我很多
我的android项目中有一个自定义Webview,如下所示:
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public class JsObject {
@JavascriptInterface
public void show() {
//...
}
@JavascriptInterface
public void hide() {
//....
}
}
Run Code Online (Sandbox Code Playgroud)
其中包括JavascriptInterface我用来从JavaScript端到Android端的通信.
在AndroidManifest中,我有以下内容
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
Run Code Online (Sandbox Code Playgroud)
在项目中,我使用了proguard,声明:
-keepattributes JavascriptInterface
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.
然而,当我将AndroidManifest更改为android:targetSdkVersion=18或19测试18及以上的设备时,proguard似乎在某种程度上混淆了无法访问的JavaScript方法.
如果我回到16或少于17的东西一切正常.此外,这只发生在proguard上.如果我不使用proguard,即使使用android:targetSdkVersion=18或19,一切正常.在清单Android> 17中定位时,任何人都可以帮助它吗?
我在本教程中添加了Crosswalk eclipse:ClickHere 我完成了教程中的所有操作并且没有错误,但是当我在手机上启动应用程序时,我有这样的:
02-19 13:37:08.147: E/AndroidRuntime(21108): FATAL EXCEPTION: main
02-19 13:37:08.147: E/AndroidRuntime(21108): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.crosswalktest/com.example.crosswalktest.MainActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class org.xwalk.core.XWalkView
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.app.ActivityThread.access$700(ActivityThread.java:134)
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.os.Handler.dispatchMessage(Handler.java:99)
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.os.Looper.loop(Looper.java:137)
02-19 13:37:08.147: E/AndroidRuntime(21108): at android.app.ActivityThread.main(ActivityThread.java:4867)
02-19 13:37:08.147: E/AndroidRuntime(21108): at java.lang.reflect.Method.invokeNative(Native Method)
02-19 13:37:08.147: E/AndroidRuntime(21108): at java.lang.reflect.Method.invoke(Method.java:511)
02-19 13:37:08.147: E/AndroidRuntime(21108): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) …Run Code Online (Sandbox Code Playgroud) 我有一个问题,即我在两天前寻找解决方案.在搜索令人沮丧之后,我会在这里发布:
我创建了一个具有webview的示例应用程序,这个webview打开了一个url,它有一个调用android函数的链接.我遵循它:http: //developer.android.com/guide/webapps/webview.html#BindingJavaScript
我正在使用最新的AndroidStudio版本,即时通讯使用galaxy s4 mini进行测试.
当我调试它时,一切正常,并显示吐司.
问题是我用命令生成一个RELEASE应用程序:〜/ Server/gradle-1.8/bin/gradle assembleRelease
应用程序打开,但当我触摸调用我的本机功能的链接时,它不起作用,没有任何反应.但是使用调试模式,它可以工作.
谁能帮我?
要更好地理解的图像:
