title: Calling Java Method from Javascript in Android Project - PhoneGap
body: <p>I have the following Java Class</p>
  
  <pre><code>package com.phonegap.plugins.video;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.URL;
  import java.net.URLConnection;
  
  import org.json.JSONArray;
  import org.json.JSONException;
  
  import android.content.Context;
  import android.content.Intent;
  import android.content.pm.PackageManager;
  import android.net.Uri;
  
  import org.apache.cordova.api.CallbackContext;
  import org.apache.cordova.api.CordovaPlugin;
  import org.apache.cordova.api.PluginResult;
  
  public class VideoPlayer extends CordovaPlugin {
      private static final String YOU_TUBE = "youtube.com";
      private static final String ASSETS = "file:///android_asset/";
  
      @Override
      public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
      PluginResult.Status status = PluginResult.Status.OK;
      String result = "";
      //this.greatMethod();
      try {
          if (action.equals("playVideo")) {
              playVideo(args.getString(0));
          }
          else {
              status = PluginResult.Status.INVALID_ACTION;
          }
          callbackContext.sendPluginResult(new PluginResult(status, result));
      } catch (JSONException e) {
          callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
      } catch (IOException e) {
          callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION));
      }
      return true;
  }
  
  private void playVideo(String url) throws IOException {
      if (url.contains("bit.ly/") || url.contains("goo.gl/") || url.contains("tinyurl.com/") || url.contains("youtu.be/")) {
          //support for google / bitly / tinyurl / youtube shortens
          URLConnection con = new URL(url).openConnection();
          con.connect();
          InputStream is = con.getInputStream();
          //new redirected url
          url = con.getURL().toString();
          is.close();
      }
  
      // Create URI
      Uri uri = Uri.parse(url);
  
      Intent intent = null;
      // Check to see if someone is trying to play a YouTube page.
      if (url.contains(YOU_TUBE)) {
          // If we don't do it this way you don't have the option for youtube
          uri = Uri.parse("vnd.youtube:" + uri.getQueryParameter("v"));
          if (isYouTubeInstalled()) {
              intent = new Intent(Intent.ACTION_VIEW, uri);
          } else {
              intent = new Intent(Intent.ACTION_VIEW);
              intent.setData(Uri.parse("market://details?id=com.google.android.youtube"));
          }
      } else if(url.contains(ASSETS)) {
          // get file path in assets folder
          String filepath = url.replace(ASSETS, "");
          // get actual filename from path as command to write to internal storage doesn't like folders
          String filename = filepath.substring(filepath.lastIndexOf("/")+1, filepath.length());
  
          // Don't copy the file if it already exists
          File fp = new File(this.cordova.getActivity().getFilesDir() + "/" + filename);
          if (!fp.exists()) {
              this.copy(filepath, filename);
          }
          // change uri to be to the new file in internal storage
          uri = Uri.parse("file://" + this.cordova.getActivity().getFilesDir() + "/" + filename);
  
          //return uri; /*NEED TO RETUNRN THE URI TO THE CALLED TO GIVE THEMENEW LOCATION OF THE FILE CREATED BY THIS CLASS*/
  
          // Display video player
          intent = new Intent(Intent.ACTION_VIEW);
          intent.setDataAndType(uri, "video/mp4");
      } else {
          // Display video player
          intent = new Intent(Intent.ACTION_VIEW);
          intent.setDataAndType(uri, "video/mp4");
      }
  
      this.cordova.getActivity().startActivity(intent);
  
  }
  
  private void copy(String fileFrom, String fileTo) throws IOException {
      // get file to be copied from assets
      InputStream in = this.cordova.getActivity().getAssets().open(fileFrom);
      // get file where copied too, in internal storage.
      // must be MODE_WORLD_READABLE or Android can't play it
      FileOutputStream out = this.cordova.getActivity().openFileOutput(fileTo, Context.MODE_WORLD_READABLE);
  
      // Transfer bytes from in to out
      byte[] buf = new byte[8192];
      int len;
      while ((len = in.read(buf)) &gt; 0)
          out.write(buf, 0, len);
      in.close();
      out.flush();
      out.close();
  }
  
  private boolean isYouTubeInstalled() {
      PackageManager pm = this.cordova.getActivity().getPackageManager();
      try {
          pm.getPackageInfo("com.google.android.youtube", PackageManager.GET_ACTIVITIES);
          return true;
      } catch (PackageManager.NameNotFoundException e) {
          return false;
      }
  }
  
      public String greatMethod(){
        System.out.println("Great Method return");
        return "great";
      }
  }
  </code></pre>
  
  <p>I have following in my config.xml file</p>
  
  <pre><code>&lt;plugin name="VideoPlayer" value="com.phonegap.plugins.video.VideoPlayer"/&gt;
  </code></pre>
  
  <p>I want to call say the 'greatMethod' from the javascript file. how do I do that. calling the play method like following works but calling other methods do not work and the play method is not even in the given class.</p>
  
  <p>WORKS:</p>
  
  <pre><code>window.plugins.videoPlayer.play("file:///android_asset/www/videos/myVideo.mp4")
  </code></pre>
  
  <p>DOES NOT WORK:</p>
  
  <pre><code>alert(window.plugins.videoPlayer.greatMethod());
  </code></pre>
  
  <p>Any help will be much appreciated.</p>