代码之家  ›  专栏  ›  技术社区  ›  Bajrang Hudda

如何使用JSOUP获取google play store应用程序版本?

  •  0
  • Bajrang Hudda  · 技术社区  · 7 年前

    我正在使用以下代码获取 版本名称 从Google play store中,使用Jsoup获取详细信息,但它引发了一些异常,但最近它运行良好。我不知道现在发生了什么?

    我的代码是-

    public class VersionChecker extends AsyncTask<String, String, String> {
    
        private String newVersion;
    
        @Override
        protected String doInBackground(String... params) {
    
            try {
                newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + ParkwayApplication.getInstance().getPackageName() + "&hl=en")
                        .timeout(30000)
                        .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                        .referrer("http://www.google.com")
                        .get()
                        .select("div[itemprop=softwareVersion]")
                        .first()
                        .ownText();
                Log.d("otherhtml", newVersion);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return newVersion;
        }
    }
    

    注-在上述代码中 选择() 返回大小0,当我调用时 第一个() 它将返回null,这就是为什么会出现null指针异常。

    注意-我不知道为什么它最近在工作为什么现在不工作?

    这是链接I tried this 但没有解决方案。

    我现在使用的库版本-

    compile 'org.jsoup:jsoup:1.8.3'
    

    但我也试过最新的-

    compile 'org.jsoup:jsoup:1.11.3'
    

    下面是我得到的确切错误-

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 
    'java.lang.String org.jsoup.nodes.Element.ownText()' on a null object reference 
       at com.ranosys.parkway.utils.VersionChecker.doInBackground(VersionChecker.java:31)
       at com.ranosys.parkway.utils.VersionChecker.doInBackground(VersionChecker.java:16)
       at android.os.AsyncTask$2.call(AsyncTask.java:295)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
       at java.lang.Thread.run(Thread.java:818) 
    
    2 回复  |  直到 7 年前
        1
  •  6
  •   Norman Klöber    7 年前

    我经常解析来自谷歌的信息。在我看来,不要像这样选择生成的类名。xyOfqd,因为它们经常变化。我更喜欢通过regex搜索常量文本。

    Element element = document.select("div:matchesOwn(^Current Version$)").first().parent().select("span").first();
    String version = element.text();
    

    由于页面已更改,因此获得nullpointer例外。我已经查看了Playstore中的几个应用程序。没有人再将您的div命名为[itemprop=softwareversion]。 你打电话来了。first()为null,因为select()不会返回任何结果。

    如果您需要另一个aproach=)

        2
  •  3
  •   Deven    7 年前

    尝试以下操作:

    public class VersionChecker extends AsyncTask<String, Document, Document> {
    
            private Document document;
    
            @Override
            protected Document doInBackground(String... params) {
    
                try {
                    document = Jsoup.connect("https://play.google.com/store/apps/details?id="+ParkwayApplication.getInstance().getPackageName() +"&hl=en")
                            .timeout(30000)
                            .userAgent("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
                            .get();
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                return document;
            }
    
            @Override
            protected void onPostExecute(Document d) {
                super.onPostExecute(d);
    
                Elements es =  d.body().getElementsByClass("xyOfqd").select(".hAyfc");
                String newVersion = es.get(3).child(1).child(0).child(0).ownText();
                Log.i(TAG, "newVersion==="+newVersion);
            }
        }