【问题标题】:Where is information about default browser stored in Android?Android 中默认浏览器的信息存储在哪里?
【发布时间】:2013-11-16 23:05:07
【问题描述】:

Android 操作系统在哪里存储有关哪个是默认浏览器的信息?例如,如果 Chrome 是我的默认浏览器,那么它应该将这些信息存储在某个地方,对吧?

我拉了

data/data/com.android.browser/shared_prefs/com.android.browser_preferences.xml

另外,我想知道当应用成为任何类型操作的默认应用时,该信息存储在哪里?

但这似乎不包含该信息

是否有任何 adb 命令来获取此信息?

【问题讨论】:

  • 要绕过Complete action using 对话框,您可以指定要启动的应用程序的包名:adb shell am start -a android.intent.action.MAIN com.android.browser 将启动 BrowserActivity。要明确启动此活动,请提供组件名称:adb shell am start -a android.intent.action.VIEW -n com.android.browser/.BrowserActivity。对于android.media.action.VIDEO_CAPTURE,我使用了adb shell am start -a android.media.action.VIDEO_CAPTURE com.android.gallery3d。软件包名称可能因平台而异,因此请务必使用dumpsys activity。

标签: android adb android-browser


【解决方案1】:

Android 使用 Intent 对象在活动之间进行通信。一个活动创建一个指定操作和数据的意图,并将其发送到系统。然后系统确定哪个应用程序最适合响应该意图并将该意图转发给所选应用程序。

例如,检查浏览器的 AndroidManifest.xml 文件,我发现它包含一个 <intent-filter> 条目,该条目指定应该为具有“http”、“https”、“inline”、“ text/html"、"text/plain" 等等。

某些应用程序可能会指定相同的意图过滤器,在这种情况下会发生冲突。例如,有许多 Wikipedia 应用程序为“http://wikipedia.org/”或类似的东西注册了意图过滤器。

当系统遇到冲突时,它会弹出一个对话框,显示“使用完成操作”并包含与意图过滤器匹配的应用程序列表。此时,用户选择应该使用哪个活动,并可选地指示系统记住他们的选择。

在 Wikipedia 示例中,假设用户选择了 Wikipedia 应用程序并选择让系统记住他们的选择。从那时起,系统将始终针对以“http://wikipedia.org/”开头的意图启动 Wikipedia 应用程序。它仍会针对以“http:”开头的意图启动浏览器,因为这些意图与 Wikipedia 应用的意图过滤器不匹配。

至于系统实际将其意图、应用程序和用户偏好列表保存在何处,我无法回答这部分问题。它可能是 Android 内部数据的一部分,并且它的确切位置不是已发布 API 的一部分,并且可能会随时更改,恕不另行通知。可能有一种方法可以告诉系统重置用户首选项,但我不知道如何,即兴发挥。

【讨论】:

  • 如果不使用意图调用和操作,而是使用 adb 如下所示: adb shell am start -a android.intent.action.VIEW -d 192.168.1.160,那么它会弹出“完成操作”使用”对话框。如果我总是选择。它必须将其存储在某个数据库中吗?
  • 我会这么认为。但正如我所说,我不知道那个数据库可能在哪里,我怀疑这是一个内部实现细节。即使您知道 Android 4.x 的答案,但 4.x+1 可能并非如此
  • 好的。我想我问错问题了。我想要做的是,当我调用一个意图时,例如“adb shell am start -a android.media.action.VIDEO_CAPTURE”,它会显示“使用完成操作”框。我不想看到它。我想为特定的 apk 调用该意图。我怎么能尝试 apkname/adb shell am start -a android.media.action.VIDEO_CAPTURE 但它会抛出错误
  • 如果您知道要启动的包的全名,则可以完全绕过该选择器对话框。请看user2558882的评论。
【解决方案2】:

爱德华的回答是完全正确的。不是默认浏览器在保存默认应用程序,系统会。

但是,您可以像这样获取任何 Intent 的默认应用设置:

public static void getDefaultApp(final Context context, final String url) {
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    ComponentName component = i.resolveActivity(context.getPackageManager());
    if (component == null) {
        // no app at all can handle this intent
        // there might be profile restrictions applied since android 4.3
    } else if (component.getPackageName().equals("android")) {
        // there are multiple apps available handling your intent
        // no default app is set, the Chooser will be shown
    } else if (component.getPackageName().equals("com.android.browser")) {
        // the default browser will be shown
        // there might be multiple apps installed handling your intent
        // however the user picked the default browser
    } else if (component.getPackageName().equals("com.android.chrome")) {
        // chrome will handle your intent
        // there are multiple apps installed handling your intent most likely
        // however the user picked this app
    } else {
        // some other app will handle your intent
        // there are multiple apps installed handling your intent most likely
        // however the user picked this app
        Log.d(TAG, "user choice package: " + component.getPackageName());
        Log.d(TAG, "user choice class:   " + component.getClassName());
    }
}

【讨论】:

  • @flx,我很抱歉。由于我不是在 App 级别工作,而是在 ADB 级别工作,所以我知道是否有任何地方可以获取这些信息就足够了。但是对于在应用程序级别工作的人来说,您的答案非常全面和详细。感谢您的信息:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多