代码之家  ›  专栏  ›  技术社区  ›  user5554725

额外的意图字符串是SpanbleString,但实际上不是

  •  2
  • user5554725  · 技术社区  · 9 年前

    这是我正在使用的广播接收器类:

    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);
    }
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Linh    9 年前

    你需要把 String 价值通过 Intent 因为 nameInput.getText() 将返回 Editable

    public void startAlarm(View view) {
       ...
       intent.putExtra("name", nameInput.getText().toString());
       intent.putExtra("description", descriptionInput.getText().toString());
       ...
    }
    
        2
  •  0
  •   UkFLSUI    5 年前

    这是对我有效的解决方案:

    Bundle extras = getIntent().getExtras();
    String contains = new StringBuilder(extras.getCharSequence("contains")).toString();