我在这篇文章之前首先查看了这个问题,并认为我没有得到适用于我的答案。所以我走了:
我正在开发一个Android应用程序,它应该接收短信并使用短信来做各种事情。该应用程序在一般工作正常,但每次用户关闭应用程序或重新启动他们的手机并在打开应用程序之前收到相关的短信,它崩溃给出一条消息“不幸的是,Appname已经停止”。请帮忙 - 下面是我的Receiver Class,Logcat和我的Manifest文件的一部分。
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>
答案 0 :(得分:1)
Prefs.java的第115行正在尝试使用尚未初始化的上下文对象。查看位于名为Builder
发布的代码并不真正相关,因为问题在于TemplateReader或Prefs中的代码,您似乎使用了错误的上下文(使用空上下文而不是传入的上下文)