【问题标题】:How to detect whether the phone connected to android auto如何检测手机是否连接到android auto
【发布时间】:2016-03-29 19:51:47
【问题描述】:

我正在开发一个音频播放器应用程序,我需要确定用户的设备何时连接到 Android Auto。

该应用程序具有警报功能,我想确保它不会在用户驾驶时响起。

要确定我的音乐服务 (MediaBrowserService) 是否有效,我可以在 onCreate 和 onDestroy 中使用一些标志,或者注册 reciver for "com.google.android.gms.car.media.STATUS" action - 但这是个坏主意,因为闹钟可以随时触发。不仅在我的音乐服务运行时。

为了报警,我使用AlarmManager 和待定意图。

也许有人遇到过类似的问题?

【问题讨论】:

  • 你有想过这个吗?

标签: java android alarmmanager android-auto


【解决方案1】:

您可以像在谷歌示例中一样检查 UIMode:

https://github.com/googlesamples/android-UniversalMusicPlayer/blob/master/mobile/src/main/java/com/example/android/uamp/utils/CarHelper.java#L106

public static boolean isCarUiMode(Context c) {
    UiModeManager uiModeManager = (UiModeManager) c.getSystemService(Context.UI_MODE_SERVICE);
    if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR) {
        LogHelper.d(TAG, "Running in Car mode");
        return true;
    } else {
        LogHelper.d(TAG, "Running on a non-Car mode");
        return false;
    }
}

然后在运行报警前检查isCarUiMode结果

【讨论】:

  • 有人测试过吗?我总是得到'假'。
  • 我已经尝试过了,如果您在后台定期循环检查,它似乎可以工作。这样做允许应用程序捕获 com.google.android.gms.car.media.STATUS 事件在逻辑上看起来应该触发时没有触发的情况(在我的情况下,我只会在手动导航到 Android Auto 的“媒体”部分时得到com.google.android.gms.car.media.STATUS,这是一个用户发起的操作 Auto实际连接之后发生)。看起来不太理想,但足以通过 Google 的审核流程。
【解决方案2】:

正如您所提到的,您可以为"com.google.android.gms.car.media.STATUS" 注册一个接收者并将状态保存到例如shared preferences.

当应用程序想要显示警报时,它可以检查保存的状态。如果状态为已连接,则不显示警报,否则显示。

类似:

public void onReceive(Context context, Intent intent) {
     String status = intent.getStringExtra("media_connection_status");
     boolean isConnectedToCar = "media_connected".equals(status);
     SharedPreferences sharedPrefs = context.getSharedPreferences(
            "myprefs", Context.MODE_PRIVATE);
     SharedPreferences.Editor editor = sharedPrefs.edit();
     editor.putBoolean("isConnected", isConnectedToCar);
     editor.commit();
}

当触发警报时:

SharedPreferences sharedPrefs = context.getSharedPreferences(
            "myprefs", Context.MODE_PRIVATE);
boolean isConnected = sharedPref.getBoolean("isConnected", false);
if (!isConnected) {
   // Alarm
}

希望对您有所帮助。

【讨论】:

  • 我当然明白。这就是我所做的。如果我的服务正在运行,我可以轻松捕获它并且不显示任何警报。但那绝对解决不了问题。 在启动我的服务时触发此广播接收器。此接收器不会通知您将手机连接到自动 android 设备,它只是在您的服务启动时出现。但只有当用户启动 android-auto 设备上的应用程序时,服务才会启动。但是如果手机连接到android auto,但用户没有启动应用程序怎么办?是否可以?当然可以。
  • 所以Service不会启动,Broadcast也不会来,而且在闹钟时间我错以为手机没有连接到android auto。这是个问题。这就是为什么我需要一种方法来了解不是关于我的服务的启动,我需要一种方法来了解如何将手机连接到自动安卓设备。
  • 在您的服务中,您在 onStartCommand 方法中返回什么?您是否尝试过返回 Service#START_STICKY 或 Service#START_REDELIVER_INTENT?
  • 对于 android auto 没关系。我不覆盖这个方法。启动服务(MediaBrowserService)的时候onStartCommand方法没有被调用(几分钟前我专门重写了这个方法,并运行了应用程序,这个方法还没有被调用)。之前我写过,当手机连接到auto android设备时,android auto绝对没有义务运行我的服务,这是正常的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2010-11-17
相关资源
最近更新 更多