Android 在后台检查Play Store以确定设备上是否有可下载的应用程序

Android 在后台检查Play Store以确定设备上是否有可下载的应用程序,android,google-play,Android,Google Play,我知道我可以通过URL链接到Play Store: market://details?id=com.example.appname 我想做的是在后台“ping”此URL,并确定应用程序是否实际可用,然后,我可以根据需要修改我的UI。假设,如果应用程序不可用,则下面的页面包含,例如word错误部分。如果应用程序可用,则不包含此单词 让HTTP访问该URL并搜索错误部分 无错误部分-您的应用可用 否则,它将不可用 像这样: final HttpClient client = new Defau

我知道我可以通过URL链接到Play Store:

market://details?id=com.example.appname

我想做的是在后台“ping”此URL,并确定应用程序是否实际可用,然后,我可以根据需要修改我的UI。

假设,如果应用程序不可用,则下面的页面包含,例如word
错误部分
。如果应用程序可用,则不包含此单词

让HTTP访问该URL并搜索
错误部分

  • 错误部分
    -您的应用可用
  • 否则,它将不可用
像这样:

final HttpClient client = new DefaultHttpClient();  
final String getURL = "http://play.google.com/store/apps/details?id=<package_name>";
final HttpGet get = new HttpGet(getURL);
final HttpResponse responseGet = client.execute(get);  
final HttpEntity resEntityGet = responseGet.getEntity();  
if (resEntityGet != null) 
{  
    final String response = EntityUtils.toString(resEntityGet);
    if (response.indexOf("error-section") == -1)
    {
        // available
    }
    else
    {
        // unavailable
    }
}
final-HttpClient=new-DefaultHttpClient();
最后一个字符串getURL=”http://play.google.com/store/apps/details?id=";
最终HttpGet=newhttpget(getURL);
最终HttpResponse responseGet=client.execute(get);
最终HttpEntity当前设置=responseGet.getEntity();
如果(当前设置!=null)
{  
最终字符串响应=EntityUtils.toString(resEntityGet);
if(response.indexOf(“错误部分”)=-1)
{
//可用
}
其他的
{
//不可用
}
}
私有类URLTest扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
字符串strurl=”https://play.google.com/store/apps/details?id=com.rovio.angrybirdsstarwars.ads.iap";
//弦乐=
// "https://play.google.com/store/apps/details?id=com.rovio.angrybirdsstarwars.ads.iaptest";
////带“test”的假packagename追加
HttpGet HttpGet=新的HttpGet(strurl);
HttpResponse httpresp=httpclient.execute(httpget);
如果(httpresp.getStatusLine().getStatusCode()==HttpStatus.SC\u OK){
Log.e(“找到”、“是”);
}else if(httpresp.getStatusLine().getStatusCode()==HttpStatus.SC\u未找到){
Log.e(“发现”、“否”);
}
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(解析异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}捕获(例外e){
Log.e(“,”);
}
返回null;
}
}
我试过使用正确的和虚假的软件包,如果应用程序不可用,它会给出错误的请求响应;如果应用程序存在,它会给出肯定的(成功200码)。所以请检查一下它,它可能会对你有所帮助

安卓2.2和应用程序最低要求2.3


这看起来很合理。谢谢你。这是个好主意,但没用。我认为Web并不总是基于设备进行过滤(因此所有检查都是有效的-因为网页在Play Store中)。好吧,如果包不存在,您的示例将有效,但是,我希望使用有效的包名进行测试(而不是angrybirds\u测试)。我需要发送一个有效的URL(包含一个包),并让Play Store响应。不幸的是,当我对一个不在Android 2.3上的应用程序(使用我的Nexus One)运行此测试时,我仍然从服务器上得到一个有效的响应(因为URL是有效的-即使该应用程序在服务器上不可用)。需要明确的是-使用假软件包名称不是有效的测试-这需要失败(因为应用程序不在商店中),即使我提供了一个有效的URL。我已经用可用的设备进行了测试,并在有疑问的情况下指定了api级别,在该级别中,您测试过但不起作用…因此用户可以相应地回答。如果应用程序在市场上可用,则给出响应200;如果我传递了市场上不可用的软件包名称,则给出响应404未找到…如果可能,则给出响应404我用运行2.3(CyanogenMod)的NexusOne测试了前面的代码。我身上没带那个装置来检查这细微差别。我希望它能工作,并将再次测试它(这样我就可以奖励奖金,如果适用的话)。仅供参考,使用的类不依赖于设备,因此没有机会解决设备兼容性问题HttpClient HttpGet HttpResponse HttpStatus,AsyncTask:)所有这些都可以从api 1获得。。。不管怎样,从你的角度来检查它。问题不在于源文件,而在于Play Store网站。这是来自Play store的响应,不会因设备而改变(这就是我的问题所在)。
private class URLTest extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            try {
                HttpClient httpclient = new DefaultHttpClient();
                String strurl = "https://play.google.com/store/apps/details?id=com.rovio.angrybirdsstarwars.ads.iap";
                // String strurl =
                // "https://play.google.com/store/apps/details?id=com.rovio.angrybirdsstarwars.ads.iaptest";
                // //fake packagename append with "test"
                HttpGet httpget = new HttpGet(strurl);
                HttpResponse httpresp = httpclient.execute(httpget);
                if (httpresp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    Log.e("Found", "YES");
                } else if (httpresp.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) {
                    Log.e("Found", "NO");
                }

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (Exception e) {
            Log.e("", "");
        }
        return null;
    }

}