2016-04-27 7 views
1

Ich möchte eine einfache statische Methode erstellen, die mir den nächsten geplanten Alarm vom aktuellen Telefon bekommt. Implementiert nicht statisch, in der Main_Activity funktioniert alles wie vorgesehen, aber jetzt in einer separaten Klasse als statische Methode bekomme ich den Fehler: "android.content.Context.getContentResolver()" auf eine Null-Objekt Referenz ".Understanding Android Context: (Null Objektreferenz)

Ich denke, ich verstehe nicht Context gut genug. Ich fand dies: Static way to get 'Context' on Android? aber ich denke nicht, dass es der richtige Weg ist, es hier zu tun, ich denke, ich vermisse gerade etwas, kann jemand helfen?

import android.os.Bundle; 
import android.provider.Settings; 
import android.support.v7.app.AppCompatActivity; 


public class Controller extends AppCompatActivity { 

    private static Controller staticController = new Controller(); 

    /** 
    * Finds out what the next user scheduled alarm is. 
    * 
    * @return (String) next time the user has scheduled an alarm on his device. 
    */ 
    protected static String nextAlarm() { 

     String nextAlarmTime = null; 

     // deprecated method will also detect non native alarm clocks! 
     nextAlarmTime = Settings.System.getString(staticController.getContentResolver(), 
       Settings.System.NEXT_ALARM_FORMATTED); 

     // fallback if deprecated method does not find valid alarm time! 
//  if (nextAlarmTime == null) { 
//   AlarmManager am = (AlarmManager) staticController.getSystemService(Context.ALARM_SERVICE); 
//   AlarmManager.AlarmClockInfo alarmInfo = am.getNextAlarmClock(); 
//   Long alarm_next = alarmInfo.getTriggerTime(); 
//   nextAlarmTime = (new Date(alarm_next)).toString(); 
//  } 

     return nextAlarmTime; 
    } 

    // Do I need onCreate here ? 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 


} 

(ich weiß nicht, ob dies wichtig ist, aber die Controller Klasse atm nicht in der Manifest-Datei als Aktivität enthält. Ich habe gerade eine neue Klasse und von AppCompatActivity erweitert)

+0

Was genau ist 'Controller'? Warum gibst du keinen 'Context' (oder' ContentResolver') als Parameter an 'nextAlarm()'? – CommonsWare

+0

Übergeben Sie den Kontext an einfache Klasse über Konstruktor und verwenden Sie – Haroon

Antwort

1

Was oben in den Kommentaren erwähnt CommonsWare scheint in diesem Zusammenhang richtig zu sein,

Warum sind vorbei Sie keinen Kontext (oder ContentResolver) als Parameter zu Nextalarm()?

Hier ist, was habe ich es zu:

import android.app.AlarmManager; 
import android.content.Context; 
import android.provider.Settings; 
import java.util.Date; 

public class Controller extends { **//does not need to be a Activity any more** 

    /** 
    * Finds out what the next user scheduled alarm is. 
    * 
    * @return (String) next time the user has scheduled an alarm on his device. 
    */ 
    protected static String nextAlarm(Context context) { //**pass Context from other Activity** 

     String nextAlarmTime = null; 

     // deprecated method will also detect non native alarm clocks! 
     nextAlarmTime = Settings.System.getString(context.getContentResolver(), //**reference parameter here** 
       Settings.System.NEXT_ALARM_FORMATTED); 

     // fallback if deprecated method does not find valid alarm time! 
     if (nextAlarmTime == null) { 
      AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // **reference parameter again** 
      AlarmManager.AlarmClockInfo alarmInfo = am.getNextAlarmClock(); 
      Long alarm_next = alarmInfo.getTriggerTime(); 
      nextAlarmTime = (new Date(alarm_next)).toString(); 
     } 

     return nextAlarmTime; 
    } 

} 

Dann einfach einfach über Controller.nextAlarm(this)) in irgendeiner Aktivität genannt.

+0

auch dies: https://tir38.com/archives/1423?utm_source=Android+Weekly&utm_campaign=5d9d6b9604-Android_Weekly_203&utm_medium=email&utm_term=0_4eb677ad19-5d9d6b9604-338020857 –

0

Das ist das Problem : new Controller();. Setzen Sie niemals eine Activity Klasse (oder eine davon abgeleitete Klasse) selbst instanziieren. Nur das System sollte das tun und dadurch alle erforderlichen Felder initialisieren.