Android 根据 Url 跳转应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31876841/article/details/88354178

1. 获取到 url

2. 根据 url 类型做处理

schemes

在 Android ,我们可以定义特定的 schemes url. 然后通过代码:

Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);

只要有 app 在 AndroidManifest 中定义了相同的 schemes url ,就能直接跳转。

url

如果是普通的以 http,https,ftp 为开头的 url ,我们则可以直接

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

这个时候,系统会弹出多个选项让用户选择用哪个应用启动。但是如果我们想要直接启动对应的应用呢?

private static Intent handleHttpIntent(String url, String tag) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    ResolveInfo resolveInfo = getResolveInfo(intent, tag);
    if (null != resolveInfo) {
      try {
        intent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
        return intent;
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  private static ResolveInfo getResolveInfo(Intent intent, String tag) {

    List<ResolveInfo> resolveInfos = AppUtil.getApp()
                                            .getPackageManager()
                                            .queryIntentActivities(intent,
                                                                   PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resolveInfos) {
      //use the title or Remotely configured package name to find the target app
      if (resolveInfo.activityInfo.packageName.contains(tag)) {
        return resolveInfo;
      }
    }
    return null;
  }

这种情况,我们就只能获取所有能跳转的应用列表,通过我们远程配置的 tag 来获取指定跳转的应用了。

完整代码

  /**
   * return the intent of start other apps by url intent
   *
   * @param url
   *     url
   * @param tag
   *     Used to pick the specified application among the candidates,
   *     it should be the package name or the key word of the package name
   *
   * @return the intent of the specified app
   */
  public static Intent getCallOtherAppsByUrlIntent(String url, String tag) {
    if (url.startsWith("https") || url.startsWith("http") || url.startsWith("ftp")) {
      return handleHttpIntent(url, tag);
    } else {
      try {
        return Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
      } catch (URISyntaxException e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  private static Intent handleHttpIntent(String url, String tag) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    ResolveInfo resolveInfo = getResolveInfo(intent, tag);
    if (null != resolveInfo) {
      try {
        intent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
        return intent;
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  private static ResolveInfo getResolveInfo(Intent intent, String tag) {

    List<ResolveInfo> resolveInfos = AppUtil.getApp()
                                            .getPackageManager()
                                            .queryIntentActivities(intent,
                                                                   PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resolveInfos) {
      //use the title or Remotely configured package name to find the target app
      if (resolveInfo.activityInfo.packageName.contains(tag)) {
        return resolveInfo;
      }
    }
    return null;
  }


猜你喜欢

转载自blog.csdn.net/qq_31876841/article/details/88354178