微信是如何判断本机是否有安装某个第三方app h5微信分享 App 的

Android开发笔记(12)
需求场景:
在自己开发的应用程序里,有个跳转到其他应用的按钮,比如分享到“新浪微博”,当点击这个按钮时,先判断手机中是否有安装“新浪微博”这个程序,有则启动“新浪微博”客户端,否则从指定的URL地址进行下载。
简言之,开启其他应用,包名跳转。
1、从一个应用跳转到其他应用要获取什么信息?
need第三方应用的包名,以及下载链接。
2、如何判断本机是否已经安装了该第三方应用?
(1)首先得到该程序的包名;
别人的应用程序我怎么知道他的包名和类名?
- 通过adb里面看程序装的所有应用
- 写一个遍历程序,获取所有已安装的程序,把包名打印出来,新浪微博的包名中应该会带有sina字眼,如 com.sina.weibo
//获取已经安装apk列表
List&PackageInfo& packList = context.getPackageManager().getInstalledPackages(0);
//获得包名PackageInfo.packageName
(2)然后通过PackageManager判断是否存在该包的程序 。
android的每一个apk的activity的包的名字都是唯一的,所以可以通过判断这个activity所在包的名字来判断是不是该Apk已经安装
//以twitter程序为例,假设twitter程序包名为“com.twitter.android”。这时候可用以下代码来判断是否被安装。
//QQ客户端的包名是"com.tencent.mobileqq"
PackageInfo packageI//PackageInfo所在包为android.content.pm
packageInfo = this.getPackageManager().getPackageInfo("com.twitter.android", 0);
} catch (NameNotFoundException e) {
packageInfo =
e.printStackTrace();
if(packageInfo ==null){
System.out.println("没有安装");
System.out.println("已经安装");
例2:可以封装到方法里,操作一样,只是把包名作为参数传入,返回值为布尔类型
private boolean isPkgInstalled(String pkgName) {
PackageInfo packageInfo =
packageInfo = this.getPackageManager().getPackageInfo(pkgName, 0);
} catch (NameNotFoundException e) {
packageInfo =
e.printStackTrace();
if (packageInfo == null) {
3、怎么跳转?
通过隐式intent跳转
例3:PackageManager中有getLaunchIntentForPackage这个方法!
//String pkg代表包名,String download代表下载url
final PackageManager pm = context.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(pkg);
if (null == intent) {//没有获取到intent
if (!TextUtils.isEmpty(downoad)) {//跳转到下载第三方应用界面
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(downoad)));
context.startActivity(intent);
例4:在我们自己的程序中调用其他程序时往往要检查手机有没有安装该软件后再做相应操作,如没有安装,用intent将用户引导至android market去下载该程序,如已安装则打开该程序,并传入参数和调用其功能。
//下面介绍怎么判断手机已安装某程序的方法:
private boolean isAvilible(Context context, String packageName){
final PackageManager packageManager = context.getPackageManager();//获取packagemanager
List& packageInfo& pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息
List&String& pName = new ArrayList&String&();//用于存储所有已安装程序的包名
//从pinfo中将包名字逐一取出,压入pName list中
if(pinfo != null){
for(int i = 0; i & pinfo.size(); i++){
String pn = pinfo.get(i).packageN
pName.add(pn);
return pName.contains(packageName);//判断pName中是否有目标程序的包名,有TRUE,没有FALSE
//下面是调用该方法进行判断后的逻辑:
//已安装,打开程序,需传入参数包名:"com.skype.android.verizon"
if(isAvilible(this, "com.skype.android.verizon")){
Intent i = new Intent();
ComponentName cn = new ComponentName("com.skype.android.verizon",
"com.skype.android.verizon.SkypeActivity");
i.setComponent(cn);
startActivityForResult(i, RESULT_OK);
//未安装,跳转至market下载该程序
Uri uri = Uri.parse("market://details?id=com.skype.android.verizon");//id为包名
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
参考链接:
4、跳转后呢?
//你只需要在A中打开B,并为B设置 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//不做对A的关闭处理finish()
这样就可以了
Intent intent=new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(new ComponentName(objAppClassName, mainActivity));
context.startActivity(intent);
例5:原始跳转方法,要包名和类名(通过ComponentName),后来可以只要包名…
Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。
一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
但是更多的时候,我们一般都不知道应用程序的启动Activity的类名,而只知道包名,我们可以通过ResolveInfo类来取得启动Acitivty的类名。
下面是实现代码:
private void openApp(String packageName) {
PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
List&ResolveInfo& apps = pm.queryIntentActivities(resolveIntent, 0);
ResolveInfo ri = apps.iterator().next();
if (ri != null ) {
String packageName = ri.activityInfo.packageN
String className = ri.activityInfo.
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
5、别人是怎么做的,如:
通过系统提供的getPackageManager()函数获得PackageManager对象,而PackageManager中提供了getInstalledPackages()函数可以获得已经安装的应用程序包,它会返回一个所有已经安装的应用程序的列表。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4068次
排名:千里之外
原创:20篇
(1)(3)(4)(4)(4)(2)(5)(3)微信是如何判断本机是否有安装某个第三方 App 的?
微信的开发者FAQ里面写道:Q:用户使用App发送链接给微信好友,点击该链接信息打开的页面如何知道接收方的手机中是否已安装App?A:微信打开指定页面的时候,会在原链接后加上参数isappinstalled,即[1|0],1为已安装,0为未安装。
Android 我不清楚,单说 iOS。所有 iOS 应用都可以向设备注册并响应一种自定协议,`UIApplication` 的 `-canOpenURL:` 方法可以返回布尔值告诉你当前设备是否支持某个自定协议。所以你只要注册个自定协议,比如 `myscheme:` 然后告诉微信,微信在自己里面检查一下就可以了。有些协议是无法替换的,比如 `http:`。
基本原理如 说的,再根据微信的具体情况补充一点(我这里说的也只是iOS版本的):每个接入微信的应用都需要上他的上注册申请,然后微信会分配一个AppID,这个AppID就是每个接入微信的第三方应用的标识;而接入微信时,需要你把此AppID作为接入应用的URL Scheme,也就是 答案中说的自定协议,那么微信就可以通过检查这个AppID为值的URL Scheme在本机中是否已经注册(通过 UIApplication类中的 canOpenURL 方法),就可以判断出当前设备是否有安装相应的第三方应用了。具体可看微信iOS终端SDK新手使用指南(),里面有提及到相应的步骤。
我查看了一下微信安装时弹出的权限注册列表,但并没有注明读取系统应用和用户自安装应用时需要什么特别的权限。百度了半天,发现读取已安装应用,确实不需要什么特别权限。所以说 就连最普通的应用程序,也都可以自由访问目前系统中的所有应用程序信息,而且过程极其简单,只需要简单的两三行代码就可以搞定:通过系统提供的getPackageManager()函数获得PackageManager对象,而PackageManager中提供了getInstalledPackages()函数可以获得已经安装的应用程序包,它会返回一个所有已经安装的应用程序的列表。(可见这篇文章 )所以说,微信收到应用分享的链接后,会通过几行简单的代码查找本机已安装应用并匹配,然后决定链接后isappinstalled=应该赋1还是0.
通过包名检测系统中是否安装某个应用程序
* 通过包名检测系统中是否安装某个应用程序
* @param context
* @param packageName:应用程序的包名(QB:com.tencent.mtt)
* @return true :
系统中已经安装该应用程序
* @return false : 系统中未安装该应用程序
boolean checkApkExist(Context context, String packageName)
if (packageName == null || "".equals(packageName))
context.getPackageManager().getApplicationInfo(
packageName,PackageManager.GET_UNINSTALLED_PACKAGES);
catch (NameNotFoundException e)
android的设计中个人觉得有一点不足的就是,读取本机上的已安装应用,或是正在运行的应用,可以不在manifest文件中声明权限,可以通过从Context对象获取PackageManager对象,来检索安装过的程序。getPackageManager().getApplicationInfo(packageName, flags)当未发现时会抛出NameNotFoundException,否则返回这个app的信息。上面之所以特别提到这一点不足是因为,可以利用这一点,及安卓上设计的另一个缺陷,做出“钓鱼”程序,详见我的一篇博客:
一般第三方app有时候为了方便通过自身的协议回调到应用都自定义一个scheme,微信通过canOpenURL来监测。
iOS可以自定義URL Scheme。需要注意的是、由於Apple並沒有限制重覆定義這個URL scheme。所以如果當有其他應用使用相同的scheme、則會跳到最先安裝的那一個(這個不肯定是隨機還是會跳到第一個)。然後跳到哪一頁通常是以scheme後面帶著的value來分辨的。比如說Facebook, facebook的scheme是fb、這樣當我在browser裡面打fb://的時候則會打開facebook了、然後fb本身也有處理一些後面帶過來的數據。例如我打fb://profile則會開啟facebook而且跳到我的user’s profile、fb://friends 則會跳到我的friends list這些都是在Application Delegate裡面處理的- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
已有帐号?
无法登录?
社交帐号登录微信是如何判断本机是否有安装某个第三方 App 的_百度知道android/IOS SDK怎么判断用户是否安装了微信/QQ_百度知道

我要回帖

更多关于 第三方app打开微信 的文章

 

随机推荐