Android 调用第三方 APP
本文导读
- 如果想要在 App 1 中调用 App 2 的 Activity1,则操作流程如下:
- 1)首先被调用的 App 2 中要声明 Activity1 是可以被启动的 或者 Activity 是对外可见的
1.1、声明 Activity1 可以被启动,只需在 AndroidManifest.xml 文件中声明为程序入口即可:
<activity android:name=".Activity1">
<intent-filter>
<!--声明这个活动被用做应用程序的程序入口-->
<action android:name="android.intent.action.MAIN" />
<!--声明应用程序可以通过设备启动器的图标来启动-->
<category android:name="android.intent.category.LAUNCHER" />
</intent-1.2、声明 Activity1 是对外可见的,同样在 AndroidManifest.xml 文件中声明 即可:
<activity
android:name=".Activity1"
android:screenOrientation="portrait"
<!--声明对外可见-->
android:exported="true">
</activity>
2)然后 App 1 要知道App 2 的package Name(包名)——此时 App 2 声明 Activity1 可以被启动。如果 App 2 的 Activity1 不是APP 启动的入口 Activity,即无 “android.intent.category.LAUNCHER ” 属性,此时还需要知道 Activity1 的名称。
启动第三方 APP 的核心代码:
String mPackageName="com.demo.app";
String mActivityName="com.demo.app.Activity1";
Intent intent=new Intent();
intent.setComponent(new ComponentName(mPackageName,mActivityName));
startActivityForResult(intent,1);
- 对 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 的简单理解:
- android.intent.action.MAIN:表明该 Activity 可以作为 APP 入口启动,一个 APP 可以有多个入口,例如微信的主界面(用户点击进入)和微信的支付界面(第三方调用进入)
- android.intent.category.LAUNCHER:表明该 Activity 可在桌面显示(点击APP图标就会触发此Activity)
调用操作
获取系统所有应用信息
- 需求分析:当手机上点击 "开始" 后,控制台输出右侧所示的信息,即手机中已经安装的所有 APP 的包名。
- 布局文件 activity_main.xml 文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/btnStart"android:layout_width="match_parent"android:layout_height="64dp"android:text="开 始" />
</android.support.constraint.ConstraintLayout>
- 主活动 MainActivity.java 文件内容如下:
package com.lct.www.yuan;import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.util.List;
public class MainActivity extends AppCompatActivity {/*** buttonStart:开始按钮*/private Button buttonStart;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindView();}private void bindView() {/*** 为开始按钮绑定但即使事件*/buttonStart = findViewById(R.id.btnStart);buttonStart.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("Wmx Logs::", "开始按钮被点击了 id = " + v.getId() + "线程 = " + Thread.currentThread().getName());/** android.content.pm.PackageManager:包管理器*/final PackageManager packageManager = MainActivity.this.getPackageManager();/**getInstalledPackages(@PackageInfoFlags int flags):返回当前用户在手机上安装的应用包名* flags:0 表示不接受任何参数,其它参数都带有限制* MATCH_UNINSTALLED_PACKAGES:表示即使应用被 uninstall 了,但只要保留了数据,也能被搜出来*/List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES);/*** 循环获取 APP 包名*/if (packageInfoList != null) {for (int i = 0; i < packageInfoList.size(); i++) {String packName = packageInfoList.get(i).packageName;Log.i("Wmx logs::", i + " packageName >>" + packName);}Log.i("Wmx Logs::", "输出结束....");}}});}
}
控制台输出如下:
I/Wmx Logs::: 开始按钮被点击了 id = 2131165218线程 = main
I/Wmx logs::: 0 packageName >>cn.nubia.browser
1 packageName >>com.yulore.framework
2 packageName >>cn.nubia.calculator2.preset
3 packageName >>com.android.providers.telephony
4 packageName >>cn.nubia.presetpackageinstaller
5 packageName >>com.android.providers.calendar
.........................
14 packageName >>cn.nubia.musicpicker.preset
15 packageName >>cn.nubia.alipayauthprovider
16 packageName >>com.android.documentsui
.........................
30 packageName >>cn.nubia.bootanimationinfo
31 packageName >>cn.nubia.setupwizard
32 packageName >>com.qualcomm.qti.auth.fidocryptoservice
.........................
43 packageName >>com.qti.qualcomm.datastatusnotification
44 packageName >>cn.nubia.zbiglauncher.preset
45 packageName >>android
46 packageName >>com.qualcomm.wfd.service
47 packageName >>cn.nubia.neoshare
.........................
50 packageName >>cn.nubia.databackup.........................
- 除了使用 getInstalledPackages 同理也可以使用 getInstalledApplications 方法,如下所示:
PackageManager packageManager = getPackageManager();/**getInstalledApplications(@ApplicationInfoFlags int flags):返回已安装的所有应用程序包的列表* flags:0 表示不接受任何参数,其它参数都带有限制* MATCH_UNINSTALLED_PACKAGES:表示即使应用被 uninstall 了,但只要保留了数据,也能被搜出来*/List<ApplicationInfo> applicationInfoList = packageManager.getInstalledApplications(PackageManager.MATCH_UNINSTALLED_PACKAGES);/*** 循环获取 APP 包名*/if (applicationInfoList != null && applicationInfoList.size() > 0) {for (int i = 0; i < applicationInfoList.size(); i++) {String packageName = applicationInfoList.get(i).packageName;Log.i("Wms logs::", "packageName=" + packageName);}}
- 此时控制台输出,结果是一样的:
I/Wmx Logs::: 开始按钮被点击了 id = 2131165218线程 = main
I/Wms logs::: packageName=cn.nubia.browser
I/Wms logs::: packageName=com.yulore.framework
packageName=cn.nubia.calculator2.preset
packageName=com.android.providers.telephony
.........................
packageName=com.android.wallpapercropper
packageName=cn.nubia.video
packageName=com.quicinc.cne.CNEService
packageName=cn.nubia.musicpicker.preset
packageName=cn.nubia.alipayauthprovider...............................................
常见的有:
com.tencent.mm ——腾讯微信
com.youdao.dict ——网易有道
com.tencent.mobileqq ——腾讯 QQ
com.tencent.news ——腾讯新闻
com.sina.weibo ——微博
com.taobao.trip ——飞猪
启动第三方 APP
- 上面已经知道了如何获取手机中安装好的所有的应用的 包名,因为 Android 应用的包名必须在 Google 上唯一的,所以启动 第三方 APP 最简单方式就是根据它的 包名,核心代码如下:
PackageManager packageManager = getPackageManager(); Intent intent = packageManager.getLaunchIntentForPackage("被启动的包名"); startActivity(intent );
- 此种方式启动时,注意事项如下:
- 当调用的 APP(如下面的yuan)在最前端,被调用的第三方 APP 未启动时,则会被启动到最前端显示
- 当调用的 APP(如下面的yuan)在最前端,被调用的第三方 APP 已经在后台启动时,则会被切换到最前端显示
- 当调用的 APP(如下面的yuan)在后台运行,被调用的第三方 APP 未启动时,则会被启动到最前端显示
- 当调用的 APP(如下面的yuan)在后台运行,被调用的第三方 APP 也在后台运行时,则不会有任何效果
- 效果如下:当点击 "开始按钮"后,启动手机上的微博(包名com.sina.weibo),然后为了对比,启动一个不存在/未安装的 app,此时显示 "启动的 APP 未 安装"
- 布局文件 activity_main.xml 文件仍然采用之前的内容,主活动 MainActivity.java 文件内容更新如下:
package com.lct.www.yuan;import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.util.List;public class MainActivity extends AppCompatActivity {/*** buttonStart:开始按钮*/private Button buttonStart;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindView();}private void bindView() {/*** 为开始按钮绑定但即使事件*/buttonStart = findViewById(R.id.btnStart);buttonStart.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("Wmx Logs::", "开始按钮被点击了 id = " + v.getId() + "线程 = " + Thread.currentThread().getName());/*** 启动手机上 微博 APP (包名 com.sina.weibo)* 故意启动错误一个 com.sina.weibo1 这是不存在的*/startLocalApp("com.sina.weibo");startLocalApp("com.sina.weibo1");}});}/*** 启动本地安装好的第三方 APP* 注意:此种当时启动第三方 APP 时,如果第三方 APP 当时没有运行,则会启动它* 如果被启动的 APP 本身已经在运行,则直接将它从后台切换到最前端** @param packageNameTarget :App 包名、如* 微博 com.sina.weibo、* 微信 com.tencent.mm、* QQ com.tencent.mobileqq、* 腾讯新闻 com.tencent.news*/private void startLocalApp(String packageNameTarget) {if (appIsExist(packageNameTarget)) {PackageManager packageManager = getPackageManager();Intent intent = packageManager.getLaunchIntentForPackage(packageNameTarget);startActivity(intent);} else {Toast.makeText(getApplicationContext(), "启动的 APP 未安装", Toast.LENGTH_SHORT).show();}}/*** 判断本地已经安装好了指定的应用程序包** @param packageNameTarget :App 包名* @return 已安装时返回 true,不存在时返回 false*/private boolean appIsExist(String packageNameTarget) {PackageManager packageManager = getPackageManager();List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES);for (PackageInfo packageInfo : packageInfoList) {String packageNameSource = packageInfo.packageName;if (packageNameSource.equals(packageNameTarget)) {return true;}}return false;}
}
Android 调用第三方 APP相关推荐
- Android调用第三方App Activity
在App A中调用App B的Activity1.需要做两方面的配置. (1)App B要表明,Activity1是对外可见的,或是可以被启动的Activity. 可在AndroidManifest. ...
- Android调用第三方App
参考资料: http://blog.csdn.net/yudajun/article/details/8512970 http://chroya.iteye.com/blog/724804 priva ...
- android qq第三方登录,Android调用第三方QQ登录代码分享
本文为大家分享了调用QQ登录的相关代码,希望对大家有帮助,减少项目开发的时间,具体内容如下 1.去QQ开放平台注册帐号(http://open.qq.com/),为应用申请QQ的APP_ID , 并下 ...
- Android预装第三方app
Android预装第三方app Android.mk device-common.mk Android.mk 解压apk中的lib并对*.so库文件进行整体打包,PRESIGNED使用apk预签名 L ...
- uni-app 唤醒调用第三方app并传参(一 显示调用)
1.离线打包设置 包名: com.xxx.xxxAPP(其实只需要包名就行) 执行activity:io.dcloud.PandoraEntry 2.调用方代码 //判断app是否存在 if(plu ...
- android 安装第三方app,Android识别预装的第三方App方法实例
前言 新买一台手机,里面会有很多App,有的属于系统App,不可卸载,有的属于第三方App,厂商会预装一些常用的或者给了他们广告费的App,这些是可以卸载的. 如果要详细划分,系统App还可根据其路径 ...
- androidAPP调用第三方APP(java.lang.SecurityException: Permission Denial: starting Intent { flg=0x16c70 cm)
在写APP调用时出现的的一个问题,简单记录 1.当前调用的app中代码为: Intent paramAdapterView = new Intent();paramAdapterView.setCom ...
- Android 调用相机APP获取拍照图片和从相册选择图片
源码部分分析 Camera.java → 点我定位,注意研究1134行与2023行的两个方法. 通过源码可以发现,输出的图片有2个分支 如果你没有指定Intent里面的Extra参数,它就返回一个序列 ...
- android 调用第三方应用市场,给自身应用评分
项目需求,设置里面有一个给APP好评,实际上就是调用第三方的应用市场,给自身应用评分. 效果图 实现起来非常简单. <span style="font-size:14px;" ...
最新文章
- python20191031_20191031:Python取反运算详解
- 活动直播丨“2021智源论坛”邀您见证智源三年成绩与展望
- 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)
- tomcat + memcached session manager共享session
- SAP 创业计划 ---之三
- ArrayList和LinkedList(转)
- 如何在Java的特定范围内生成随机整数? [英]How do I generate random integers within a specific range in Java?
- 提高服务器响应时间,如何提高服务器qps
- Linux设备驱动——内核定时器
- Qt交互界面设计探索
- unity商店demo学习:俯视视角RPG游戏
- 【洛谷】3957 跳房子
- 显示器分辨率一直跳_常见屏幕比例与显示器分辨率详解
- 单片机课程设计---篮球记分牌
- Markdown编辑器-初始模板参考
- python 数据分析--数据处理工具Pandas(2)
- 使用python,目前最全的Python使用手册
- 【可信计算】TPM核心功能
- 论文翻译:《Phosvardeep:使用序列信息对磷酸变化的深度学习预测》
- 2021年C证(安全员)考试题库及C证(安全员)多少钱