如何使用JSOUP获取Google Play商店应用版本?

时间:2018-04-23 09:31:38

标签: android jsoup

我使用下面的代码从Google Play商店获取 versionName ,使用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;
    }
}

注意 - 在上面的代码中, select()返回大小0,当我调用 first()时,它将返回null,这就是获取空指针的原因例外。

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

以下是我triedthis的链接,但没有解决方案。

我现在使用的这个库版本 -

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 个答案:

答案 0 :(得分:4)

我经常从Google解析信息。在我看来,不要选择生成的类名,如.xyOfqd,因为它们经常会改变。我更喜欢通过正则表达式搜索常量文本。

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

您获得了nullpointer exeption,因为页面已更改。我在Playstore中查看了几个应用程序。没有人将你的div命名为[itemprop = softwareversion]了。 所以你在null上调用.first()因为你的select()不会返回任何结果。

如果你需要另一个aproach =)

答案 1 :(得分:2)

试试这个:

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