Intent String - это SpannbleString, но не совсем
Это класс приемника вещания, который я использую:
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 из намерения переменным типа string, я получаю эти две ошибки:
12-30 20: 34: 45.224 14614-14614 / eli.me.jitteralarm W / Bundle: имя ключа ожидаемое String, но значением является android.text.SpannableString. Значение по умолчанию было возвращено. 12-30 20:34:45.224 14614-14614/eli.me.jitteralarm W/Bundle: попытка создать сгенерированное внутреннее исключение: java.lang.ClassCastException: android.text.SpannableString не может быть приведена к java.lang.String на android.os.BaseBundle.getString(BaseBundle.java:923) в android.content.Intent.getStringExtra(Intent.java:5349) в eli.me.jitteralarm.AlarmReciever.onReceive(AlarmReciever.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(ZygoteInit.java:726) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-30 20: 34: 45.224 14614-14614 / eli.me.jitteralarm W / Bundle: описание ключа ожидаемое String, но значением является android.text.SpannableString. Значение по умолчанию было возвращено. 12-30 20:34:45.224 14614-14614/eli.me.jitteralarm W/Bundle: попытка создать сгенерированное внутреннее исключение: java.lang.ClassCastException: android.text.SpannableString не может быть приведена к java.lang.String на android.os.BaseBundle.getString(BaseBundle.java:923) в android.content.Intent.getStringExtra(Intent.java:5349) в eli.me.jitteralarm.AlarmReciever.onReceive(AlarmReciever.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(ZygoteInit.java:726) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Я знаю, что результатом getStringExtra является SpannableString, но возвращаемое значение метода - строка (как при автозаполнении в intellij, так и в документации).
Я просмотрел в интернете и обнаружил, что вы можете преобразовать его в строку, попробовав:
name = "" + spannableString;
Но когда я пытаюсь это сделать, ошибка все равно появляется.
Другое решение, которое я попробовал, - это использовать.toString() для "spannable string". Когда я делаю это, приложение немедленно завершает работу, и выдается ошибка, в которой говорится, что метод нельзя использовать для строкового объекта. Это странно.
ПРИМЕЧАНИЕ. При отладке моего приложения отправляемое уведомление не будет иметь заголовка или описания, как указано выше. Когда я попробовал метод преобразования, оба заголовка и описание были "нулевыми". Что является причиной этого? Обе ошибки говорят о том, что она вернула переменную null вместо желаемого заголовка и описания.
Кроме того, это код, в котором я пытаюсь использовать вещательный приемник. Я не думаю, что это проблема, но на всякий случай вот она.
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);
}
1 ответ
Вам нужно поставить String
значение через Intent
так как nameInput.getText()
вернет редактируемый
public void startAlarm(View view) {
...
intent.putExtra("name", nameInput.getText().toString());
intent.putExtra("description", descriptionInput.getText().toString());
...
}
Это решение, которое сработало для меня:
Bundle extras = getIntent().getExtras();
String contains = new StringBuilder(extras.getCharSequence("contains")).toString();