Я пытаюсь внедрить рабочий менеджер для обработки данных, полученных от широковещательного приемника, но я не могу передать данные как android Bundle, так как при создании моего построителя данных такой опции нет. Ниже приведен мой код:
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onReceive(final Context context, Intent intent) {
if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
final Bundle data = intent.getExtras();
WorkManager mWorkManager = WorkManager.getInstance();
//This line below is where am getting an error, Data cannot resolve
//the android os bundle
Data intentData = new Data.Builder();
builder.put("intentData", data)
.build();
OneTimeWorkRequest mRequest = new OneTimeWorkRequest
.Builder(MessageSyncWorker.class)
.setInputData(intentData )
.build();
mWorkManager.enqueue(mRequest);
Вот как я хочу получать входные данные о работнике
public class MessageSyncWorker extends Worker {
String sender, timestamp, msgID, text_message;
private static String BASE_API_URL= "";
public static final String PREFS_NAME = "server_url";
private static final String TAG = "MessageReceiver";
String DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
SimpleDateFormat formatter =
new SimpleDateFormat(DATE_FORMAT, Locale.getDefault());
private static int counter = 0;
public MessageSyncWorker(@NonNull Context context,
@NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
// on the below line am getting the error inputData cannot be resolved
Data inputData = getInputData();
passReceivedMsg(inputData);
return null;
}
private void passReceivedMsg(final Bundle bundleData) {
if (bundleData !=null ){
try {
final Object[] pdusObj = (Object[]) bundleData.get("pdus");
if (pdusObj != null) {
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage =
SmsMessage.createFromPdu((byte[]) pdusObj[i]);
int msgNo = counter++;
msgID = "SMS_ID_0" + msgNo;
sender = currentMessage.getDisplayOriginatingAddress();
text_message = currentMessage.getDisplayMessageBody();
long timestampMilliseconds = System.currentTimeMillis();
timestamp = formatter.format(timestampMilliseconds);
// msgID = UUID.randomUUID().toString();
String received_message = "You Received message from: " +sender
+ " message: " + text_message
+ " at: " + timestamp;
try {
uploadMessageData();
} catch (JSONException e) {
e.printStackTrace();
Log.d(TAG, "passReceivedMsg: exception "+e.getMessage());
Log.d(TAG, "passReceivedMsg: exception: errorCause "+e.getCause());
}
}
}
}
catch (Exception e){
Log.d(TAG, "onReceive: Error occurred "+e);
}
}
}
Я использую диспетчер работы, чтобы убедиться, что мое приложение может синхронизироватьсявсе полученные сообщения с бэкэндом, даже если пользователь не запустил приложение.