ANDROID / WEBVIEW- Uncaught TypeError: Object не имеет метода changeActivity в файле:

Я пытаюсь использовать веб-просмотр с полем ввода, взять строку и передать ее второму действию. По какой-то причине кнопка ничего не делает, и я получаю сообщение об ошибке:

Uncaught TypeError: Object [object Object] не имеет метода changeActivity в файле: ///android_asset/www/index.js: 3

Поэтому мой HTML говорит следующее:

<input id="name" value="" />&nbsp;&nbsp;&nbsp; <button onclick="checkMovie()"> Check it! </button> 

Мой JS говорит об этом:

  function checkMovie() { var movieName = document.getElementById('name').value; webapi.changeActivity(movieName);} 

И мой 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 WebChromeClient()); // allowing to inject Java objects into a page's JavaScript webView.addJavascriptInterface(new JavaScriptInterface(this), "webapi"); // Load the local file webView.loadUrl("file:///android_asset/www/index.html"); find = new Button(MainActivity.this); find.setOnClickListener(this); WebSettings ws = webView.getSettings(); ws.setJavaScriptEnabled(true); // Add the interface to record javascript events webView.addJavascriptInterface(find, "find"); } public class JavaScriptInterface { Context mContext; // Instantiate the interface and set the context JavaScriptInterface(Context c) { mContext = c; } // Call the function changeActivity defined in my JS of my HTML public void changeActivity(String movieName) { // Call the Movie App and store the intent to pass it onto the app. Log.e("XXXXXXXXXXXXXXX", "X==========>" + movieName); Intent i = new Intent(MainActivity.this, second.class); i.putExtra("movie_name", movieName); startActivity(i); } } @Override public void onClick(View v) { // TODO Auto-generated method stub if (v.equals(find)) { Log.e("XXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX"); } } 

}

Проблема в том, что именно. Начиная с 4.2.2 вы должны установить аннотацию @JavascriptInterface поверх вашего метода changeActivity и любых других методов javascript, которые вы вызываете в своем коде Android.

 @JavascriptInterface public void changeActivity(String movieName) { ... 

Это необходимо для Android 4.2 или выше.

Следуйте по этой ссылке, чтобы узнать больше.

Сначала в версии Android 4.2 и выше убедитесь, что вы добавили аннотацию @JavascriptInterface.

Тогда, если вы обнаружите, что он перестает работать в режиме выпуска (производства), это происходит из-за proguard .

 # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: # -keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} 

Если устройство 4.2.2, вы должны установить аннотацию @JavascriptInterface. Но, к сожалению, этот интерфейс не существует в SDK до 4.2.2.

Для этого случая у вас есть два варианта:

  1. Изменить цель вашего приложения, от 4.0 / 4.1 до 4.2

  2. Если вы не измените цель, создайте файл java android / webkit / JavascriptInterface.java в своем исходном коде и скопируйте содержимое из 4.2 SDK