2016-12-12 1 views
1

Meine App wurde entwickelt, um den Porträtmodus in Telefonen und Tablets zu verwenden. Ich versuche, Android TV zu unterstützen, für das der Landscape-Modus erforderlich ist. Daher verwendet meine App jetzt unterschiedliche Layouts, je nachdem, ob es sich bei dem Gerät um Android TV handelt oder nicht.Portrait-Modus für Handys/Tablets und Landscape-Modus für Android TV?

Das Problem ist, dass Google Apps von Android TV, die die "Hochformat" -Funktion verwenden, ablehnt. Wie kann ich "Portrait" für Telefone/Tablets beibehalten und nur für TV mit der gleichen APK in die Landschaft wechseln? Ist dies der einzige Weg, um zwei verschiedene APKs zu erstellen? Das möchte ich möglichst vermeiden.

PS. Ich verwende Unity 3D, was einige der undurchsichtigen Lösungen einschränken könnte.

Antwort

1

Sie können den Bildschirmmodus anhand des Codes einstellen, je nachdem, ob das Gerät ein Telefon/Tablet oder ein Fernsehgerät ist.

Der erste Schritt ist zu überprüfen, ob diese App auf einem TV-Gerät oder einem mobilen Gerät läuft. Es gibt keine offizielle API für Android, aber this Post beschreibt, wie dies als ein Plugin mit AndroidJavaClass zu tun.

bool isAndroidTv() 
{ 
    #if !UNITY_ANDROID || UNITY_EDITOR 
    return false; 
    #else 

    AndroidJavaClass unityPlayerJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
    AndroidJavaObject androidActivity = unityPlayerJavaClass.GetStatic<AndroidJavaObject>("currentActivity"); 
    AndroidJavaClass contextJavaClass = new AndroidJavaClass("android.content.Context"); 
    AndroidJavaObject modeServiceConst = contextJavaClass.GetStatic<AndroidJavaObject>("UI_MODE_SERVICE"); 
    AndroidJavaObject uiModeManager = androidActivity.Call<AndroidJavaObject>("getSystemService", modeServiceConst); 
    int currentModeType = uiModeManager.Call<int>("getCurrentModeType"); 
    AndroidJavaClass configurationAndroidClass = new AndroidJavaClass("android.content.res.Configuration"); 
    int modeTypeTelevisionConst = configurationAndroidClass.GetStatic<int>("UI_MODE_TYPE_TELEVISION"); 

    return (modeTypeTelevisionConst == currentModeType); 
    #endif 
} 

Dann können Sie die Ausrichtung Bildschirm mit Screen.orientation ändern, in der Awake Funktion:

void Awake() 
{ 
    bool androidTv = isAndroidTv(); 
    Screen.autorotateToLandscapeLeft = androidTv; 
    Screen.autorotateToLandscapeRight = false; 
    Screen.autorotateToPortrait = !androidTv; 
    Screen.autorotateToPortraitUpsideDown = false; 

    if (androidTv) 
    { 
     Screen.orientation = ScreenOrientation.LandscapeLeft; 
    } 
    else 
    { 
     Screen.orientation = ScreenOrientation.Portrait; 
    } 
} 

Sie dieses Objekt in einem „Game-Controller“ verwenden kann, die früh durch das Skript auszuführen eingerichtet ist Bestelleinstellungen.

Außerdem sollten Sie die Android-Player-Einstellungen so einstellen, dass die Standardausrichtung auf Auto Rotation eingestellt ist.

+0

Muss die "Standardausrichtung" in den Playereinstellungen auf "Auto" eingestellt werden? Wenn ja, ändert das Telefon die Ausrichtung, wenn der Benutzer das Telefon dreht? – Yuyo

+1

** "Muss dazu die" Standardausrichtung "in den Player-Einstellungen auf" Auto "eingestellt werden?" ** Da bin ich mir nicht sicher. Sie können es sofort mit einem Android-Gerät testen, um zu sehen, was passiert. ** "Wenn ja, ändert das Telefon die Ausrichtung, wenn der Benutzer das Telefon dreht?" ** Sie müssen es erneut versuchen, um zu sehen, ob sich das ändert, wenn der Benutzer das Telefon dreht. Wenn das passiert, können Sie meine Lösung [hier] (http://stackoverflow.com/a/38790423/3785314) verwenden, um dieses Problem zu lösen. Rufen Sie diese Funktion einfach auf, nachdem Sie die Ausrichtung festgelegt haben. – Programmer

+0

Perfekt, das scheint zu funktionieren. Vielen Dank! – Yuyo

Verwandte Themen