2016-09-23 1 views
3

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

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

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

P.S: - Я использую 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(); 
    } 
    } 
} 

form.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-студии, испробовали все posiblities так наконец, разместил мой вопрос здесь.

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

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 

ответ

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, в противном случае ваше приложение будет уязвимо к атакам. Прочитайте комментарий Роберта ниже.

+0

Вы только что спасли мой день! , Silly ошибка там .. работа гладкий! , Спасибо, что помог мне. – Vikrant

+0

Рад, что я мог помочь. Удачи :) –

+1

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

Смежные вопросы