3

在我的Android应用程序中,我使用WebAppInterface从Javascript桥接到Java。Javascript接口,错误“未捕获的错误:NPObject上的调用方法错误”

我的.html文件包含一些运行“Android.canPlay()”的JS;在某些时候。

在我的应用程序中,函数“canPlay()”会触发变量侦听器。

当变量听众火灾,如果条件得到满足,一些文件被重命名(临时文件,已下载一个名为.tmp附加扩展,包括.html文件(所以它是.html.tmp,与原既给出错误)

当时间到来 - 现有的.html在它旁边))

后改名发生,Web视图重新加载(我一直在使用这两种功能,只是“.loadUrl()”尝试重新加载webview中的html文件,我得到的错误:

E/Web Console﹕ Uncaught Error: Error calling method on NPObject. at file:////mnt/sdcard/Download/qwerty/playlists/29/2/index.html:206

第206行是“Android.canPlay()”调用。

注意事项 - 如果我在重新加载webview之前没有重命名文件,而是从运行的后台服务重命名,我没有这个错误(虽然我确实得到了一个关于在WebViewCoreThread)

一些代码:

WebAppInterface

public class WebAppInterface { 
    final Context mContext; 

    WebAppInterface(Context c) { 
     mContext = c; 
    } 

    @JavascriptInterface 
    public void canPlay() 
    { 
     mPlaylistReady.changeState(true); 
    } 
} 

可变监听器(通过监听器类被炒鱿鱼)(一些代码位去除如sharedprefences文件位置)

@Override 
public void onStateChange(boolean state) { 

    if (state) { // true 
      // this finds all the files and removes the .tmp extension 
      fileRenamer.removeTmp(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/qwerty/playlists/")); 

      // reloads the webview 
      WebViewActivity.this.runOnUiThread(new Runnable() { 
       public void run() { 
        webView.loadUrl("file:///" + htmlFile.getAbsolutePath()); 
       } 
      }); 

     } 
    } 
} 

FileRenamer类

public class FileRenamer { 

    public void removeTmp(File directory) 
    { 
     File dir = directory; 
     if(dir.isDirectory()) { 
      for(File child : dir.listFiles()) { 
       String name = child.getName(); 
       String ext = name.substring(name.lastIndexOf('.')); 
       if(ext.equals(".tmp")) { 
        final int lastPeriodPos = name.lastIndexOf('.'); 
        File renamed = new File(dir, name.substring(0, lastPeriodPos)); 
        child.renameTo(renamed); 
       } 
      } 
     } 
    } 

} 
+0

澄清 - canPlay最初从JavaScript开始工作,并且只在重新加载后停止工作? – ksasq

+0

没问题,我通过将文件重命名类转换为AsyncTask来解决了这个问题:) –

回答

0

此错误是由JavaScript抛出,因为Java canPlay()执行过程中发生了异常。

尝试在一个try-catch子句中封装WebAppInterface.canPlay()方法并记录异常以找出可能发生的事情。

除此之外,我试图找到一种方法来在JavaScript上下文中映射异常,但我担心这是不可能的。

相关问题