Android 如何从pdu对象创建SmsMessage,特别是在WorkManager输入数据时,考虑到pdu已创建为字符串
我正在使用广播接收器拦截传入的消息。我已将意向数据从OnReceive方法传递给WorkManager类。我想从pdu获取SmsMessage,但由于在doWork方法上接收的数据是字符串,甚至pdu对象也是字符串,因此很难从此类pdu创建SmsMessage对象。下面是我的广播接收机代码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
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