如何从 Android 中的另一个应用程序启动 Activity
我想从我的 Android 应用程序启动已安装的软件包。我认为可以使用意图,但我没有找到一种方法。有链接吗,哪里可以找到相关信息?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想从我的 Android 应用程序启动已安装的软件包。我认为可以使用意图,但我没有找到一种方法。有链接吗,哪里可以找到相关信息?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(19)
如果您不知道主要活动,则可以使用包名称来启动应用程序。
If you don't know the main activity, then the package name can be used to launch the application.
我知道这个问题已经得到解答,但这是我实现类似内容的方法:
更好的是,这是方法:
删除了重复的代码:
I know this has been answered but here is how I implemented something similar:
Even better, here is the method:
Removed duplicate code:
我找到了解决方案。在应用程序的清单文件中,我找到了包名称:com.package.address 和我要启动的主要活动的名称:MainActivity
以下代码启动该应用程序:
I found the solution. In the manifest file of the application I found the package name: com.package.address and the name of the main activity which I want to launch: MainActivity
The following code starts this application:
在
AndroidManifest.xml
文件中添加您要使用的包:更新
旧 - Java
Add the packages inside
AndroidManifest.xml
file, which you want to use:Updated
Old - Java
根据评论进行编辑
在某些版本中 - 正如评论中所建议的 - 抛出的异常可能会有所不同。
因此,下面的解决方案稍作修改
原始答案
虽然回答得很好,但有一个非常简单的实现可以处理未安装应用程序的情况。我这样做
将“applicationId”替换为您要打开的包,例如 com.google.maps 等。
Edit depending on comment
In some versions - as suggested in comments - the exception thrown may be different.
Thus the solution below is slightly modified
Original Answer
Although answered well, there is a pretty simple implementation that handles if the app is not installed. I do it like this
Replace "applicationId" with the package that you want to open such as com.google.maps, etc.
这是我从我的应用程序启动条形码/二维码扫描仪的示例(如果有人发现它有用)
Here is my example of launching bar/QR code scanner from my app if someone finds it useful
从 API 30 (Android 11) 开始,您可以使用 launchIntentForPackage 接收 nullpointerException
要避免这种情况,您需要将所需的包添加到清单中
这是文档
https://developer.android.com/training/package-visibility
以及中等文章
https://medium.com/androiddevelopers/package-visibility-in-android -11-cc857f221cd9
Starting from API 30 (Android 11) you can receive nullpointerexception with launchIntentForPackage
To avoid this you need to add the needed package to the manifest
Here is documentation
https://developer.android.com/training/package-visibility
And the medium article
https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9
检查应用程序,避免任何崩溃。如果手机中存在该应用程序,则会启动该应用程序,否则会在 Google Play 中搜索。如果手机中没有安装Google Play应用程序,则会通过浏览器在Google Play商店中搜索:
Check for the app, avoiding any crashes. If the app exists in the phone then it will be launched, otherwise it will search in Google Play. If no Google Play app installed in the phone, it will search in the Google Play Store via browser:
如果您想打开另一个应用程序的特定活动,我们可以使用它。
如果您必须需要其他应用程序,您可以显示一个对话框,而不是显示Toast。使用对话框,您可以将用户带到 Play 商店下载所需的应用程序。
If you want to open specific activity of another application we can use this.
If you must need other application, instead of showing Toast you can show a dialog. Using dialog you can bring the user to Play-Store to download required application.
可以使用
Intent.setClassName
根据文档。示例:
要在当前应用程序外部打开它,请在启动意图之前添加此标志。
相关答案此处
It is possible to start an app's activity by using
Intent.setClassName
according to the docs.An example:
To open it outside the current app, add this flag before starting the intent.
A related answer here
这将涵盖所有场景
1.获取包的意图
2.如果意图为空,则将用户重定向到 Playstore
3.如果打开 Playstore 存在问题,则它将在默认浏览器上打开。
对于 Android 11(API 级别 30)或更高版本,在 AndroidManifest.xml 中,
或者简单地我们可以允许所有包(不推荐)
参考
Android 上的包可见性过滤
声明包可见性需求
This will cover all scenarios
1.Get intent for package
2.If intent is null redirect user to playstore
3.If there is an issue with open playstore, then it opens on the default browser.
For Android 11 (API level 30) or higher, in AndroidManifest.xml,
Or simply we can allow for all packages (not recommended)
References
Package visibility filtering on Android
Declaring package visibility needs
如果您知道已安装的包所反应的数据和操作,您只需在启动之前将这些信息添加到您的意图实例中即可。
如果您有权访问其他应用程序的 AndroidManifest,则可以在那里看到所有需要的信息。
If you know the data and the action the installed package react on, you simply should add these information to your intent instance before starting it.
If you have access to the AndroidManifest of the other app, you can see all needed information there.
启动新活动的步骤如下:
1.获取包的意图
2.如果意图为空,则将用户重定向到 Playstore
3.如果意图不为空,则打开活动
Steps to launch new activity as follows:
1.Get intent for package
2.If intent is null redirect user to playstore
3.If intent is not null open activity
传递软件包名称以及您想要在未安装软件包时显示的消息;-)
Pass the package name and the message you want to show if package isn't installed ;-)
尝试下面的代码:
Try code below:
在科特林中
In Kotlin
由于 kotlin 如今变得非常流行,我认为在 Kotlin 中提供一个简单的解决方案也是合适的。
Since kotlin is becoming very popular these days, I think it's appropriate to provide a simple solution in Kotlin as well.
我可能会迟到,但这可以帮助某人。
添加具有所需包名称的启动器并更新
AndroidManifest.xml
文件对于 Android 版本 10 及更高版本,您必须在 AndroidManifest.xml 中添加
标记文件(在应用程序标记之外)。否则getLaunchIntentForPackage()
将返回 nullI may be late for the party, but this could help someone.
Add the launcher with the required package name and update the
AndroidManifest.xml
fileFor Android version 10 and above, you must add the
<queries>
tag in the AndroidManifest.xml file (Outside of the Application tag). OtherwisegetLaunchIntentForPackage()
will return null<queries> <package android:name="com.other.app.id" /> </queries
>