2

在本文之前,我首先查找了這個問題,並發現我沒有得到一個適用的答案對我來說。所以我在這裏:java.lang.RuntimeException:無法啓動接收器xx.xx.ImediateSMSReceiver:java.lang.IllegalArgumentException:上下文不能爲空

我正在開發一個Android應用程序,它應該接收短信並使用短信做各種事情。該應用在一般情況下工作正常,但每次用戶關閉應用或重新啓動手機並在打開應用前收到相關短信,它都會崩潰,並提示「不幸的是,Appname已停止」。請幫助 - 下面是我的接收器類,Logcat和我的清單文件的一部分。

PREFS CLASS

public class Prefs { 

    static Prefs singleton = null; 

    static SharedPreferences preferences; 

    static SharedPreferences.Editor editor; 

    Prefs(Context context) { 
     preferences = PreferenceManager.getDefaultSharedPreferences(context); 
     editor = preferences.edit(); 
    } 

    Prefs(Context context, String name, int mode) { 
     preferences = context.getSharedPreferences(name, mode); 
     editor = preferences.edit(); 
    } 

    public static Prefs with(Context context) { 
     if (singleton == null) { 
      singleton = new Builder(context, null, -1).build(); 
     } 
     return singleton; 
    } 

    public static Prefs with(Context context, String name, int mode) { 
     if (singleton == null) { 
      singleton = new Builder(context, name, mode).build(); 
     } 
     return singleton; 
    } 

    public void save(String key, boolean value) { 
     editor.putBoolean(key, value).apply(); 
    } 

    public void save(String key, String value) { 
     editor.putString(key, value).apply(); 
    } 

    public void save(String key, int value) { 
     editor.putInt(key, value).apply(); 
    } 

    public void save(String key, float value) { 
     editor.putFloat(key, value).apply(); 
    } 

    public void save(String key, long value) { 
     editor.putLong(key, value).apply(); 
    } 

    public void save(String key, Set<String> value) { 
     editor.putStringSet(key, value).apply(); 
    } 

    public boolean getBoolean(String key, boolean defValue) { 
     return preferences.getBoolean(key, defValue); 
    } 

    public String getString(String key, String defValue) { 
     return preferences.getString(key, defValue); 
    } 

    public int getInt(String key, int defValue) { 
     return preferences.getInt(key, defValue); 
    } 

    public float getFloat(String key, float defValue) { 
     return preferences.getFloat(key, defValue); 
    } 

    public long getLong(String key, long defValue) { 
     return preferences.getLong(key, defValue); 
    } 

    public Set<String> getStringSet(String key, Set<String> defValue) { 
     return preferences.getStringSet(key, defValue); 
    } 

    public Map<String, ?> getAll() { 
     return preferences.getAll(); 
    } 

    public void remove(String key) { 
     editor.remove(key).apply(); 
    } 

    public void removeAll(){ 
     editor.clear().apply(); 
    } 

    public void contains(String key){ 
     preferences.contains(key); 
    } 

    private static class Builder { 

     private final Context context; 
     private final int mode; 
     private final String name; 

     public Builder(Context context, String name, int mode) { 
      if (context == null) { 
       throw new IllegalArgumentException("Context must not be null."); 
      } 
      this.context = context.getApplicationContext(); 
      this.name = name; 
      this.mode = mode; 
     } 

     /** 
     * Method that creates an instance of Prefs 
     * 
     * @return an instance of Prefs 
     */ 
     public Prefs build() { 
      if (mode == -1 || name == null) { 
       return new Prefs(context); 
      } 
      return new Prefs(context, name, mode); 
     } 
    } 
} 

短信接收機類

public class ImediateSMSReceiver extends BroadcastReceiver { 
    private static final String TAG = ImediateSMSReceiver.class.getSimpleName(); 

    String amount = ""; 
    String merch = ""; 
    String ref = ""; 
    String date = ""; 
    String time = ""; 
    String account = ""; 
    String balance = ""; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.e(TAG, "Running onReceive from " + TAG); 

     if (intent.hasExtra("pdus")) { 
      Bundle bundle = intent.getExtras(); 
      Object messages[] = (Object[]) bundle.get("pdus"); 
      if (messages != null && !messages.equals("")) { 
       SmsMessage smsMessage[] = new SmsMessage[messages.length]; 
       for (int n = 0; n < messages.length; n++) { 
        smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
       } 

       Log.e(TAG, "Current Number of Messages Length " + messages.length); 

       TemplateReader reader = new TemplateReader(context); 
       String message = smsMessage[0].getMessageBody(); 

       long id = reader.read(message, new Date()); 
       if (id != 0) { 
        NotificationManager notificationManager = new NotificationManager(); 
        notificationManager.SendTransactionNotification(context, (int) id, 
          TransactionFragment.class.getName(), message); 
       } 
       Log.e(TAG, "Message is " + messages); 

      } else { 
       Log.e(TAG, "Message is NULL"); 
      } 
     } 
    } 
} 

logcat的

10-29 12:11:24.747: D/AssetManager(25433): addAssetPath path =/data/app/xx.xx.appname-1/base.apkmapset is 0 
10-29 12:11:24.747: D/AssetManager(25433): addAssetPath path =/data/app/xx.xx.appname-1/base.apk, mapOffset =0 
10-29 12:11:24.747: D/AssetManager(25433): addAssetPath path =/data/app/xx.xx.appname-1/base.apk,elasticAppCookieOffset ={3=0} 
10-29 12:11:24.837: D/InjectionManager(25433): fillFeatureStoreMap xx.xx.appname 
10-29 12:11:24.837: I/InjectionManager(25433): Constructor xx.xx.appname, Feature store :{} 
10-29 12:11:24.837: I/LoadedApk(25433): getClassLoader :dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xx.xx.appname/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] 
10-29 12:11:24.887: E/AndroidRuntime(25433): Process: xx.xx.appname, PID: 25433 
10-29 12:11:24.887: E/AndroidRuntime(25433): java.lang.RuntimeException: Unable to start receiver xx.xx.appname.util.ImediateSMSReceiver: java.lang.IllegalArgumentException: Context must not be null. 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.xtras.Prefs$Builder.<init>(Prefs.java:115) 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.xtras.Prefs.with(Prefs.java:31) 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.util.TemplateReader.createAccountInDB(TemplateReader.java:676) 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.util.TemplateReader.createTransactionInDB(TemplateReader.java:522) 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.util.TemplateReader.createTransaction(TemplateReader.java:500) 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.util.TemplateReader.read(TemplateReader.java:441) 
10-29 12:11:24.887: E/AndroidRuntime(25433): at xx.xx.appname.util.ImediateSMSReceiver.onReceive(ImediateSMSReceiver.java:56) 

清單

<receiver 
android:name=".util.ImediateSMSReceiver" 
android:enabled="true" > 
<intent-filter> 
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
<action android:name="android.intent.action.BOOT_COMPLETED" /> 
<action android:name="android.intent.action.USER_PRESENT" /> 
</intent-filter> 
</receiver> 

回答

1

線Prefs.java 115正在嘗試使用尚未initialised.Seems是在叫Builder

發佈的代碼是沒有問題的關鍵在於真正相關的內部類上下文對象代碼某處TemplateReader或Prefs,你似乎使用錯誤的上下文(使用空的上下文,而不是一個傳入)

+0

哦..感謝您的指針。問題在於我的TemplateReader類。我試圖使用一個字符串,它應該由我的Prefs文件存儲,但ts尚未存在,因此返回null ...謝謝。 –

相關問題