【问题标题】:How to list installed apps from instant app?如何从即时应用程序中列出已安装的应用程序?
【发布时间】:2018-07-21 05:32:37
【问题描述】:

根据documentation

免安装应用只能发现设备上已安装应用的列表,除非 已安装的应用已让免安装应用发现它们。

还有a way 让即时应用可以发现我们的应用。

但是当我们使用getPackageManager()时,代码会崩溃

错误 = 很遗憾,TheAppName 即时应用已停止。

Logcat 中没有打印任何内容。以下是在调试控制台上打印的,

02/10 22:57:27: Launching instantapp
Side loading instant app.
Side loading instant app.
Launching deeplink: https://myapp.mycompany.com/example.

$ adb shell setprop log.tag.AppIndexApi VERBOSE
$ adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d https://myapp.mycompany.com/example -n "com.google.android.instantapps.supervisor/.UrlHandler"
Waiting for application to come online: com.mycompany.myapp.instantappscanner.test | com.mycompany.myapp.instantappscanner
Waiting for application to come online: com.mycompany.myapp.instantappscanner.test | com.mycompany.myapp.instantappscanner
Waiting for application to come online: com.mycompany.myapp.instantappscanner.test | com.mycompany.myapp.instantappscanner
Could not connect to remote process. Aborting debug session.

代码:

PackageManager packageManager = getPackageManager();
List<ApplicationInfo> packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
}

安卓版本:6.0.1

更新

不打印日志的原因是debugger was not attached to the App。来自 adb 控制台的日志显示:

02-11 21:06:56.347: E/AndroidRuntime(18033): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myapp.aninstantapp/com.mycompany.myapp.aninstantapp.feature.MainActivity}: java.lang.SecurityException: Method class android.content.pm.IPackageManager$Stub$Proxy.getInstalledApplications[int, int] not available to instant apps

Full stack trace

堆栈跟踪显示即时应用程序不允许调用,但如果很少有应用程序自称为discoverable to instant apps,该怎么办?与其抛出异常,方法调用应该返回部分应用列表,其中仅包含那些让即时应用可以发现的应用?


小问题

需要帮助从免安装应用执行以下代码。

List<ApplicationInfo> packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);

抛出异常,

SecurityException: IPackageManager$Stub$Proxy.getInstalledApplications[int, int] not available to instant apps

它不应该引发异常,因为根据文档(上)的支持,可以有很少的应用程序可以让即时应用程序发现它们自己。

【问题讨论】:

  • 您在 logcat 中看到了哪些错误消息?您能否更新您的问题以包含这些内容?
  • 我建议您向 Google 提交您的问题,然后在此处链接到它。这对所有人都有帮助,谢谢! issuetracker.google.com/issues/…
  • 在您的每个命令周围放置 try/catch,看看您是否可以在应用程序关闭之前将异常打印到日志中,请在此处发布日志。
  • @Nilesh,我在使用 O+ 设备(模拟器 Android 版本 8.1 和 8.0.0)的应用程序中看不到崩溃。使用 pre-O 设备时可以看到崩溃。您是否也观察到相同的行为?如果是,我建议您向 Google 公共门户提交错误。
  • @ManmeetP 我在 Android 6 和 7 设备上进行了测试。该应用程序在那里崩溃。您能帮我解决如何向 Google 提交错误吗?

标签: android android-instant-apps


【解决方案1】:

参考 Instant App 文档3.15. Instant Apps 设备实现必须满足以下要求:

  • 目标通过 android:visibleToInstantApps 显式暴露

使 instant app 可见,并支持 Android 8.0

如果我们必须检查 isInstantApp 来自 installed app

如果调用者能够看到免安装应用,

isInstantApp(packageName) 将返回一个有效值 (false)。调用方可以在以下场景中看到免安装应用:

  • 这是即时应用程序
  • 是系统的一部分
  • 持有权限ACCESS_INSTANT_APPS
  • 是系统定义的,默认启动器持有 权限 VIEW_INSTANT_APPS
  • 是即时应用的常规应用 应用程序已建立与公开组件的连接 [eg.边界 到一个服务,开始一个活动,等等......]

    MoreInfo

【讨论】:

  • 感谢您的回答。问题是关于从即时应用程序(我的应用程序)列出已安装的应用程序(不一定是即时应用程序),答案是关于检查应用程序是否是即时的?如果我错了,请纠正我。
  • 查看简短问题更新
  • @Nilesh,我认为目前我们没有其他办法可做。
  • 我们可以使用android:visibleToInstantApps
  • 我们必须将android:visibleToInstantApps 放入已安装应用程序的 manifest.xml 中,我这样做了。但问题是在从免安装应用中列出这些应用(可发现的应用)时。
猜你喜欢
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多