Android Querformat Sperre wird Ignoriert

  • Antworten:12
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 20

09.05.2018, 14:56:40 via Website

Hallo und guten Tag.

Ich habe ein Problem, wo bei ich Hilfe benötige.
Das Problem was ich habe betrift nur Android 7 und aufwärts.
Meine App ist eine Full Screen App die 24/7 im Vordergrund ist und um 3 Uhr Nachts mit dem ganzen System neugestartet. Der Autostart erfolgt über einen BroadcastReceiver der auf "ACTION_BOOT_COMPLETED" wartet. Das Problem ist, dass die App in das Querformat gelangen kann, wenn die App von dort aus gestartet wurde, was sie eigentlich nicht darf.

Die Sperre sieht wie folgt aus :
AndroidManifest.xml:
<activity
....
android:screenOrientation="portrait"
....
/>

MainActivity:
protected void onCreate(Bundle savedInstanceState) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
...
}

Folgende Idee hatte ich:

Das Problem tritt immer auf wenn das Gerät nicht entsperrt ist und die App gestartet wird.
Meine Idee war, das ich erst das Gerät entsperre und dann erst die App starte.

Problem, wenn ich Entsperre, hält das nur solange an bis die App wieder schließt.
Also dann wenn der Receiver fertig ist, was nur kurz ist. Ich weiß leider nicht wie ich die App Komplet entsperre.

Die App Sperre wird wie folgt realisiert:

private static void keygard_disabel(Context context) {
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
}

Der Receiver sieht wie folgt aus:
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
start_app(context);
} else if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
wake_lock(context);// Weckt das Gerät auf.
keygard_disabel(context);
}
}
private static void wake_lock(Context context) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock;
// wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG2");
wakeLock = pm.newWakeLock((PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE), "TAG2");
wakeLock.acquire();
wakeLock.release();
}
....

Ich hoffe ihr könnt mir helfen.

Diskutiere mit!
  • Forum-Beiträge: 20

14.05.2018, 08:34:50 via Website

Kann hier mir echt keiner helfen?

Bitte schreibt irgendetwas ,was euch darüber einfällt.

Es wäre mir echt geholfen.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

14.05.2018, 08:45:18 via Website

Hallo Franken ,

ich habe deine Frage schon einmal gelesen , aber nimm es mir nicht übel, dein "Problem" habe ich nicht verstanden- vielleicht auch Andere nicht.

Das Problem ist, dass die App in das Querformat gelangen kann, wenn die App von dort aus gestartet wurde, was sie eigentlich nicht darf.

Alleine dieser Satz war schon für mich sehr verwirrend, Denn die Orientation kann man
sehr gut in einem Listener abfangen und auch verankern , auch dann später in OnResume.
Oder auch schon schlichtweg in der Manifest verankern.

Desweiteren hat mich das 24/7 stutzig gemacht und dass du für dein Vorhanden keinen Service einsetzt.
Normalerweise ist das auch der falsche Ansatz , gerade bei Android.

Deshalb war ich mir auch nicht sicher , ob du ein Defizit im Verständnis des Systemes an sich hast,
oder Fehler in der Umsetzung der LifeCycles.

Ich weiß leider nicht wie ich die App Komplet entsperre.

Was bedeutet für dich "komplett" ??

— geändert am 14.05.2018, 08:57:28

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 20

14.05.2018, 10:10:49 via Website

Hallo saw00.

Es geht darum das die üblichen Vorgehensweisen nicht funktionieren, wenn die App über den Autostart gestartet werden, nicht funktionieren.

Weder der Manifest Eintrag, noch der Java Eintrag greifen, zumiest ist es bei der Android Version 7 so.

Mit komplett Entsperren meine ich, dass der Sperr Screen zum einen weg ist und zum anderen das sie nicht an einer App gekoppelt ist. Nach ende einer App sollte sperre nicht wider hervorkommen. Als würde ein User die Sperre weg wischen.

Zum Thema das die App 24/7 läuft, muss ich sagen die läuft nicht Hintergrund, die App ist normalerweise das einzige was der User im normal Fall sieht und es wird verhindert an diese umgangen werden kann.
Wenn die App gestartet ist, ist das einschlafe verhalten des Gerätes ebenso gesperrt. Die App kann man sich wie eine Anzeige tafel vorstellen.

Ich hoffe du verstehst jetzt mein Problem.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

14.05.2018, 11:11:32 via Website

Hallo Franken,

wie ich schon vermutet habe , wirfst du leider ein paar Begrifflichkeiten durcheinander.

Es geht darum das die üblichen Vorgehensweisen nicht funktionieren, wenn die App über den Autostart gestartet werden, nicht funktionieren.

Es gibt kein Autostart in dem Sinne . Das geschieht über Broadcasts, wie du es schon teilweise umgesetzt hast. Das hat aber nichts mit der Orientation zu tun .

Ich gehe erst mal auf diesen Punkt ein :

die App ist normalerweise das einzige was der User im normal Fall sieht und es wird verhindert an diese umgangen werden kann.

Das was du willst , ist ein Home-Launcher - keine App ansich.
.

Denn - und nun kommen wir zum nächsten Punkt.

Apps werden nach einer nicht definierten Zeit vom System beendet. Deshalb habe ich den Service angesprochen. Hier solltest du unbedingt mittels Service einen Heartbeat verwenden.
Beim einem Home-Launcher könntest du ggf darauf verzichten - wäre aber trotzdem zu empfehlen.

So wie du dein Runtime-Orientationrequest aufrufst , solltest du nach Möglichkeit dies ggf. in einem AsynTask verzögert umsetzen.
Direkt als Erstes in einem OnCreate bringt dir das nichts - Der UI Thread ist noch nicht fertig und überschreibt dir deinen Request.

Hier aber ein Beispiel , welches definitiv funktioniert.

android:theme="@style/Theme.AppCompat.Light.NoActionBar">
    <activity android:name=".MainActivity" android:screenOrientation="portrait" android:launchMode= "singleInstance"
        android:configChanges="orientation|screenSize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </activity>

Receiver Beispiel :

 <receiver
        android:name=".BroadcastHandler"
        android:enabled="true"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>

Und der Receiver

     public class BroadcastHandler extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
    String action = intent.getAction();
    if (action.equalsIgnoreCase(intent.ACTION_POWER_CONNECTED))
           Toast.makeText(getApplicationContext(), "Power connected", Toast.LENGTH_LONG).show();
     if (action.equalsIgnoreCase(Intent.ACTION_POWER_DISCONNECTED))
        Toast.makeText(getApplicationContext(), "Power gone", Toast.LENGTH_LONG).show();
     if (action.equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED))
        Toast.makeText(getApplicationContext(), "Boot done", Toast.LENGTH_LONG).show();
   }

Und wenn es dann immer noch nicht klappt, hat dein Device die Priorität auf den Sensor vor dem Launcher sitzen. Dann bleibt Dir nur noch ein gerootetes Device und musst an die Build.prop ran.

— geändert am 14.05.2018, 12:42:26

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 20

14.05.2018, 12:47:35 via Website

Hallo swa00,

ich habe, nach deinen beispiel, meine App abgeändert. Leider greift die Orientation leider dennoch nicht, erst wen ich auf den Home Button benutze, greift die Orientation.

Die Funktion setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) wird nach einen Abstand von 3 Sekunden ausgeführt.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

14.05.2018, 13:08:31 via Website

ALso ich habe den obigen Code aus einer derzeit laufenden App kopiert.
Ich vermute , dass du irgendwo noch wo anders einen Fehler machst und das kann ich nicht einsehen , denn die Infos sind dürftig

Für mich stellt sich grundsätzlich die Frage , warum dein Tablet direkt in landscape geht und warum Deine App portrait verlangt . Liegt es quer eingebaut ??

Die Funktion setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) wird nach einen Abstand von 3 Sekunden ausgeführt.

a) Mit welcher Technik denn ? Thread ? AsyncTask ??
b) Schon mal schlichtweg mit einem Button die Funktion ausprobiert (onClick)
c) Reagierts du auf OnResume oder Ähnliches ?

P.S mit einem Launcher brauchst du keine "home-Taste" mehr - ist das Ding vorher im Screensave-Mode ?
d) Was für ein Device ist das denn überhaupt ?
e ) Schon mal mit einem anderen Device ausprobiert ?
f ) Auch mal nur ein Standard Projekt nur zu dieser Funktion gebastelt ?

— geändert am 14.05.2018, 13:41:15

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 20

14.05.2018, 14:39:36 via Website

Hallo swa00,

Für mich stellt sich grundsätzlich die Frage , warum dein Tablett direkt in landscape geht und warum Deine App portrait verlangt.

Die App geht nicht direct in den Modus, erst wenn ich das Tablett quer lege geht es in den landscape Modus.

Es wird Portrait verlangt, um die Möglichkeit zu verwähren, es darf grundsätzlich nicht den Modus gelangen.

a) Mit welcher Technik denn ? Thread ? AsyncTask ??

Mit AsyncTask.

b) Schon mal schlichtweg mit einem Button die Funktion ausprobiert (onClick)

Nein, ich habe es mit Evaluate getestet.

c) Reagierts du auf OnResume oder Ähnliches ?

Nein

ist das Ding vorher im Screensave-Mode ?

Wenn du damit den Sperr-Bildschirm meinst, ja andernfalls, nein.

Was für ein Device ist das denn überhaupt?

Samsung Tablett mit Android 7.1.1

Schon mal mit einem anderen Device ausprobiert ?

Ja mit anderen Samsung Tablett mit Android 7.0.0 wo das selbe auftritt.
Ich habe noch 2 Tabletts, eins mit Android 4.4.4 und eins mit Android 5.1.1, beide haben das Problem nicht.
Alles Samsung Geräte.

Auch mal nur ein Standard Projekt nur zu dieser Funktion gebastelt?

Nein, aber eine Idee, werde ich ausbrobiren.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 20

16.05.2018, 11:05:50 via Website

Hallo nochmal swa00,

Ich habe eine test App erstellt.
Die Test App besteht nur einer Hallo Welt Aktivity, bei dieser App verhält sich, warum auch immer, so wie es sollte.

Auch als ich die App, wie früher über ein Broadcast Receiver starten lies, hat die App sich nicht in den landscape Modus bringen können.

Da ich in meiner App nicht viel anders mache als in der Test App, kann ich nicht nachvollziehen warum das nicht bei meiner App funktioniert.

Der einzige unterschied wo ich sehen kann ist in der App Grandle:

Meine App:

`
apply plugin: 'com.android.application'

android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
useLibrary 'org.apache.http.legacy'

defaultConfig {
    applicationId "com.example.XXX"
    minSdkVersion 16
    targetSdkVersion 27
    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}

dexOptions {
    javaMaxHeapSize "4g"
}

}

dependencies {
implementation files('libs/activation.jar')// compile files
implementation files('libs/additionnal.jar')
implementation files('libs/ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar')
implementation files('libs/mail.jar')
implementation files('libs/zbar.jar')
// compile files('libs/glide-full-4.4.0.jar')

//noinspection GradleDependency
implementation 'com.android.support:support-v4:27.1.0'//compile

implementation 'com.github.woxthebox:draglistview:1.6.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.android.support:multidex:1.0.3'


testImplementation 'junit:junit:4.12'//testCompile
testImplementation 'org.mockito:mockito-core:1.10.19'// Optional -- Mockito framework//testCompile

testImplementation 'com.android.support:support-annotations:27.1.1'//androidTestCompile
testImplementation 'com.android.support.test:runner:1.0.2'
testImplementation 'com.android.support.test:rules:1.0.2'// Optional -- Hamcrest library
testImplementation 'org.hamcrest:hamcrest-library:1.3'
testImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'// Optional -- UI testing with Espresso
testImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'

}
`

Test App:

`apply plugin: 'com.android.application'

android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.nw113.testlaunch"
minSdkVersion 24
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}`

Da ich mit Grandle nicht so überragend auskenne, weis ich nicht wie ich da die Einträge aktualisieren kann, so das alles zusammen passt.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

16.05.2018, 11:58:03 via Website

In so einem Falle : Ausschlussverfahren.

Als Erstes ist mit mir die robotium,mockito & draglist ins Auge gefallen,
Damit würde ich anfangen und die weglassen.

Glide verursacht es nicht.

Warum arbeitest du mit statischen jars und nicht mit repo maven ??
Und warum Multidex ? Nimm mal die Repros und lass multidex weg .

— geändert am 16.05.2018, 11:59:06

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 20

16.05.2018, 16:06:46 via Website

Ich habe robotium, mockito und draglist entfernt, sie waren aber leider nicht die quelle.

Warum arbeitest du mit statischen Jars und nicht mit repo maven ??

Dies hatte leider nicht funktioniert, zu mal ksoap2 etwas aufwendiger erschien, wenn es darum geht.

Multidex war mal notwendig, habe ich auch entfernt, hatte aber auch kein unterschied gemacht.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

16.05.2018, 22:37:48 via Website

Ich muss an dieser Stelle an die anderen Jungs abgeben , da ich nun 14 Tage beruflich ausser Lande bin.

Viel Erfolg

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 20

17.05.2018, 11:59:46 via Website

Dann vielen Dank für deine Hilfe swa00, ich habe das Problem gefunden, scheinst habe ein Fehler beim testen der TestApp gemacht. Es lag scheinst nicht an den Abhängigkeiten, sondern am "disableKeyguard".

Zwar funktioniert die veraltete Funktion noch, aber sie war dafür verantwortlich das "android:screenOrientation="portrait"" nicht funktionierte.

Das habe ich herausgefunden als ich nochmal mit der Test App rum testete.

Dann nochmal Danke, bis mal wieder. :)

Hilfreich?
Diskutiere mit!

Empfohlene Artikel