Android как разбирать данные XML в широковещательном приемнике (или сервисе) - PullRequest
0 голосов
/ 22 мая 2019

Сейчас я делаю приложение для уведомлений об автобусе, и мне трудно из-за анализа XML-данных в BroadcastReceiver.(Я самый первый пользователь студии Android)

Я впервые использую широковещательный приемник, чтобы сделать уведомление, когда автобус прибывает на определенную автобусную станцию.Я использую bus api, и он дает мне данные XML.Все было хорошо, когда я анализирую данные XML в Activity, используя asyncTask, но такого рода вещи не работают в Broadcastreceiver.В некоторых постах даже говорится, что широковещательный приемник вреден для асинхронной задачи

Могу ли я спросить, как я могу анализировать данные XML в широковещательном приемнике или услуге?

package com.example.absin.firebasebus;

import android.app.AlarmManager;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import java.util.Calendar;

/**
 * Created by absin on 2019-05-22.
 */

public class alarm_proto extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.temp_alarm);

        Button btn = (Button) findViewById(R.id.alarm_btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Calendar calendar = Calendar.getInstance();

                calendar.set(Calendar.HOUR_OF_DAY, 16);
                calendar.set(Calendar.MINUTE, 26);
                calendar.set(Calendar.SECOND, 30);
                Intent intent = new Intent(getApplicationContext(), Notification_reciver.class);

                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);

                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);



            }

        });
    }
}

Это файл alarm_proto.java, который вызывает широковещательный приемник.

package com.example.absin.firebasebus;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;


/**
 * Created by absin on 2019-05-22.
 */

public class Notification_reciver extends BroadcastReceiver {

    final String TAG ="MainActivity";
    public String dataKey = "vgOxwLDnBL1K%2B0EV%2FG7Yi%2Bge%2BwfXMB66UwEnnmJEUuoej7Zg75Z85lE7wOcYZcysMUq5Sa2VGKzNsczJqzgg9A%3D%3D";
    private String requestUrl;
    ArrayList<station_arrive> list = null;
    station_arrive arrival = null;
    String keyword1="206000472", keyword2="204000021", keyword3="35";
//keyword1= 정류소 아이디, keyword2 = 노선아이디(버스번호), keyword3 =노선의 정류소순번 (노선에서 그 정류소 몇번째에 지나가는지)

    @Override
    public void onReceive(Context context, Intent intent) {

        final PendingResult pendingResult = goAsync();

        AsyncTask<String, Void, String> asyncTask = new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... strings) {

                requestUrl = "http://openapi.gbis.go.kr/ws/rest/busarrivalservice?serviceKey=" +dataKey+ "&stationId=" + keyword1 + "&routeId=" + keyword2 + "&staOrder=" + keyword3;

                try {
            boolean b_predictTime1 = false;
            boolean b_predictTime2 =false;
            boolean b_routeId = false;
            boolean b_stationId = false;


            URL url = new URL(requestUrl);
            InputStream is = url.openStream();
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(new InputStreamReader(is, "UTF-8"));


            int eventType = parser.getEventType();

            while(eventType != XmlPullParser.END_DOCUMENT){
                switch (eventType){
                    case XmlPullParser.START_DOCUMENT:
                        list = new ArrayList<station_arrive>();
                        break;
                    case XmlPullParser.END_DOCUMENT:
                        break;
                    case XmlPullParser.END_TAG:
                        if(parser.getName().equals("busArrivalItem") && arrival != null) {
                            list.add(arrival);
                        }
                        break;
                    case XmlPullParser.START_TAG:
                        if(parser.getName().equals("busArrivalItem")){
                            arrival = new station_arrive();
                        }
                        if (parser.getName().equals("predictTime1")) b_predictTime1 = true;
                        if(parser.getName().equals("predictTime2")) b_predictTime2 = true;
                        if(parser.getName().equals("routeId")) b_routeId = true;
                        if (parser.getName().equals("stationId")) b_stationId = true;

                        break;
                    case XmlPullParser.TEXT:
                        if(b_predictTime1){
                            arrival.setPredictTime1(parser.getText());
                            b_predictTime1 = false;
                        }else if(b_predictTime2) {
                            arrival.setPredictTime2(parser.getText());
                            b_predictTime2 = false;
                        }else if(b_routeId) {
                            arrival.setRouteId(parser.getText());
                            b_routeId = false;
                        } else if(b_stationId) {
                            arrival.setStationId(parser.getText());
                            b_stationId = false;
                        }
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


                pendingResult.finish();
                return null;
            }
        };

        asyncTask.execute();


        station_arrive sub = list.get(0);

        if(sub.getPredictTime1().equals("7")) { //it means firing a notification when the bus will be at the station in 7 minutes.

            NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "default");
            builder.setSmallIcon(R.drawable.ic_buspointer);
            builder.setContentTitle("버스 알람");
            builder.setContentText("제발 되어라 좀 살려줘");
            builder.setAutoCancel(true); //사용자가 눌렀을 때 그냥 노티 날아간다

            Intent intent1 = new Intent(context, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

            builder.setContentIntent(pendingIntent);

            Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_NOTIFICATION);
            builder.setSound(ringtoneUri);

            long[] vibrate = {0, 100, 200, 300};
            builder.setVibrate(vibrate);


            NotificationManager notificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(new NotificationChannel("default", "기본채널", NotificationManager.IMPORTANCE_HIGH));
            notificationManager.notify(1, builder.build());

        }



    }

}

class station_arrive{
    String predictTime1;
    String predictTime2;
    String routeId; // 노선아이디 aka 버스 번호
    String stationId;

    public String getPredictTime1() { return predictTime1; }
    public String getPredictTime2() { return predictTime2; }
    public String getRouteId() { return routeId; }
    public String getStationId() { return stationId;}

    public void setPredictTime1(String predictTime1) { this.predictTime1 = predictTime1; }
    public void setPredictTime2(String predictTime2) { this.predictTime2 = predictTime2; }
    public void setRouteId(String routeId) { this.routeId = routeId; }
    public void setStationId(String stationId) { this.stationId = stationId; }

}

Это Java-файл вещательного приемника.Я использовал goAyscn () после поиска в StackOverflow, и он не работал ...

<response>
<comMsgHeader>
<errMsg>NORMAL SERVICE.</errMsg>
<returnCode>00</returnCode>
</comMsgHeader>
<msgHeader>
<queryTime>2019-05-22 15:50:31.873</queryTime>
<resultCode>0</resultCode>
<resultMessage>정상적으로 처리되었습니다.</resultMessage>
</msgHeader>
<msgBody>
<busArrivalItem>
<flag>PASS</flag>
<locationNo1>4</locationNo1>
<locationNo2>6</locationNo2>
<lowPlate1>0</lowPlate1>
<lowPlate2>0</lowPlate2>
<plateNo1>경기70아1784</plateNo1>
<plateNo2>경기70아1926</plateNo2>
<predictTime1>4</predictTime1>
<predictTime2>6</predictTime2>
<remainSeatCnt1>-1</remainSeatCnt1>
<remainSeatCnt2>-1</remainSeatCnt2>
<routeId>204000021</routeId>
<staOrder>35</staOrder>
<stationId>206000472</stationId>
</busArrivalItem>
</msgBody>
</response>

И это ответ от API!Спасибо заранее @ 1014 *

...