在安卓应用中运行JavaScript?

3
有一个网站提供了一些JavaScript,其中包含我需要的信息。通过Android API,是否有一种方法可以使用这个JavaScript来发出它所拥有的所有信息并解析它?以下是JavaScript代码:
<script type="text/javascript" src="http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15"></script>

如果您在HTML文件中运行它,您会注意到它显示从网站检索的图像和文本,我希望在Android应用程序中获取所有这些信息。

答案已编辑,附有 Android 代码! - lelloman
2个回答

2
我不知道你是否可以直接运行JavaScript代码,但是你可以在webview中运行它(可能是一个隐藏的webview),并通过JavaScript接口拦截JavaScript调用,在与webview注入相结合的情况下,我认为你应该能够做到几乎所有你想要的事情。如果需要的话,你还可以下载js源代码,按照你的意愿解析它,然后将其提供给webview。如果你需要更多信息,请让我知道^^
网络上有很多例子,这里有一个exampleanother one 编辑
好的,你不需要真正运行那个JavaScript,解析它就足够了,在Android中实现@T.S.解析方法的工作示例,你只需要在你的清单文件中添加android.permission.INTERNET并设置一个ID为myTextView的文本视图即可运行它。
public class MainActivity extends Activity implements Runnable{
    TextView myTextView;

    public Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){

            String source = (String)msg.obj;                        
            // The index of the item
            int i = 0;

            // We search the data-string from the start
            int position1 = 0;

            // While there are items found, continue
            while(true) {

                // Look for the pattern a[index]={json data};
                String lookFor1 = "a[" + String.valueOf(i) + "]={";
                String lookFor2 = "};";
                position1  = source.indexOf(lookFor1, position1+1);

                // Check if we have a match
                if(position1 > -1) {

                    // Find the end of the match
                    int position2 = source.indexOf(lookFor2, position1);

                    // Get the result
                    String result = source.substring(position1 + lookFor1.length() - 1, position2 + 1);

                    // Increase the index an check if we can find a next item
                    i++;

                    // Print out this row, which is a JSON representation of the data you want
                    Log.e("res",result);
                    try {
                        JSONObject obj = new JSONObject(result);
                        String title = obj.getString("title");
                        String img = obj.getString("img");
                        String src = new JSONObject(img).getString("src");
                        myTextView.append("\ntitle: "+title+"\nimgurl: "+src+"\n");
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                } else {
                    // We haven't found a match, break out of while loop
                    break;
                }
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myTextView = (TextView) findViewById(R.id.myTextView);

        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run() {
        String data = retrieve_data();
        Message msg = handler.obtainMessage();
        msg.obj = data;
        handler.sendMessage(msg);

    }

    private String retrieve_data(){

        String data = "";
        String url = "http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15";
        HttpClient httpclient = new DefaultHttpClient();

        HttpGet request;
        try {
            request = new HttpGet(new URI(url));
            request.addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0");

            HttpResponse response = httpclient.execute(request);
            StatusLine statusLine = response.getStatusLine();
            if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                data = out.toString();
            }
        } catch (URISyntaxException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }



}

1
如果只是用于显示,您可以使用带有自定义样式的WebView。 链接: http://developer.android.com/reference/android/webkit/WebView.html
String html = "<script type='text/javascript' src='http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15'></script>";
String mime = "text/html";
String encoding = "utf-8";

WebView myWebView = (WebView)this.findViewById(R.id.myWebView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);

更新

我写了一个快速且简单的例子,演示如何从那个javascript文件中提取数据:

import java.util.*;
import java.lang.*;
import java.net.*;
import java.io.*;

public class JavascriptToUsableData {

    // Method to get a string from an URL
    // Thanks to https://dev59.com/XW855IYBdhLWcg3weEGJ#4328733
    public static String getText(String url) throws Exception {
        URL website = new URL(url);
        URLConnection connection = website.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                    connection.getInputStream()));

        StringBuilder response = new StringBuilder();
        String inputLine;

        while ((inputLine = in.readLine()) != null) 
            response.append(inputLine);

        in.close();

        return response.toString();
    }

    public static void main (String args[]) throws Exception {

        // Get the data
        String source = JavascriptToUsableData.getText("http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15");

        // The index of the item
        int i = 0;

        // We search the data-string from the start
        int position1 = 0;

        // While there are items found, continue
        while(true) {

            // Look for the pattern a[index]={json data};
            String lookFor1 = "a[" + String.valueOf(i) + "]={";
            String lookFor2 = "};";
            position1  = source.indexOf(lookFor1, position1+1);

            // Check if we have a match
            if(position1 > -1) {

                // Find the end of the match
                int position2 = source.indexOf(lookFor2, position1);

                // Get the result
                String result = source.substring(position1 + lookFor1.length() - 1, position2 + 1);

                // Increase the index an check if we can find a next item
                i++;

                // Print out this row, which is a JSON representation of the data you want
                System.out.println(result);

                // I'm not in an Android environment right now, but there is a JSON reader you can use in Android
                // I think it works somthing like this:
                // resultObj = new JSONObject(result);

                // And then access the data like this:
                // resultObj.getString("title");
                // resultObj.getString("guid");
                // resultObj.getString("img");
                // etc

            } else {
                // We haven't found a match, break out of while loop
                break;
            }
        }
    }
}

它可以被大量优化,当前状态可能不是完全安全的,但它可能会给你一些开始的提示。


不幸的是,这不仅仅是为了显示,我需要获取图像文件和文本数据,并将它们设置到Android控件中... - meds
Comixology网站提供其他提供此数据的方式吗?例如XML? - T.S.
我更新了我的回答,并提供了一个快速示例,展示如何实现你的目标。 - T.S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接