2016-03-29 12 views
2

Ich entwickle eine Audio-Player-Anwendung, und ich muss feststellen, wenn das Gerät des Benutzers mit Android Auto verbunden ist.Wie erkennen, ob das Telefon mit Android Auto verbunden

Die Anwendung verfügt über einen Alarm, und ich möchte sicherstellen, dass es nicht erlischt, während der Benutzer fährt.

Um festzustellen, ob mein Musik-Service (MediaBrowserService) funktioniert, kann ich einige Flags in onCreate und onDestroy verwenden oder reciver for "com.google.android.gms.car.media.STATUS" action registrieren - aber es ist eine schlechte Idee, weil Wecker jederzeit auslösen kann. Und nicht nur, wenn mein Musik-Service läuft.

Für Alarm und ich verwende AlarmManager und ausstehende Absicht.

Vielleicht jemand mit ähnlichen Problemen konfrontiert?

+0

Haben Sie jemals herausgefunden? – codeman

Antwort

0

Wie Sie bereits erwähnt haben, können Sie einen Empfänger für registrieren und den Status in z. shared preferences.

Wenn die Anwendung den Alarm anzeigen möchte, kann sie den gespeicherten Status überprüfen. Wenn der Status verbunden ist, zeige das alram nicht, ansonsten zeige es an.

Etwas wie:

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(); 
} 

Und wenn der Alarm ausgelöst wird:

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

Hoffnung, das hilft.

+0

Natürlich verstehe ich das. Und das habe ich getan. Wenn mein Dienst läuft, kann ich ihn leicht abfangen und keine Alarme anzeigen. Aber das ist absolut nicht das Problem zu lösen. Dieser Broadcast-Empfänger wird nur ** ausgelöst, wenn mein Dienst gestartet wird. Dieser Empfänger ** benachrichtigt ** nicht, dass Sie das Telefon mit dem Auto-Android-Gerät verbinden, es kommt nur, wenn Ihr Dienst gestartet wurde. Der Dienst wird jedoch nur gestartet, wenn ** der Benutzer ** die Anwendung auf dem Android-Auto-Gerät startet. Aber was ist, wenn Telefon mit dem Android Auto verbunden ist, aber Benutzer die Anwendung nicht startet? Ist es möglich? Sicher möglich. – Sergey

+0

So wird der Dienst nicht starten, Broadcast wird nicht kommen, und in der Alarmzeit habe ich falsch zu denken, dass das Telefon nicht mit dem Android Auto verbunden ist. Das ist ein Problem. Deshalb brauche ich einen Weg, um zu wissen ** nicht über den Start meines Dienstes **, ich brauche eine Möglichkeit, über die Verbindung des Telefons mit dem Auto-Android-Gerät zu wissen. – Sergey

+0

Was geben Sie in Ihrem Service in Ihrer onStartCommand-Methode zurück? Haben Sie versucht, Service # START_STICKY oder Service # START_REDELIVER_INTENT zurückzugeben? – hanif

2

Sie können UIMode überprüfen wie in Beispiel Google:

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; 
    } 
} 

Dann vor Laufalarmprüfung isCarUiMode Ergebnis

+2

hat jemand das getestet? Ich bekomme immer "falsch". – cucko

+0

Ich habe es versucht, und es scheint zu funktionieren, wenn Sie die Überprüfung regelmäßig im Hintergrund wiederholen.Auf diese Weise kann die App Fälle auffangen, in denen das Ereignis "com.google.android.gms.car.media.STATUS" nicht ausgelöst wird, wenn es logisch zu sein scheint (in meinem Fall würde ich nur "com.google" erhalten .android.gms.car.media.STATUS' beim manuellen Navigieren zum Abschnitt 'Media' von Android Auto, bei dem es sich um eine vom Benutzer initiierte Aktion handelt, die _well after_ Auto automatisch verbindet. Scheint nicht ideal, reichte aber aus, um den Überprüfungsprozess von Google zu bestehen. – aroth