这是我正在使用的广播接收器类:
public class AlarmReciever extends BroadcastReceiver {
private Context context;
private String name;
private String description;
@Override
public void onReceive(Context c, Intent intent) {
name = intent.getStringExtra("name");
description = intent.getStringExtra("description");
context = c;
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentText(description)
.setSmallIcon(R.drawable.notificationicon)
.setLights(Color.rgb(78, 155, 222), 1000, 1000)
.setAutoCancel(true)
.setContentTitle(name);
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(1, builder.build());
}
}
我的问题是,当我试图将String extras从意图分配给类型字符串的变量时,我得到了这两个错误:
12-30 20:34:45.224 14614-14614/eli.me.jitterlarm W/Bundle:键名应为String,但值为android.text.SpanableString。已返回默认值。
12-30 20:34:45.224 14614-14614/eli.me.jitterlarm W/Bundle:尝试强制转换生成的内部异常:
java.lang.ClassCastException:android.text。SpanableString不能强制转换为java.lang.String
在android.os.BaseBundle.getString(BaseBundl.java:923)
在android.content.Intent.getStringExtra(Intent.java:5349)
在eli.me.jitterarm.AlarmReciever.onReceive(AlarmReceiver.java:22)
位于android.app.ActivityThread.handleReceiver(ActivityThread.java:2725)
位于android.app.ActivityThread.-wrap14(ActivityThread.java)
位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method。invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(Zygote Init.java:726)
在com.android.internal.os.ZygoteInit.main(Zygote Init.java:616)
12-30 20:34:45.224 14614-14614/eli.me.jitterlarm W/Bundle:键
description应为字符串,但值为
android.text.SpannableString。已返回默认值。
12-30 20:34:45.224 14614-14614/eli.me.jitterlarm W/Bundle:尝试
强制转换生成的内部异常:
java.lang.ClassCastException:android.text。SpanableString不能为
转换为java.lang.String
在android.os.BaseBundle.getString(BaseBundl.java:923)
在android.content.Intent.getStringExtra(Intent.java:5349)
在eli.me.jitterarm.AlarmReciever.onReceive(AlarmReceiver.java:23)
位于android.app.ActivityThread.handleReceiver(ActivityThread.java:2725)
位于android.app.ActivityThread.-wrap14(ActivityThread.java)
位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method。invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(Zygote Init.java:726)
在com.android.internal.os.ZygoteInit.main(Zygote Init.java:616)
我知道getStringExtra的结果是一个SpannableString,但该方法的返回值是一个字符串(在intellij中的autocomplete和文档中都有)。
我在网上浏览了一下,发现你可以通过尝试将其转换为字符串:
name = "" + spannableString;
但当我尝试此操作时,仍然会抛出错误。
我尝试过的另一个解决方案是在“可扩展字符串”上使用.toString()。当我这样做时,应用程序立即终止,抛出的错误表明该方法不能用于字符串对象。这很奇怪。
注意:在调试我的应用程序时,发送的通知不会像上面发布代码那样有标题或描述。当我尝试转换方法时,标题和描述都是“空”。这是什么原因?这两个错误都表示它返回了空变量,而不是所需的标题和描述。
此外,这是我尝试使用广播接收器的代码。我不认为这是问题,但只是以防万一。
public void startAlarm(View view) {
EditText nameInput = (EditText) this.findViewById(R.id.nameInput);
EditText descriptionInput = (EditText) this.findViewById(R.id.descriptionInput);
Intent intent = new Intent(this, AlarmReciever.class);
intent.putExtra("name", nameInput.getText());
intent.putExtra("description", descriptionInput.getText());
PendingIntent pendingIntent = PendingIntent.getBroadcast(
this.getApplicationContext(), 234324243, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent);
}