- Forum-Beiträge: 694
01.09.2012, 14:59:06 via Website
01.09.2012 14:59:06 via Website
Das Problem mit diesen Prüfungen ist - man weiß nicht was Google noch so alles einfällt. Eine App die wunderbar unter 2.3.x lief kracht plötzlich unter 3.x runter. Eine andere übersteht noch 3.x stürzt aber unter 4.x ab. Was wird mit 5.x sein?
Das Schlechte: Man weiß nicht ob es einen erwischt. Das Gute: Man kann diese Prüfungen abschalten. Um es vorweg zusagen - ich halte vom Abschalten solcher Prüfungen überhaupt nichts - ich befürworte sie auch nicht. Gleichzeitig muss ich gestehen - ich habe die Abschaltung in jeder App drin. Warum? Ich möchte nicht das meine App beim Benutzer runterkracht nur weil der eine neuere Version auf seinem Gerät hat als die, mit der ich testen kann. Finde ich in den API Neuerungen Hinweise auf Verschärfungen so baue ich die App um und rolle das über einen Update aus. Das der Benutzer der leidtragende ist möchte ich nicht.
Das Problem heißt StrictMode. Man kann diesen auf Activity- oder auch auf App-Ebene abschalten. Man kann auch individuelle Prüfungen abschalten. Hier zeige ich wie man alle Prüfungen für die komplette App abschaltet.
1.) Zunächst muss der API-Level des Projektes auf mindestens API-9, besser API-11 (3.0) gesetzt werden. Ihr wisst wie das geht.
2.) Das Abschalten erfolgt über eine Subclass von Application. Ihr erstellt also eine neue Klasse MyApplication oder erweitert Eure eigene Subclass von Application. Beachtet bitte das der StrictMode ab API-16 zweimal abgeschaltet wird. Android wurde cleverer und schaltet nach Beendigung von Application.onCreate() alle Prüfungen wieder an. Mit dem Handler wird das zweite Abschalten hinter das onCreate() geschoben:
2
3 @Override
4 public void onCreate() {
5 super.onCreate();
6
7 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
8 try {
9 processEnableStrictMode();
10 } catch (Throwable throwable) {
11 }
12 }
13
14 // Kein "else if" da die Policy im onCreate als auch danach gelten soll
15 if (Build.VERSION.SDK_INT >= 16) {
16 new Handler().postAtFrontOfQueue(new Runnable() {
17
18 @Override
19 public void run() {
20 try {
21 processEnableStrictMode();
22 } catch (Throwable throwable) {
23 }
24 }
25 });
26 }
27 }
28
29 private void processEnableStrictMode() {
30 MyStrictModeWrapper.checkAvailable();
31 MyStrictModeWrapper.setThreadPolicy();
32 }
33}
3.) Wenn noch nicht geschehen, tragt diese neue Klasse im Manifest ein:
2 ...
3 android:name="MyApplication" >
4.) Erstellt eine neue Klasse:
2
3 static {
4 try {
5 Class.forName("android.os.StrictMode");
6 } catch (Exception exception) {
7 throw new RuntimeException(exception);
8 }
9 }
10
11 public static void checkAvailable() {
12 }
13
14 @SuppressLint("NewApi")
15 public static void setThreadPolicy() {
16 StrictMode.ThreadPolicy strictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
17 StrictMode.setThreadPolicy(strictModeThreadPolicy);
18 }
19}
Meine Apps: Tankbuch Mobil Pro | GaCoMo for Garmin Connect | Streaming Repeater | Ultraviewer