Использование моста Javascript в Android

Я просто пытаюсь передать свое java-приложение контенту в веб-просмотре.

Подробно, может быть, просто показывает тост при нажатии кнопки?

После поиска в Google и проведения некоторых исследований в итоге был получен следующий код.

PS: - Я использую Android Studio, есть ли какая-либо внешняя библиотека, которую мне нужно скомпилировать, чтобы добиться цели? или что-то другое ?

Ниже приведен мой код WebviewActivity: -

public class WebviewActivity extends AppCompatActivity {

private static final String TAG = "Main";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_webview);
    //WebView Object
    WebView browser;
    browser=(WebView)findViewById(R.id.webView);
    //Enable Javascript
    browser.getSettings().setJavaScriptEnabled(true);
    //Inject WebAppInterface methods into Web page by having Interface 'Android'
    browser.addJavascriptInterface(new WebAppInterface(this), "Android");
    browser.loadUrl("http://www.somewebsite.com/app/form.html");
}
//Class to be injected in Web page
public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /**
     * Show Toast Message
     * @param toast
     */
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }

    /**
     * Show Dialog
     * @param dialogMsg
     */
    public void showDialog(String dialogMsg){
        AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();

        // Setting Dialog Title
        alertDialog.setTitle("JS triggered Dialog");

        // Setting Dialog Message
        alertDialog.setMessage(dialogMsg);

        // Setting alert dialog icon
        //alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);

        // Setting OK Button
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(mContext, "Dialog dismissed!", Toast.LENGTH_SHORT).show();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }

    /**
     * Intent - Move to next screen
     */
    public void moveToNextScreen(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
        // Setting Dialog Title
        alertDialog.setTitle("Alert");
        // Setting Dialog Message
        alertDialog.setMessage("Are you sure you want to leave to next screen?");
        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton("YES",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        //Move to Next screen

                    }
                });
        // Setting Negative "NO" Button
        alertDialog.setNegativeButton("NO",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // Cancel Dialog
                        dialog.cancel();
                    }
                });
        // Showing Alert Message
        alertDialog.show();
     }
  }
}

форма.html: -

 <html>
 <head>
  <style>
  body{
 background-color: #FA5858;
color:#fff;
  }
input{
background-color: #F7D358;
width: 300px;
padding:10px;
color: #000;
 }
 div#content{
 padding:20px;
 background-color: #F7D358;
  color: #000;
 }
 </style>
 <script type="text/javascript">
  function showAndroidToast(toastmsg) {
    Android.showToast(toastmsg);
   }
 function showAndroidDialog(dialogmsg) {
      Android.showDialog(dialogmsg);
   }
  function moveToScreenTwo() {
    Android.moveToNextScreen();
   }
 </script>
  </head>
  <body>
  <center>
  <h3>Binding JavaScript code to Android code</h3>
      <div id="content">
//some content here
         </div>
     <div>
   Here are few examples:
     </div>
  <div>
       <input type="button" value="Make Toast" onClick="showAndroidToast('Toast made by Javascript')" /><br/>
       <input type="button" value="Trigger Dialog" onClick="showAndroidDialog('This dialog is triggered by Javascript ')" /><br/>
        <input type="button" value="Take me to Next Screen" onClick="moveToScreenTwo()" />
          </div>
      </center>
     </body>
    </html>

У меня есть этот код выше, но он не работает в android-studio, перепробовал все возможности, поэтому, наконец, разместил свой вопрос здесь.

Мое исследование для этого: -

https://developer.android.com/guide/webapps/webview.html
https://developer.android.com/reference/android/webkit/WebView.html
http://stackoverflow.com/questions/4325639/android-calling-javascript-functions-in-webview

person Vikrant    schedule 23.09.2016    source источник


Ответы (2)


В ваших методах внутри класса WebAppInterface отсутствует аннотация @JavascriptInterface.

Ваш класс WebAppInterface должен быть таким,

public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void showToast(String toast) {
    }

    @JavascriptInterface
    public void showDialog(String dialogMsg){
    }

    @JavascriptInterface
    public void moveToNextScreen(){
    }

}

Изменить

Не забудьте ограничить свое приложение API17+ при загрузке веб-контента в WebView, иначе ваше приложение будет уязвимо для атак. Прочитайте комментарий @Robert ниже.

person K Neeraj Lal    schedule 23.09.2016
comment
Вы только что спасли мой день! , Глупая ошибка там .. работает гладко ! . Спасибо, что помог мне, приятель. - person Vikrant; 23.09.2016
comment
Рад, что смог помочь. Удачи :) - person K Neeraj Lal; 23.09.2016
comment
@Vikrant Не забудьте ограничить свое приложение API17+ при загрузке веб-контента в WebView, иначе ваше приложение будет уязвимо для атак. - person Robert; 23.09.2016

Спасибо, это помогло мне. Я сделал рабочий пример: введите здесь описание изображения

вот zip для скачивания:

http://www.mediafire.com/file/xyirbqdf73op7zs/file

https://www.b4x.com/android/forum/threads/webviewextras-send-data-from-webview-to-b4x-from-b4x-to-webview-addjavascriptinterface-callsub.121471/

person And    schedule 22.08.2020
comment
Рад, что этот пост помог вам :) - person Vikrant; 19.06.2021