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