Android 如何从pdu对象创建SmsMessage,特别是在WorkManager输入数据时,考虑到pdu已创建为字符串

Android 如何从pdu对象创建SmsMessage,特别是在WorkManager输入数据时,考虑到pdu已创建为字符串,android,android-workmanager,pdu,Android,Android Workmanager,Pdu,我正在使用广播接收器拦截传入的消息。我已将意向数据从OnReceive方法传递给WorkManager类。我想从pdu获取SmsMessage,但由于在doWork方法上接收的数据是字符串,甚至pdu对象也是字符串,因此很难从此类pdu创建SmsMessage对象。下面是我的广播接收机代码 if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) { final Bundl

我正在使用广播接收器拦截传入的消息。我已将意向数据从OnReceive方法传递给WorkManager类。我想从pdu获取SmsMessage,但由于在doWork方法上接收的数据是字符串,甚至pdu对象也是字符串,因此很难从此类pdu创建SmsMessage对象。下面是我的广播接收机代码

      if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
           final Bundle data = intent.getExtras();



            if (data != null){
                Data.Builder dataBuilder = new Data.Builder();
                for ( String key : data.keySet()){
                    dataBuilder.putString(key,String.valueOf(data.get(key)));
                    Log.d(TAG, "onReceive:  key:" +key+ " and keyValue "+data.get(key));
                }
                WorkManager mWorkManager = WorkManager.getInstance();
                OneTimeWorkRequest mRequest = new OneTimeWorkRequest
                        .Builder(MessageSyncWorker.class)
                        .setInputData(dataBuilder.build())
                        .build();
                mWorkManager.enqueue(mRequest);

                Log.d(TAG, "onReceive: Data: " +data);

            }

```


This is what am doing 
on the WorkManager class

```
public class MessageSyncWorker extends Worker {

    String sender, timestamp, msgID, text_message;
    private static final String TAG = "MessageSyncWorker";
    private static int counter = 0;
    public MessageSyncWorker(@NonNull Context context,
                             @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        Data inputData = getInputData();
        Log.d(TAG, "doWork: " +" inputdata "+inputData +
                " DataValueMAP "+inputData.getKeyValueMap());

        Bundle extras = new Bundle();
        for (String key : inputData.getKeyValueMap().keySet()) {
//      extras.putString(key,String.valueOf(inputData.getString(key))); //This also works well
            extras.putString(key,inputData.getString(key));
            Log.d(TAG, "doWork: ExtrasKeySet " +extras.keySet());
            Log.d(TAG, "doWork: Extra Extra: "+inputData.getString(key));

        }
        Log.d(TAG, "doWork:  Extras: Tena "+extras);

        processBundleData(extras);

        return Result.success();
    }

    private void processBundleData (Bundle bundle){
        if (bundle !=null){
            Object[] newpdusObj = new Object[] {  bundle.get("pdus") };
            Log.d(TAG, "processBundleData: Bundle "+newpdusObj);
            if (newpdusObj !=null){
                for (int i = 0; i < newpdusObj.length; i++){
                    SmsMessage currentMessage =
                            SmsMessage.createFromPdu((byte[]) newpdusObj[i]);
                    Log.d(TAG, "processBundleData: CurrentSMS "+currentMessage);

                }
            }

        }

    }

```

Below is my logs showing the Exception,
```
2019-10-21 19:53:34.597 2364-2532/com.techweezy.smartsync D/MessageSyncWorker: processBundleData: Bundle [Ljava.lang.Object;@38e5886
2019-10-21 19:53:34.837 2364-2415/com.techweezy.smartsync E/WM-WorkerWrapper: Work [ id=66ed12df-eb08-4714-9360-932ad2280873, tags={ com.techweezy.smartsync.utils.MessageSyncWorker } ] failed because it threw an exception/error
    java.util.concurrent.ExecutionException: java.lang.ClassCastException: java.lang.String cannot be cast to byte[]
        at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
        at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
        at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:290)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to byte[]
        at com.techweezy.smartsync.utils.MessageSyncWorker$override.processBundleData(MessageSyncWorker.java:74)
        at com.techweezy.smartsync.utils.MessageSyncWorker$override.doWork(MessageSyncWorker.java:63)
        at com.techweezy.smartsync.utils.MessageSyncWorker$override.access$dispatch(Unknown Source:119)
        at com.techweezy.smartsync.utils.MessageSyncWorker.doWork(Unknown Source:12)
if(Telephony.Sms.Intents.Sms\u RECEIVED\u ACTION.equals(intent.getAction())){
最终捆绑数据=intent.getExtras();
如果(数据!=null){
Data.Builder-dataBuilder=new Data.Builder();
for(字符串键:data.keySet()){
putString(key,String.valueOf(data.get(key));
Log.d(标记“onReceive:key:”+key+“和keyValue”+data.get(key));
}
WorkManager mWorkManager=WorkManager.getInstance();
OneTimeWorkRequest mRequest=新的OneTimeWorkRequest
.Builder(MessageSyncWorker.class)
.setInputData(dataBuilder.build())
.build();
mWorkManager.enqueue(mRequest);
Log.d(标签“onReceive:Data:”+数据);
}
```
这就是我所做的
关于WorkManager类
```
公共类MessageSyncWorker扩展了Worker{
字符串发送方、时间戳、msgID、文本消息;
私有静态最终字符串标记=“MessageSyncWorker”;
专用静态整数计数器=0;
public MessageSyncWorker(@NonNull上下文,
@非空WorkerParameters(workerParams){
超级(上下文、工作参数);
}
@非空
@凌驾
公共成果工作(){
Data inputData=getInputData();
Log.d(标记“doWork:”+“inputdata”+inputdata+
“DataValueMAP”+inputData.getKeyValueMap());
Bundle extras=新Bundle();
对于(字符串键:inputData.getKeyValueMap().keySet()){
//extras.putString(key,String.valueOf(inputData.getString(key));//这也很有效
putString(key,inputData.getString(key));
Log.d(标记“doWork:ExtrasKeySet”+extras.keySet());
Log.d(标记“doWork:Extra-Extra:”+inputData.getString(key));
}
日志d(标签“doWork:Extras:Tena”+Extras);
processBundleData(附加);
返回Result.success();
}
私有void processBundleData(Bundle Bundle){
if(bundle!=null){
Object[]newpdusObj=newobject[]{bundle.get(“pdus”)};
Log.d(标记“processBundleData:Bundle”+newpdusObj);
if(newpdusObj!=null){
for(int i=0;i