如何判断手机上是否装有什么app

我是一名前端,最近做了一个H5,需要用到地图导航,各大地图厂商给web端封装的SDK插件,只有路线规划的功能,没有像地图app里可以实时导航的方法!所以就得引导用户唤醒打开手机上有的地图APP;各大地图厂商都有URI-Schema的方法唤醒其APP,那么现在的问题就是,当你手机没有对应的地图APP时,唤醒会直接跳到App Store或是应用商店,让你下载APP;想让用户的体验更好一点,唤醒地图前首先判断一个手机上有什么地图APP然后遍历出来列表显示让用户选择!
所以所以所以如何判断手机上有什么app,感觉应该是ios 安卓开发者才能判断吧!貌似和我前端没啥个关系;

阅读 9.9k
6 个回答

android可按照包名来判断app是否存在:

方法:

    /*
     * check the app is installed
     */
    private boolean isAppInstalled(Context context, String packagename) {
        PackageInfo packageInfo;
        try {
            packageInfo = context.getPackageManager().getPackageInfo(packagename, 0);
        } catch (PackageManager.NameNotFoundException e) {
            packageInfo = null;
            e.printStackTrace();
        }
        if (packageInfo == null) {
            //System.out.println("没有安装");
            return false;
        } else {
            //System.out.println("已经安装");
            return true;
        }
    }

这是调用,我的是直接调用启动地图。你可以用原生实现一个操作表让用户选择后启动相应的APP。

   if (isAppInstalled(context, "com.autonavi.minimap")) {
        url = "amapuri://poi?sourceApplication=ewpower.com&keywords="+address;
        showToast("启动高德地图");
    }else if (isAppInstalled(context, "com.baidu.BaiduMap")) {
        url = "baidumap://map/geocoder?src=openApiDemo&address="+address;
        showToast("启动百度地图");
    } else {
        showToast("检测到您未安装地图APP,无法开始导航,建议您安装最新版的高德地图或百度地图");
        return;
    }

IOS可用canOpenURL来判断Schema是否存在判断,代码如下:
记得添加 lsapplicationqueriesschemes

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]])
    {
        url = [[NSString stringWithFormat:@"iosamap://poi?sourceApplication=applicationName&name=%@",address]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    }
    else if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]])
    {
        url = [[NSString stringWithFormat:@"baidumap://map/geocoder?address=%@&src=%@",address,@"ewpower.com"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    }else
    {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"检测到您未安装地图APP,无法开始导航,建议您安装最新版的高德地图或百度地图" delegate:self cancelButtonTitle:@"知道啦"otherButtonTitles:nil, nil];
        [alert show];
        return;
    }
    
    NSURL *schema = [NSURL URLWithString:url];
    if ([[UIDevice currentDevice].systemVersion integerValue] >= 10) {
        //iOS10以后,使用新API
        
        [[UIApplication sharedApplication] openURL:schema options:@{} completionHandler:^(BOOL success) { NSLog(@"scheme调用结束"); }];
    } else {
        //iOS10以前,使用旧API
        [[UIApplication sharedApplication] openURL:schema];
    }

虽然可以做到,打开第三方app的方案叫deep-link,是需要app自身支持的,也就是说,这个APP本身如果不支持Deep Link,你的链接就是写出花来,也打不开它。

好吧说多了,回归主题,腾讯地图:http://map.qq.com/m/index/nav...

我觉得你可以扒下来源码试试,最好不要使用打开第三方的方式,用户体验感觉并不好,而且个人觉得不同型号的手机,可能存在不能唤醒的bug,这个到时候可有的哭了,你测试也不可能各款手机、各款系统都试过。

要客户端去判断是否存在,做客户端和js的交互

不要让用户选择。

伪代码:

try{
    open 高德
}catch{
    try{
        open 百度
    }catch{
        ……
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题