Как я могу передать данные о намерениях из приемника вещания в рабочий класс менеджера - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь внедрить рабочий менеджер для обработки данных, полученных от широковещательного приемника, но я не могу передать данные как 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);

            }

        }

    }

Я использую диспетчер работы, чтобы убедиться, что мое приложение может синхронизироватьсявсе полученные сообщения с бэкэндом, даже если пользователь не запустил приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...