2013-05-16 5 views
3

Существует веб-сайт, в котором содержится некоторый javascript, который испускает необходимую мне информацию, есть ли способ API-интерфейсов андроидов, чтобы использовать этот javascript для испускания любой информации, которую он имеет, и анализировать через нее?Запуск javascript в приложении для Android?

Это JavaScript:

<script type="text/javascript" src="http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15"></script> 

Если вы запустите его в HTML-файл, который вы заметите, что отображает изображения и текст он извлекает из веб-сайта, я хотел бы получить всю эту информацию в Android-приложение.

+0

Отправлено редактировать android код! – lelloman

ответ

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); 

Update

Я написал быстрый и грязный пример того, как можно извлечь данные из этого файла 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 http://stackoverflow.com/a/4328733/1226267 
    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; 
      } 
     } 
    } 
} 

Это может быть оптимизирован много и, вероятно, не является отказоустойчивым в текущем состоянии, но может дать вам несколько советов о том, как начать.

+0

К сожалению, это не просто для отображения, мне нужно захватить файлы изображений и текстовые данные и установить их в элементы управления андроидами ... – tweetypi

+0

Предоставляет ли сайт comixology какие-либо другие способы предоставления этих данных? Как XML? –

+0

Не только тот javascript, который действительно разочаровывает ... – tweetypi

2

Я не знаю, можете ли вы напрямую запустить javascript-код, но вы можете запустить его в веб-просмотре (возможно, скрытом?) И перехватить вызовы javascript с помощью интерфейса javascript, в сочетании с инъекцией в веб-представление, я думаю вы должны иметь возможность делать почти все, что хотите. Если вам это нужно, вы также можете загрузить источник js, проанализировать его по своему усмотрению и затем подать в веб-представление. Если вы хотите больше информации, дайте мне знать ^^

полотно полно, например в любом случае, здесь example и another one

EDIT
нормально вам не нужно на самом деле запустить этот JavaScript, разбор его достаточно, вот рабочий пример в андроиде, реализующий @TS метод parsing, для его запуска вам просто нужно добавить android.permission.INTERNET в файл манифеста и иметь текстовое представление с установленным идентификатором 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; 
    } 



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